这是什么? “隐藏的价值观”?

时间:2012-05-26 02:38:29

标签: javascript arrays

受到Lance Pollard's comment in this question的启发,发生了一件非常奇怪的事情,我以前从未见过......

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应该显示如下:

{}

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

3 个答案:

答案 0 :(得分:4)

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

当控制台看到带有...的对象时

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

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

strangeArray.length; // 0

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

他们使用这种方法的原因可能是因为它快速且足够准确。

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

答案 1 :(得分:3)

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

数组仍包含元素:

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

输出:

0
1
2
length
splice

答案 2 :(得分:0)

一切都是javascript中的对象。有关详细说明,请参阅以下问题的答案:
How is almost everything in Javascript an object?

鉴于此,社区维基回答提供了其余的解释。由于您提供的strangeArray对象属性通常与array对象关联,因此您可以欺骗控制台以此方式显示它。