这样的代码是否有任何陷阱?
var Foo = function() {
this.bar = function() { return 'bar'; };
};
var f = new Foo();
f[0] = 'hi';
f[1] = 'there';
请注意,我正在创建一个具有一些misc属性的新函数对象,然后我将对象视为一个数组。如何将数组值存储在对象中? 0和1是否被视为属性名称?
答案 0 :(得分:8)
嗯,是的,0
和1
只是两个属性名称。
当您使用括号表示法指定属性时,括号之间的表达式将转换为String,并且该字符串将用作属性名称。
事实上,即使真实数组的索引也只是属性:
var realArray = ['a'];
realArray.hasOwnProperty('0'); // true
区别在于每个属性赋值上的实数组对象对应于有效的索引 [1] ,内部跟踪的值他们的length
财产。
这就是为什么“子类化”数组对象很困难的原因之一even with the new ECMAScript 5 extensions,或者目前还有提议的ECMAScript-Harmony Proxies 2 3 < / sub>,不能以标准的方式完成。
这可能是个问题,具体取决于您计划迭代数字属性的方式。
如果使用for-in
语句枚举属性,则会显示其他成员,而不仅仅是数字属性。
[1]有效数组索引是0到(2 ^ 32)-1范围内的任何无符号32位整数。
答案 1 :(得分:1)
如果您尝试使用for in
循环进行循环,我认为您可能会遇到问题;循环也将获得bar
。有办法解决这个问题,所以你必须要小心。
答案 2 :(得分:1)
如果您想扩展数组行为,请使用:Array.prototype.yourfunc = function()....