JavaScript有所有我們期待的編程語(yǔ)言值類(lèi)型:布爾,數(shù)字,字符串,數(shù)組等。JavaScript中的所有值都有屬性。每個(gè)屬性有一個(gè)鍵(或名字)和一個(gè)值。參考記錄的域(fields of record)。你可以使用點(diǎn)(.
)操作符讀取屬性:
value.propKey
舉個(gè)例子:字符串“abc
”有屬性lenght(長(zhǎng)度)。
> var str = 'abc';
> str.length
3
上面的代碼也可以寫(xiě)成下面這樣:
> 'abc'.length
3
點(diǎn)操作符也可以用來(lái)給屬性賦值:
> var obj = {}; // 空對(duì)象
> obj.foo = 123; // 創(chuàng)建屬性“foo”,設(shè)置它為123
123
> obj.foo
123
你也可以通過(guò)它(.)調(diào)用方法:
> 'hello'.toUpperCase()
'HELLO'
上面,我們?cè)谥怠?code>hello”上面調(diào)用方法 toUpperCase()
。
JavaScript定義了不同值之間的區(qū)別:
兩者之間的主要區(qū)別在于他們是如何被比較的:每一個(gè)對(duì)象有一個(gè)獨(dú)一無(wú)二的標(biāo)志,并且僅和自己相等:
> var obj1 = {}; // 一個(gè)空對(duì)象
> var obj2 = {}; // 另一個(gè)空對(duì)象
> obj1 === obj2
false
> obj1 === obj1
true
相反,所有原始值只要編碼值相同就被認(rèn)為是相同的:
> var prim1 = 123;
> var prim2 = 123;
> prim1 === prim2
true
接下來(lái)的兩節(jié)會(huì)介紹原始值和對(duì)象的更多細(xì)節(jié)。
下面全是原始類(lèi)型值(簡(jiǎn)稱(chēng):原始值
):
true
,false
1736
,1.351
abc
’,”abc
”undefined
,null
原始值的特征:
內(nèi)容
”做比較。
> 3 === 3
true
> 'abc' === 'abc'
true
> var str = 'abc';
> str.foo = 3; // try to create property `foo` ? no effect
> str.foo // unknown property
undefined
(獲取未知屬性總返回undefined
)
所有非原始值(non-primitive)的值都是對(duì)象。最常見(jiàn)的幾種對(duì)象類(lèi)型是:
{ firstName: ‘Jane’, lastName: ‘Doe’ }
上面的對(duì)象有兩個(gè)屬性:firstName
屬性的值是“Jane
”,lastName
屬性的值是“Doe
”。
[ ‘a(chǎn)pple’, ‘banana’, ‘cherry’ ]
上面的數(shù)組有三個(gè)元素,可以通過(guò)數(shù)字索引訪問(wèn)。例如“apple
”的索引是0
.
/^a+b+$/
對(duì)象的特征:
比較的是引用:比較的是標(biāo)識(shí)符,每個(gè)值有自己的標(biāo)識(shí)符。
> {} === {} // 兩個(gè)不同的空對(duì)象
false
> var obj1 = {};
> var obj2 = obj1;
> obj1 === obj2
true
> var obj = {};
> obj.foo = 123;
> obj.foo
123
多少有些不必要,JavaScript有兩個(gè)“無(wú)值(non-values)
”:undefined
和 null
。
undefined的意思是“沒(méi)有值(no value)
”。未初始化的變量是undefined
:
> var foo;
> foo
undefined
讀取不存在的屬性時(shí),將返回undefined
:
> var obj = {}; // 空對(duì)象
> obj.foo
undefined
缺省的參數(shù)也是undefined
:
> function f(x) { return x }
> f()
undefined
null
的意思是“沒(méi)有對(duì)象(no object)
”。它被用來(lái)表示對(duì)象的無(wú)值(參數(shù),鏈上的對(duì)象等)。
通常情況下你應(yīng)該把undefined
和null
看成是等價(jià)的,如果他們代表相同意義的無(wú)值的話(huà)。檢查他們的一種方式是通過(guò)嚴(yán)格比較:
if (x === undefined || x === null) {
...
}
另一種在實(shí)際中使用的方法是認(rèn)為undefined
和 null
都是false:
if (!x) {
...
}
警告:false
,0
,NaN
和 “” 都被當(dāng)作false。
對(duì)象類(lèi)型的實(shí)例Foo(包括內(nèi)建類(lèi)型,例如Array和其他自定義類(lèi)型)從對(duì)象Foo.prototype
上獲取方法。你可以通過(guò)讀取這個(gè)方法的方式(不是調(diào)用)驗(yàn)證這點(diǎn):
> [].push === Array.prototype.push
true
相反,原始類(lèi)型是沒(méi)有類(lèi)型的,所以每個(gè)原始類(lèi)型有一個(gè)關(guān)聯(lián)類(lèi)型,稱(chēng)之為包裝類(lèi)型:
Boolean.prototype
上獲取方法:
> true.toString === Boolean.prototype.toString
true
注意包裝類(lèi)型名字的首字母是大寫(xiě)的B。如果在JavaScript中布爾值的類(lèi)型可以訪問(wèn),那么它可能會(huì)被轉(zhuǎn)換為布爾對(duì)象。
包裝類(lèi)型也有實(shí)例(他們的實(shí)例是對(duì)象),但不常用。相反,包裝類(lèi)型有其他用處:如果你將他們作為函數(shù)調(diào)用,他們可以將值轉(zhuǎn)換為原始類(lèi)型。
> Number('123')
123
> String(true)
'true'
有兩個(gè)操作符可以用來(lái)將值分類(lèi):typeof 主要用于原始值,instanceof 主要用于對(duì)象。 typeof?使用方法如下:
typeof ?value?
typeof
返回描述 value
“類(lèi)型
”的一個(gè)字符串。例如:
> typeof true
'boolean'
> typeof 'abc'
'string'
> typeof {} // 空對(duì)象字面量
'object'
> typeof [] // 空數(shù)組字面量
'object'
下面列出了typeof操作的所有結(jié)果:
操作數(shù) | 結(jié)果 |
---|---|
undefined | undefined |
null | object |
Boolean value | boolean |
Number value | number |
String value | string |
Function | function |
All other values | object |
有兩個(gè)結(jié)果和我們上面說(shuō)的的原始值與對(duì)象是矛盾的:
function
”而不是“object
”。鑒于函數(shù)(類(lèi)型 為“function
”)是對(duì)象(類(lèi)型是對(duì)象)的子類(lèi)型,這不是一個(gè)錯(cuò)誤。null
的類(lèi)型是“object
”。這是一個(gè)bug
,但從沒(méi)被修復(fù),因?yàn)樾迯?fù)后會(huì)破壞現(xiàn)有的代碼。instanceof使用方法如下:
?value? instanceof ?Constr?
如果 value 是一個(gè)對(duì)象,并且value 是由構(gòu)造函數(shù)Constr創(chuàng)建的(參考:類(lèi))。例如:
> var b = new Bar(); // 通過(guò)構(gòu)造函數(shù)Bar創(chuàng)建對(duì)象
> b instanceof Bar
true
> {} instanceof Object
true
> [] instanceof Array
true
> [] instanceof Object // 數(shù)字是對(duì)象的子類(lèi)型
true
更多建議: