Javascript 这是什么&引用;隐藏值“;?

Javascript 这是什么&引用;隐藏值“;?,javascript,arrays,Javascript,Arrays,灵感来源于,发生了一些非常奇怪的事情,我以前从未见过 var strangeArray = { 0:"a", 1:"b", 2:"c", length: 0, splice: Array.prototype.splice } 现在,当您运行它时: > strangeArray; [] <-- you get an empty array. > strangeArray.length; 0 <-- Holy

灵感来源于,发生了一些非常奇怪的事情,我以前从未见过

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.length==0
,因为您明确地将
strangeArray.length
设置为整数
0
,并覆盖其默认值

该数组仍然包含以下元素:

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

0
1
2
length
splice

strangeArray.length==0
,因为您显式地将
strangeArray.length
设置为整数
0
,覆盖其默认值

该数组仍然包含以下元素:

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

0
1
2
length
splice

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

当控制台看到具有

  • 数值
    .length
    属性
  • 函数
    .splice
    属性
…控制台决定将其显示为数组,即使它不是。它对对象实际上是什么没有影响

strangeArray.length; // 0
这并不奇怪。您在对象上定义了它

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


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

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

当控制台看到具有

  • 数值
    .length
    属性
  • 函数
    .splice
    属性
…控制台决定将其显示为数组,即使它不是。它对对象实际上是什么没有影响

strangeArray.length; // 0
这并不奇怪。您在对象上定义了它

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


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

一切都是javascript中的对象。有关详细说明,请参见以下问题的答案:


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

一切都是javascript中的对象。有关详细说明,请参见以下问题的答案:


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

但为什么它显示的是
[]
而不是其他内容?设置
奇异数组.length=1
,看看会发生什么。我猜JavaScript编译器在显示数组之前会检查数组的长度。现在尝试
100
而不是
1
;)@德里克:因为它仍然是一个数组。它没有改变它是什么,只是因为你超越了它的属性。这实际上是您的代码模棱两可的一个例子。您不应该将length属性指定为已经为数组定义的属性。而且,仅仅因为它是一个数组并不意味着它不是一个具有自己属性的对象。@Derek:是的,但对象不一定是数组。您问题中的对象不是数组。但为什么它显示的是
[]
而不是其他内容?设置
奇异数组.length=1
,看看会发生什么。我猜JavaScript编译器在显示数组之前会检查数组的长度。现在尝试
100
而不是
1
;)@德里克:因为它仍然是一个数组。它没有改变它是什么,只是因为你超越了它的属性。这实际上是您的代码模棱两可的一个例子。您不应该将length属性指定为已经为数组定义的属性。而且,仅仅因为它是一个数组并不意味着它不是一个具有自己属性的对象。@Derek:是的,但对象不一定是数组。您问题中的对象不是数组。@Derek:
[]
不是您在JS代码中键入的要由JS引擎解释的内容。在您的例子中,
[]
只是控制台中显示的一些文本。同样,控制台不是语言的一部分。开发人员控制台可以显示它想要的任何内容,并且不会违反任何规则。。。因为没有……让我这样说吧。如果某个流氓控制台开发人员决定在每次收到编号
42
时显示
[]
,这会使编号
42
成为一个数组吗?当然不是。它仍然是一个数字,但控制台决定将其显示为一个数组,而不管它实际是什么。@Derek:
[]
不是您在JS代码中键入的东西,由JS引擎进行解释。在您的例子中,
[]
只是控制台中显示的一些文本。同样,控制台不是语言的一部分。开发人员控制台可以显示它想要的任何内容,并且不会违反任何规则。。。因为没有……让我这样说吧。如果某个流氓控制台开发人员决定在每次收到编号
42
时显示
[]
,这会使编号
42
成为一个数组吗?当然不是。它仍然是一个数字,但控制台决定将其显示为一个数组,而不管它实际上是什么。