tre*_*mbl 34 javascript arrays object freeze
由于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
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
我想知道,freeze()是否也适用于数组.
var arr = [1, 2];
Object.freeze(arr);
Object.isFrozen(arr); // returns true
arr[0] = 10;
arr; // returns [10, 2] ... ouch!
Run Code Online (Sandbox Code Playgroud)
也许我错了,但我的印象是,Array继承自Object.
typeof obj // "object"
typeof arr // "object"
Run Code Online (Sandbox Code Playgroud)
任何想法,指针,启示都将受到高度赞赏.
CMS*_*CMS 36
是的,冻结应该适用于Arrays,您遇到的行为显然是一个实现错误.
这个错误可能与数组对象实现自定义[[DefineOwnProperty]]
内部方法(使length
属性工作的魔力)的事实有关.
我刚刚在两个实现上测试它并且它正常工作(Chrome 16.0.888和Firefox Aurora 8.02a).
关于你的第二个问题,例如,数组对象继承自Array.prototype
哪些继承Object.prototype
,你可以Object.prototype
直接从数组对象访问非阴影方法:
['a'].hasOwnProperty('0'); // true
Run Code Online (Sandbox Code Playgroud)
但这与typeof
作品的运作方式无关,这个运算符将返回'object'
任何对象,无论其类型如何,以及null
人们一直抱怨的价值.
typeof
操作符的其余可能返回值对应于语言的基本类型,Number,String,Boolean,Symbol和Undefined.
小智 10
是的,它也适用于数组。
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
Run Code Online (Sandbox Code Playgroud)