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
成为一个数组吗?当然不是。它仍然是一个数字,但控制台决定将其显示为一个数组,而不管它实际上是什么。