JavaScript:使用Object As Array

mel*_*oon 2 javascript

像这样的代码有任何陷阱吗?

var Foo = function() {
    this.bar = function() { return 'bar'; };
};

var f = new Foo();
f[0] = 'hi';
f[1] = 'there';
Run Code Online (Sandbox Code Playgroud)

请注意,我正在创建一个具有一些misc属性的新函数对象,然后我将对象视为一个数组.如何将数组值存储在对象中?0和1是否像属性名一样对待?

CMS*_*CMS 8

嗯,是的,0并且1只是两个属性名称.

使用括号表示法指定属性时,括号之间的表达式将转换为String,并且该字符串将用作属性名称.

事实上,即使是指数实际阵列是正义的,属性:

var realArray = ['a'];
realArray.hasOwnProperty('0'); // true
Run Code Online (Sandbox Code Playgroud)

区别在于每个属性赋值上的实数数组对象对应于有效索引[1],在内部跟踪其length属性的值.

这就是为什么"子类化"数组对象很困难的原因之一,即使使用新的ECMAScript 5扩展,或者目前也提出ECMAScript-Harmony Proxies 2 3,也无法以标准的方式完成.

这可能是一个问题,具体取决于您计划如何迭代数字属性.

如果使用该for-in语句枚举属性,则将显示其他成员,而不仅仅是数字属性.

[1]有效数组索引是0到(2 ^ 32)-1范围内的任何无符号32位整数.