如何复制数组行为?

8

我知道在JavaScript中,数组只是一个对象。 当我像这样定义一个数组:

var array;
array = [ "a", "b", "c" ];

并运行

Object.keys(array);

我得到了以下数组:["0", "1", "2"]。 数组array的长度为3

当我添加一个属性时:

array["a"] = "d";

Object.keys() 返回 ["0", "1", "2", "a"],但是数组 array 的长度仍然是 3

但是当我添加一个属性时:

array["3"] = "d";
array的长度现在是4如果array只是另一个对象,那么我如何在从头开始创建对象时像var myArray = {}一样实现这种行为呢?

6
阅读 Kangax 的这篇经典博客文章(链接为 http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/ ),结果表明你无法做到你所要求的。 - Pointy
可能是重复的问题:Javascript数组长度在对象数组上不正确 - epascarello
2个回答

1

.length 属性仅包括具有数字索引的属性,特别是那些大于或等于零的整数值。

如果您想要获取数组或对象中所有键的总计数,则可以执行以下操作:

Object.keys(array).length

由于Object.keys()返回一个数组,该数组本身将具有.length属性。


请注意,.length实际上可能比Object.keys(array).length更大,因为(正如Clyde所指出的那样),长度比最高整数索引多1,但JS允许稀疏数组,并且Object.keys()仅返回已分配的索引。 - nnnnnn
那么我猜测每当向对象添加新属性时,length的值都会被计算? - Amberlamps

1
数组的length属性是最高数值索引值+1。
所以在执行array["3"] = "d";之后,最高数值索引为3,因此长度返回4Object.keys(array).length应该可以给你长度。

“array[1000000000] = "x"” 不是这样操作的。那么限制在哪里? - Amberlamps
尝试以下代码:var array; array = [ "a", "b", "c" ]; array[1000000000] = 1; array.length; - Clyde Lobo
请将索引再加一个 0,然后重试。 - Amberlamps
@Amberlamps:这就是原因:https://dev59.com/Im025IYBdhLWcg3wNC92 - Clyde Lobo

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