受到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
应该显示如下:
{}
那为什么会这样呢?请帮忙,我完全糊涂了。感谢。
答案 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
对象关联,因此您可以欺骗控制台以此方式显示它。