1

兰斯波拉德在这个问题中的评论的启发,发生了一些非常奇怪的事情,我以前从未见过......

var strangeArray = {
    0:"a",
    1:"b",
    2:"c",
    length: 0,
    splice: Array.prototype.splice
}

现在,当你运行它时:

> strangeArray;
  []    <-- you get an empty array.

> strangeArray.length;
  0     <-- Holy $#!T

现在:

> strangeArray[0];
  "a"

> strangeArray[1];
  "b"

> strangeArray[2];
  "c"

什么?“数组中的隐藏值”?

首先我认为因为它是一个对象,这就是原因。但object应该像这样显示:

{}

那么为什么会这样呢?请帮忙,我完全糊涂了。谢谢。

4

3 回答 3

4

这只是控制台经常将 Object 解释为 Array 的方式(即使它根本不是 Array,就像在您的代码中一样)。

当控制台看到一个对象...

  • 数字.length属性
  • 函数.splice属性

...控制台决定将其显示为数组,即使不是。它对对象实际上是什么没有影响。

strangeArray.length; // 0

这应该不足为奇。您在对象上定义了它。

他们使用这种方法的原因大概是因为它速度快,而且足够准确。

再一次,仅仅因为你看到[],并不意味着它是一个数组。控制台不是语言的一部分。它只是显示一些有用的信息。

于 2012-05-26T02:46:28.920 回答
3

strangeArray.length == 0因为您明确设置strangeArray.length为 integer 0,覆盖其默认值。

该数组仍然包含元素:

for (var i in strangeArray) {
  console.log(i);
}

输出:

0
1
2
length
splice
于 2012-05-26T02:46:15.080 回答
0

一切都是javascript中的对象。有关详细解释,请参阅以下问题的答案:
Javascript 中的几乎所有内容如何都是对象?

鉴于此,社区 wiki 答案提供了其余的解释。由于您提供了strangeArray通常与对象关联的对象属性array,因此您可以欺骗控制台将其显示为这样。

于 2012-05-26T02:56:36.653 回答