簡體   English   中英

為什么 JavaScript 原始變量不可變而對象變量不可變?

[英]Why are JavaScript Primitive-Variables immutable and Object-Variables not?

有一種方法可以在原型屬性的幫助下將成員函數或成員屬性添加到 Number、String 等...-Variables:

 Number.prototype.member = function(){ console.log('number-member-function called'); };

或者在變量本身的原型屬性的幫助下:

 var num = 7;
 num.__proto__.member = function(){ console.log('number-member-function called'); };

就像任何其他類型的 JavaScript 類型一樣。 但是 JavaScript 中 Primitives 和 Objects 的實現有什么區別,因此下面的代碼不適用於 Numbers 而適用於 Objects?

 var num = 7;
 num.member = function(){ console.log('number-member-function called'); };
 num.member(); // TypeError: num.member is not a function

 var obj = {};
 obj.member = function(){ console.log('object-member-function called'); };
 obj.member(); // object-member-function called

有沒有人大約知道 JavaScript 原語和對象是如何在引擎蓋下實現的? 因為所有瀏覽器中的所有 JavaScript 實現都必須完全相同或幾乎相同,因為調用成員的 Number-Function 會引發錯誤。

當您對booleanstringnumber類型使用文字表示法時,不會使用構造函數 (Boolean, String, Number)。 原始類型的行為仍然幾乎與使用new運算符實例化時一樣,但它們是真正的原始類型。

只有當您嘗試將它們用作對象或嘗試使用構造函數的屬性時,JavaScript 解釋器才會在幕后圍繞它們創建一個包裝對象。 在此之后,包裝器對象被丟棄,您將再次處理原始類型。 所以:

var num = 7; //primitive

// You are trying to use num as an object: a wrapper object gets created and discarded just after the assignment
num.member = function(){ console.log('number-member-function called'); }; 

// This will throw an error, because here num is primitive again (member was defined on the discarded wrapper)
num.member();

可以在 Cody Lindley 根據 ECMA-262 第 3 版規范編寫的“JavaScript Enlightenment”一書中找到有關此主題的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM