【发布时间】:2016-06-15 09:42:11
【问题描述】:
如果我有一个将对象作为索引值的数组,例如:
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(a.length); // outputs 91
我找到了获得实际长度的解决方法:
function getLength(arr) {
return Object.keys(arr).length;
}
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(getLength(a));
但是,当对象存储在随机索引处时,为什么 JS 会给出不正确的长度?它只是在数组中找到的最大索引上加 1。和上面的例子一样,90 是最大的索引。它只是加 1 并给出 91 作为输出。 Demonstration
【问题讨论】:
-
您描述的行为是官方规范中定义的。 ecma-international.org/ecma-262/5.1/#sec-15.4.5.2
-
问题是:为什么你对
.length有错误的假设?想象一下.length返回了3,而您尝试使用for循环来获取值。你永远不会得到价值...... -
@CoryDanielson 谢谢。不知道有这样的官方规范存在!我现在总是会参考它。
-
@FelixKling 听不懂你在说什么。我不擅长英语:P 我需要这样的索引,因为它们在我的脚本中起到了很大的作用。我认为找到
.length的修复程序会很好。其他一切正常。 -
@CoryDanielson——它在§22.1.4 Properties of Array Instances下。
标签: javascript arrays