当JavaScript数组被视为对象时会发生什么?

3
下面的索引变量初始化不正确,因为f()将返回除数字之外的其他内容,如字符串。那么这里最糟糕的情况是什么?我的测试似乎表明它没有影响,但现在我在想...
function index(o, f) {
    var index = []; // should be index = {};
    each(o, function(k, v, o) { index[f(k, v, o)] = v; });
    return index;
}
4个回答

4
Javascript数组是特殊的对象,具有自动设置的length属性,并继承了Array.prototype
除非您使用length属性,否则将数组视为对象不会有任何问题。

2

数组是一个对象,因此它可以被视为一个对象而不会产生太多副作用。然而,这样做可能会导致一些混淆,因为length属性不计算非数字键,而所有的数组原型函数也将忽略它们。

只需将[]更改为{}


0

"f()将返回除数字以外的其他内容,例如字符串"

如果f()只返回字符串,那么你就可以放心使用了,你只是将数组用作对象并添加属性。唯一的缺点是数组本身保持为空,因此例如您无法计算添加了多少项。

如果f()既可以返回字符串又可以返回数字,那么它会创建混乱。循环有时会填充数组,有时会填充对象属性。

我不确定您所说的“像字符串”,但如果f()返回的既不是数字也不是字符串,则不起作用。


0
你将会创建一个关联数组,这是一种有效的JavaScript结构。虽然它在技术上与对象不同,但你可以像操作对象一样与数组交互(使用for...in进行迭代,myarray[key]获取值)。如果你怀疑某些键将是字符串,你可能想考虑返回一个对象而不是一个数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接