在JavaScript並非所有的一切都是對象

來源:互聯網
上載者:User

雖然很多語言宣稱:“一切皆是對象”,但是 javascript 中,並不是所有的值都是對象。

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

定義
javascript 的兩種值的定義:

下面的值是原始值。

1.字串
2.數字:在 JavaScript 中所有的數字都是浮點數
3.布爾值
4.null
5.undefined

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

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

2.用字面量建立的對象。 下面的字面量產生對象,也可以通過建構函式建立對象。您可以使用字面量建立對象。

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

區別
您可以通過枚舉的原語和定義對象非原語定義原語和對象。 但你也可以描述的原語和對象是什麼。 讓我們開始與對象。

1.對象是可變的:

複製代碼 代碼如下:> var obj = {};
> obj.foo = 123; // 添加屬性和值
123
> obj.foo // 讀屬性,返回屬性的值
123

2.每個對象都有自己唯一的標識符,因此通過字面量或建構函式建立的對象和任何其他對象都不相等,我們可以通過 === 進行比較。

複製代碼 代碼如下:> {} === {}
false

對象是通過引用來比較的,只有兩個對象有相同的標識,才認為這個對象是相等的。

複製代碼 代碼如下:> var obj = {};
> obj === obj
true

3.變數儲存了對象的引用,因此,如果兩個變數應用了相同的對象——我們改變其中一個變數時,兩一個也會隨之改變。

複製代碼 代碼如下:> var var1 = {};
> var var2 = var1;

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

正如預期的那樣,原始值和對象不一樣:

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

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

2.原始值沒有內部標識,原始值是按值比較的: 比較兩個原始值的依據是他們的內容,如果兩個原始值的內容相同,這認為這兩個原始值相同。

複製代碼 代碼如下:> "abc" === "abc"
true

這意味著,一個原始值的標識就是它的值,javascript 引擎沒有為原始值分配唯一標識。

最後兩個事實結合起來的意思是:我們無法區分一個變數到底是對象的引用,還是原始值的副本。

陷阱:原始值和它們的封裝類型
規則:忽略儘可能多的封裝類型。 在其他程式設計語言如Java,你很少會注意到他們。

原始實值型別 boolean, number 以及 string 都有自己對應的封裝類型 Boolean, Number 和 String。 封裝類型的執行個體都是對象值,兩種類型之間的轉換也很簡單:

•轉換為封裝類型:new String("abc")
•轉換為原始類型:new String("abc").valueOf()
原始實值型別以及它們相應的封裝器類型有很多不同點,例如:

複製代碼 代碼如下:> typeof "abc"
'string'
> typeof new String("abc")
'object'

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

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

封裝類型的執行個體是一個對象,因此和 JavaScript 和對象一樣,封裝類型也無法進行值的比較(只能比較引用)。

複製代碼 代碼如下:> var a = new String("abc");
> var b = new String("abc");
> a == b
false // 雖然 a 和 b 有相同的內容,但是依然返回 false
> a == a
true

原始值沒有自己的方法
封裝物件類型很少被直接使用,但它們的原型對象定義了許多其對應的原始值也可以調用的方法。 例如,String.prototype 是封裝類型 String 的原型對象。 它的所有方法都可以使用在字串原始值上。 封裝類型的方法 String.prototype.indexOf 在 字串原始值上也有,它們並不是兩個擁有相同名稱的方法,而的的確確就是同一個方法:

複製代碼 代碼如下:> "abc".charAt === String.prototype.charAt
true

在數位封裝類型 Number 的原型對象有 toFixed 方法,即 Number.prototype.toFixed,但是當我們寫如下代碼時卻發生錯誤:

複製代碼 代碼如下:> 5.toFixed(3)
SyntaxError: Unexpected token ILLEGAL

此錯誤是解析錯誤(SyntaxError),5 後面跟著一個點號(.),這個點被當作了小數點,而小數點後面應該是一個數,以下代碼可以正常運行:

複製代碼 代碼如下:> (5).toFixed(3)
"5.000"
> 5..toFixed(3)
"5.000"

值的分類:typeof 和 instanceof
如果你想要對值進行分類,你需要注意原始值和對象之間的區別。 typeof 運算可以用來區分原始值和對象。instanceof 可以用來區分對象,而且,instanceof 對於所有的原始值都返回 false。

typeof
typeof 可以用來判斷原始值的類型,以及區分對象值和原始值:

複製代碼 代碼如下:> typeof "abc"
'string'
> typeof 123
'number'
> typeof {}
'object'
> typeof []
'object'

typeof 返回以下字串:

參數 結果
undefined "undefined"
null "object"
布爾值 "boolean"
數字 "number"
字串 "string"
函數 "function"
其他 "object"

注釋:

•typeof 在操作 null 時會返回 "object",這是 JavaScript 語言本身的 bug。不幸的是,這個 bug 永遠不可能被修複了,因為太多已有的代碼已經依賴了這樣的表現。這並不意味著,null 實際上就是一個對象[4] 。

•typeof 還可以讓檢查一個變數是否已聲明,而不會拋出異常。 沒有任何一個函數可以實現此功能,因為你不能把一個未聲明的變數傳遞給函數的參數。

複製代碼 代碼如下:> typeof undeclaredVariable
'undefined'
> undeclaredVariable
ReferenceError: undeclaredVariable is not defined

•函數也是物件類型;這可能是很多人無法理解的,但有時候卻是非常有用的。

•數組是一個對象。

更多關於 typeof 的資訊 [5] 和 [6]。

instanceof
instanceof 可以檢測一個值是否是某個建構函式的執行個體:

複製代碼 代碼如下:value instanceof Constructor

如果上面的運算式返回 true,則表示 value 是 Constructor 的一個執行個體。它等價於:

複製代碼 代碼如下:Constructor.prototype.isPrototypeOf(value)

大多數對象是 Object 的執行個體,因為原型鏈的末端(prototype chain)是 Object.prototype。 原始值不是任何對象的執行個體:

複製代碼 代碼如下:> "abc" instanceof Object
false
> "abc" instanceof String
false
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.