欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在JavaScript并非所有的一切都是對(duì)象

 更新時(shí)間:2013年04月11日 14:06:00   作者:  
本篇文章解釋了 javascript 中的兩種值類型:原始值(primitive)和對(duì)象(object),以及混合使用兩種類型時(shí)的注意事項(xiàng)

雖然很多語(yǔ)言宣稱:“一切皆是對(duì)象”,但是 javascript 中,并不是所有的值都是對(duì)象。

原始值 vs 對(duì)象
javascript 中的值可以被劃分為兩大類:原始值(primitive)和對(duì)象(object)。

定義
javascript 的兩種值的定義:

下面的值是原始值。

1.字符串
2.數(shù)字:在 JavaScript 中所有的數(shù)字都是浮點(diǎn)數(shù)
3.布爾值
4.null
5.undefined


所有其它的值都是對(duì)象(object)。對(duì)象可以進(jìn)一步劃分:

1.原始值的包裝器:Boolean, Number, String。很少直接使用。

2.用字面量創(chuàng)建的對(duì)象。 下面的字面量產(chǎn)生對(duì)象,也可以通過構(gòu)造函數(shù)創(chuàng)建對(duì)象。您可以使用字面量創(chuàng)建對(duì)象。

•[] 就是 new Array()
•{} 就是 new Object()
•function() {} 就是 new Function()
•/\s*/ 就是 new RegExp("\\s*")
3.日期:new Date("2011-12-24")

區(qū)別
您可以通過枚舉的原語(yǔ)和定義對(duì)象非原語(yǔ)定義原語(yǔ)和對(duì)象。 但你也可以描述的原語(yǔ)和對(duì)象是什么。 讓我們開始與對(duì)象。

1.對(duì)象是可變的:

復(fù)制代碼 代碼如下:

> var obj = {};
> obj.foo = 123; // 添加屬性和值
123
> obj.foo // 讀屬性,返回屬性的值
123

2.每個(gè)對(duì)象都有自己唯一的標(biāo)識(shí)符,因此通過字面量或構(gòu)造函數(shù)創(chuàng)建的對(duì)象和任何其他對(duì)象都不相等,我們可以通過 === 進(jìn)行比較。

復(fù)制代碼 代碼如下:

> {} === {}
false

對(duì)象是通過引用來(lái)比較的,只有兩個(gè)對(duì)象有相同的標(biāo)識(shí),才認(rèn)為這個(gè)對(duì)象是相等的。

復(fù)制代碼 代碼如下:

> var obj = {};
> obj === obj
true

3.變量保存了對(duì)象的引用,因此,如果兩個(gè)變量應(yīng)用了相同的對(duì)象——我們改變其中一個(gè)變量時(shí),兩一個(gè)也會(huì)隨之改變。

復(fù)制代碼 代碼如下:

> var var1 = {};
> var var2 = var1;

> var1.foo = 123; // 修改變量 val1 的屬性
123
> var2.foo // val2 也改變了
123

正如預(yù)期的那樣,原始值和對(duì)象不一樣:

1.原始值是不可變的;你不能給它們添加屬性:

復(fù)制代碼 代碼如下:

> var str = "abc";
> str.foo = 123; // 添加屬性(此操作將被忽略)
123
> str.foo // 讀屬性的值,返回 undefined
undefined

2.原始值沒有內(nèi)部標(biāo)識(shí),原始值是按值比較的: 比較兩個(gè)原始值的依據(jù)是他們的內(nèi)容,如果兩個(gè)原始值的內(nèi)容相同,這認(rèn)為這兩個(gè)原始值相同。

復(fù)制代碼 代碼如下:

> "abc" === "abc"
true

這意味著,一個(gè)原始值的標(biāo)識(shí)就是它的值,javascript 引擎沒有為原始值分配唯一標(biāo)識(shí)。

最后兩個(gè)事實(shí)結(jié)合起來(lái)的意思是:我們無(wú)法區(qū)分一個(gè)變量到底是對(duì)象的引用,還是原始值的副本。

陷阱:原始值和它們的包裝類型
規(guī)則:忽略盡可能多的包裝類型。 在其他編程語(yǔ)言如Java,你很少會(huì)注意到他們。

原始值類型 boolean, number 以及 string 都有自己對(duì)應(yīng)的包裝類型 Boolean, Number 和 String。 包裝類型的實(shí)例都是對(duì)象值,兩種類型之間的轉(zhuǎn)換也很簡(jiǎn)單:

•轉(zhuǎn)換為包裝類型:new String("abc")
•轉(zhuǎn)換為原始類型:new String("abc").valueOf()
原始值類型以及它們相應(yīng)的包裝器類型有很多不同點(diǎn),例如:

復(fù)制代碼 代碼如下:

> typeof "abc"
'string'
> typeof new String("abc")
'object'

