簡體   English   中英

在 Javascript 中“凍結”數組?

[英]'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.

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