[英]'Freezing' Arrays in Javascript?
由於 ECMA-262 規范,Javascript 獲得了Object.freeze()方法,該方法允許對象的屬性無法更改、添加或刪除。
var obj = {'a':1, 'b:2'};
Object.freeze(obj);
Object.isFrozen(obj); // returns true
obj.a = 10; // new assignment has no affect
obj.a; // returns 1
到現在為止還挺好。
我想知道,freeze() 是否也適用於數組。
var arr = [1, 2];
Object.freeze(arr);
Object.isFrozen(arr); // returns true
arr[0] = 10;
arr; // returns [10, 2] ... ouch!
也許我錯了,但我的印象是,Array 繼承自 Object。
typeof obj // "object"
typeof arr // "object"
任何想法,指針,啟示將不勝感激。
是的,凍結應該適用於數組,您遇到的行為顯然是一個實現錯誤。
此錯誤可能與數組對象實現自定義[[DefineOwnProperty]]
內部方法(使length
屬性起作用的魔法)這一事實有關。
我剛剛在兩個實現上對其進行了測試,它運行正常(Chrome 16.0.888 和 Firefox Aurora 8.02a)。
關於你的第二個問題,數組對象繼承自Array.prototype
,它繼承自Object.prototype
,例如,你可以直接在數組對象上訪問Object.prototype
非陰影方法:
['a'].hasOwnProperty('0'); // true
但這與typeof
工作方式無關,該運算符將為任何對象實例返回'object'
,無論其類型如何,以及人們一直抱怨的null
值。
typeof
運算符的其余可能返回值,對應於語言的基本類型,Number、String、Boolean、Symbol 和 Undefined。
是的,它也適用於數組。
const arr = [1,2,3,4];
Object.freeze(arr);
Object.isFrozen(arr)// true
arr.push(5) // you will get a type error
arr.pop() // you will get a type error
不要凍結,使用擴展運算符復制內容而不修改它們(當然,如果您使用的是轉譯器):
const second = {
...first,
test: 20
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.