> "abc" instanceof String
false
> new String("abc") instanceof String
true

> "abc" === new String("abc")
false

包裝類型的實(shí)例是一個(gè)對(duì)象,因此和 JavaScript 和對(duì)象一樣,包裝類型也無(wú)法進(jìn)行值的比較(只能比較引用)。

復(fù)制代碼 代碼如下:

> var a = new String("abc");
> var b = new String("abc");
> a == b
false // 雖然 a 和 b 有相同的內(nèi)容,但是依然返回 false
> a == a
true

原始值沒有自己的方法
包裝對(duì)象類型很少被直接使用,但它們的原型對(duì)象定義了許多其對(duì)應(yīng)的原始值也可以調(diào)用的方法。 例如,String.prototype 是包裝類型 String 的原型對(duì)象。 它的所有方法都可以使用在字符串原始值上。 包裝類型的方法 String.prototype.indexOf 在 字符串原始值上也有,它們并不是兩個(gè)擁有相同名稱的方法,而的的確確就是同一個(gè)方法:

復(fù)制代碼 代碼如下:

> "abc".charAt === String.prototype.charAt
true

在數(shù)字的包裝類型 Number 的原型對(duì)象有 toFixed 方法,即 Number.prototype.toFixed,但是當(dāng)我們寫如下代碼時(shí)卻發(fā)生錯(cuò)誤:

復(fù)制代碼 代碼如下:

> 5.toFixed(3)
SyntaxError: Unexpected token ILLEGAL

此錯(cuò)誤是解析錯(cuò)誤(SyntaxError),5 后面跟著一個(gè)點(diǎn)號(hào)(.),這個(gè)點(diǎn)被當(dāng)作了小數(shù)點(diǎn),而小數(shù)點(diǎn)后面應(yīng)該是一個(gè)數(shù),以下代碼可以正常運(yùn)行:

復(fù)制代碼 代碼如下:

> (5).toFixed(3)
"5.000"
> 5..toFixed(3)
"5.000"

值的分類:typeof 和 instanceof
如果你想要對(duì)值進(jìn)行分類,你需要注意原始值和對(duì)象之間的區(qū)別。 typeof 運(yùn)算可以用來(lái)區(qū)分原始值和對(duì)象。instanceof 可以用來(lái)區(qū)分對(duì)象,而且,instanceof 對(duì)于所有的原始值都返回 false。

typeof
typeof 可以用來(lái)判斷原始值的類型,以及區(qū)分對(duì)象值和原始值:

復(fù)制代碼 代碼如下:

> typeof "abc"
'string'
> typeof 123
'number'
> typeof {}
'object'
> typeof []
'object'

typeof 返回以下字符串:

參數(shù) 結(jié)果
undefined "undefined"
null "object"
布爾值 "boolean"
數(shù)字 "number"
字符串 "string"
函數(shù) "function"
其他 "object"

注釋:

•typeof 在操作 null 時(shí)會(huì)返回 "object",這是 JavaScript 語(yǔ)言本身的 bug。不幸的是,這個(gè) bug 永遠(yuǎn)不可能被修復(fù)了,因?yàn)樘嘁延械拇a已經(jīng)依賴了這樣的表現(xiàn)。這并不意味著,null 實(shí)際上就是一個(gè)對(duì)象[4] 。

•typeof 還可以讓檢查一個(gè)變量是否已聲明,而不會(huì)拋出異常。 沒有任何一個(gè)函數(shù)可以實(shí)現(xiàn)此功能,因?yàn)槟悴荒馨岩粋€(gè)未聲明的變量傳遞給函數(shù)的參數(shù)。

復(fù)制代碼 代碼如下:

> typeof undeclaredVariable
'undefined'
> undeclaredVariable
ReferenceError: undeclaredVariable is not defined

•函數(shù)也是對(duì)象類型;這可能是很多人無(wú)法理解的,但有時(shí)候卻是非常有用的。

•數(shù)組是一個(gè)對(duì)象。

更多關(guān)于 typeof 的信息 [5] 和 [6]。

instanceof
instanceof 可以檢測(cè)一個(gè)值是否是某個(gè)構(gòu)造函數(shù)的實(shí)例:

復(fù)制代碼 代碼如下:

value instanceof Constructor

如果上面的表達(dá)式返回 true,則表示 value 是 Constructor 的一個(gè)實(shí)例。它等價(jià)于:

復(fù)制代碼 代碼如下:

Constructor.prototype.isPrototypeOf(value)

大多數(shù)對(duì)象是 Object 的實(shí)例,因?yàn)樵玩湹哪┒耍╬rototype chain)是 Object.prototype。 原始值不是任何對(duì)象的實(shí)例:

復(fù)制代碼 代碼如下:

> "abc" instanceof Object
false
> "abc" instanceof String
false

相關(guān)文章

最新評(píng)論