摘要:返回對象的字符串數(shù)值或布爾值表示。引用類型構造函數(shù)本身就是一個函數(shù),只不過該函數(shù)是出于創(chuàng)建新對象的目的而定義的。類型創(chuàng)建對象創(chuàng)建示例的方法有兩種第一種是使用操作符后跟構造函數(shù)。第二種是使用對象字面量表示法與是等價的。
1. 基本概念 1.1 數(shù)據(jù)類型 (1)typeof操作符
console.log(typeof null); // “object”
用typeof操作符去監(jiān)測null,得到的類型是object。
原因是null被認為是一個空的對象引用。
function func(){ // do something } console.log(typeof func); // "function"
function雖然不是6大數(shù)據(jù)類型中的一種,但卻可以被typeof操作符監(jiān)測出來。
原因是函數(shù)在ECMAScript中是對象,但函數(shù)確實有一些特殊的屬性,所以需要用typeof來區(qū)分。
var message; console.log(message); // undefined console.log(answer); // 報錯 console.log(typeof message); // undefined console.log(typeof answer); // undefined
聲明后未初始化的變量默認值為undefined,想獲得一個未聲明的變量會報錯,這很好理解。
但是用typeof操作符監(jiān)測聲明后未初始化的變量和一個未聲明的變量都會得到undefined。雖然這兩種變量從技術角度看有本質區(qū)別,但實際上也不可能對它們做任何操作。
所以在聲明變量的時候顯式地初始化是一個好的選擇,這樣監(jiān)測出undefined就知道是未聲明的變量了。
null表示的是一個空對象指針,所以如果一個變量在之后準備保存對象,那么初始化的值為null是最合理的。這樣只要檢查null值就知道是否已經(jīng)保存了一個對象的引用了。
console.log(undefined == null); // true
用相等操作符(=)去比較undefined和null會得到true的結果。
原因是undefined實際上是派生自null。[ 這句話我覺得不用理解, 語言就是這么設計的。 ]
ECMAScript中所有的值都有與2個boolean值對應的值:
數(shù)據(jù)類型 | 轉換為true | 轉換為false |
---|---|---|
Boolean | true | false |
String | 任何非空字符 | 空字符 |
Number | 任何非零數(shù)字值 | 0和NaN |
Object | 任何對象 | null |
Undefined | n/a(不適用) | undefined |
var floatNum1 = 1.; // 解析為1 var floatNum2 = 10.0; // 解析為10
由于保存浮點數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍,因此ECMAScript會不失時機地將浮點數(shù)值轉換為整數(shù)值。
如果小數(shù)點后面沒有跟任何數(shù)字,那么這個數(shù)值就可以作為整數(shù)值來保存。
console.log(0.1 + 0.2); // 0.30000000000000004
浮點數(shù)計算不精確。
基于IEEE754數(shù)值浮點計算產(chǎn)生誤差,原因是計算機會先把0.1和0.2轉化為二進制,再把相加的結果轉化為十進制。在兩次轉化中產(chǎn)生了誤差。
由于內(nèi)存的限制,ECMAScript并不能保存世界上所有的數(shù)值。最小數(shù)值為5e-324,保存在Number.MIN_VALUE中;最大數(shù)值為1.7976931348623157e+308,保存在Number.MAX_VALUE中。如果某次計算的結果得到了一個超出JavaScript數(shù)值范圍的值,那么這個數(shù)值將被自動轉換成特殊的infinity具體來說,如果這個數(shù)值是負數(shù),則會被轉換成-infinity(負無窮),如果這個數(shù)值是正數(shù),則會被轉換成Infinity (正無窮)。
可使用isFinite()函數(shù)來確定一個數(shù)值是不是又窮的。
console.log(NaN == NaN); // false
NaN,即非數(shù)值(Not a Number)是一個特殊的數(shù)值,這個數(shù)值用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤了)。
NaN本身有兩個非同尋常的特點:
首先,任何涉及NaN的操作(例如NaN/10)都會返冋NaN,這個特點在多步計算中有可能導致問題。
其次,NaN與任何值都不相等,包括NaN本身。
這里我們探討一個問題就是任何數(shù)據(jù)除以0只會返回2種結果:1個是NaN,一個是Infinity。
下面看幾個例子:
console.log(0/0); // NaN console.log(true/0); // Infinity console.log(false/0); // NaN console.log("2222"/0); // Infinity console.log(-1/0); // -Inifinity console.log(undefined/0); // NaN console.log(null/0); // NaN
從這幾個例子中可以歸納出幾個結論:
0/0和NaN/0 會得到NaN (例子中false會轉化為0,undefined會轉化成NaN,null會轉化為0, 對象會轉化為NaN[示例中未舉出])
其他任何轉化為數(shù)字不為0的值除以0 都會得到Infinity (正值就是Infinity,負值則為-Infinity)
可用isNaN()函數(shù)來判斷這個參數(shù)是否“不是數(shù)值”。如果這個值不能被轉化成數(shù)值,則返回true。
console.log(isNaN(NaN)); // true console.log(isNaN(10)); // false console.log(isNaN("10")); // false console.log(isNaN("blue")); // true console.log(isNaN(true)); // false
盡管有點兒不可思議,但isNaN()確實也適用于對象。在基于對象調用isNaN()函數(shù)時,會首先調用對象的valueOf()方法,然后確定該方法返回的值是否可以轉換為數(shù)值。如果不能,則基于這個返回值再調用toString()方法,再測試返回值。
有3個方法可以把非數(shù)值轉換為數(shù)值:Number()、parseInt()、parseFloat()
Number()方法轉換規(guī)則:
布爾值:true轉換為1, false轉換為0
數(shù)字值:簡單的傳入傳出
undefined:轉換為NaN
null: 轉換為0
字符串:如果只包含數(shù)字,則會去掉最前面的0轉換為十進制;如果字符串包含有效的十六進制數(shù),則轉換為等值的十進制;空字符串轉換為0;如包含上述格式以外的字符,轉換為NaN
對象:會首先調用對象的valueOf()方法,然后確定該方法返回的值是否可以轉換為數(shù)值。如果不能,則基于這個返回值再調用toString()方法,再測試返回值。
[ 搞懂這個規(guī)則再結合NaN的計算規(guī)則就可以完全理解任何數(shù)值/0的結果 ]
parseInt()計算規(guī)則:
這個方法有第二個參數(shù),是指定進制規(guī)則的。不傳默認為十進制。
parseInt()函數(shù)在轉換字符串時,更多的是看其是否符合數(shù)值模式。它會忽略字符串前面的空格,直至找到第一個非空格字符。如果第一個字符不是數(shù)字字符或者負號,parseInt()就會返冋NaN;也就是說,用parseInt()轉換空字符串會返回NaN(Number()對空字符返回0)。如果第一個字符是數(shù)字字符,parseInt()會繼續(xù)解析第二個字符,直到解析完所有后續(xù)字符或者遇到了一個非數(shù)字字符。
parseFloat()計算規(guī)則:
這個方法只解析十進制。
parseFloat()也是從第一個字符開始解析每個字符。而且也是一直解析到字符串末尾,或者解析到遇見一個無效的浮點數(shù)字字符為止。也就是說,字符串中的第一個小數(shù)點是有效的,而第二個小數(shù)點就是無效的了,因此它后面的字符申將被忽略。
有2個方法可以把非字符串轉換為字符串:toString()、String()
除了undefined和null都可以使用toString()方法,這個方法接受一個參數(shù),可以指定進制規(guī)則。如果可能是undefined或者null,可以用String()方法。
(7)Object對象其實就是一組數(shù)據(jù)和功能的集合。對象可以通過執(zhí)行new操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建。
var o = new Object()
Object的每個實例都具有下列屬性和方法:
Constructor:保存著用于創(chuàng)建當前對象的函數(shù)。對于前面的例子而言,構造函數(shù)(constructor)就是Object()。
hasOwnProperty(propertyName):用于檢查給定的域性在當前對象實例中(而不是在實例的原型中)是否存在。其中,作為參數(shù)的屬性名(propertyName)必須以字符串形式指定(例如:o.hasOwnProperty ("name") )。
isProtocypeOf(object):用于檢査傳人的對象是否是另一個對象的原型。
propertylsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語句來枚舉。與hasOwnProperty ()方法一樣,作為參數(shù)的域性名必須以字符串形式指定。
toLocaleString():返回對象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對應。
toString():返回對象的字符串表示。
valueOf():返回對象的字符串、數(shù)值或布爾值表示。通常與toString()方法的返回值相同。
2. 引用類型構造函數(shù)本身就是一個函數(shù),只不過該函數(shù)是出于創(chuàng)建新對象的目的而定義的。
var person = new Object();2.1 Object類型 (1)創(chuàng)建對象
創(chuàng)建Object示例的方法有兩種:
第一種是使用new操作符后跟Object構造函數(shù)。
var person = new Object();
第二種是使用對象字面量表示法:
var person = { name: "Peggy7", age: 25 }
var person = {}與var person = new Object()是等價的。
(2)訪問對象的屬性訪問對象屬性可以用點表示法和方括號表示法。
person.name person["name"]
兩者看上去沒有區(qū)別,但方括號表示法可以通過變量的訪問屬性,如果屬性名中包含會導致語法錯誤的字符,或者屬性名使用的是關鍵字或保留字,也可以使用方括號表示法。通常,除非使用變量來訪問屬性,否則建議使用點表示法。
2.2 Array類型 (1)創(chuàng)建數(shù)組創(chuàng)建數(shù)字也有兩種方法:
第一種是使用new操作符后跟Array構造函數(shù)。
var colors = new Array(3); var colors2 = new Array("red", "blue", "green");
如果傳入的是數(shù)值則表示創(chuàng)建一個長度為該數(shù)值的數(shù)組,也可直接傳遞數(shù)組中要保存的項。
第二種是使用數(shù)組字面量表示法:
var colors = ["red", "blue", "green"];
數(shù)組的length屬性不光是只讀的。
(2)監(jiān)測數(shù)組Array.isArray()方法可以準確的監(jiān)測出一個值是否是數(shù)組。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/110281.html
摘要:前言一直混跡社區(qū)突然發(fā)現(xiàn)自己收藏了不少好文但是管理起來有點混亂所以將前端主流技術做了一個書簽整理不求最多最全但求最實用。 前言 一直混跡社區(qū),突然發(fā)現(xiàn)自己收藏了不少好文但是管理起來有點混亂; 所以將前端主流技術做了一個書簽整理,不求最多最全,但求最實用。 書簽源碼 書簽導入瀏覽器效果截圖showImg(https://segmentfault.com/img/bVbg41b?w=107...
摘要:文末評論送書,學委會用這個抽獎程序來進行嚴格抽獎,周六晚上點整定時抽獎并視頻公布出來,敬請期待。本文講的函數(shù)值傳遞問題,是寫程序經(jīng)常遇到,特別的是動態(tài)參數(shù)在高級框架中使用很廣泛。 ...
摘要:引用類型對象傳入最小數(shù)和最大數(shù)可返回隨機數(shù),定義數(shù)組,調用可以返回隨機數(shù)組項從中抽取一個幸運項水杯茶杯電腦電源線數(shù)據(jù)線華為恒大冰泉衛(wèi)生紙面向對象理解對象要修改屬性的特性,必須要用是否能修改屬性的值默認不能從對象刪除屬性默認讀取屬 引用類型 -Math對象 Math.min( )、Math.max( )、Math.ceil( )、Math.floor( )、Math.round( )、M...
摘要:只能在不同的時候選用不同的假設和不同的理論來解釋問題,許來西的文章講到科學一定程度上通過放棄一貫性換取了實用性,放棄自洽性換取了它洽性。然而遺憾的是本身只提供了模塊和洋蔥模型的最小封裝。 在寫干貨之前,我想先探(qiang)討(diao)兩個問題,模式的局限性?模式有什么用? 最近看到一篇文章對我啟發(fā)很大,許來西在知乎的回答《哲學和科學有什么關聯(lián)?》,全篇較長,這里摘錄我要引出的一點:...
閱讀 4095·2021-09-22 10:02
閱讀 3435·2019-08-30 15:52
閱讀 3118·2019-08-30 12:51
閱讀 824·2019-08-30 11:08
閱讀 2130·2019-08-29 15:18
閱讀 3157·2019-08-29 12:13
閱讀 3660·2019-08-29 11:29
閱讀 1961·2019-08-29 11:13