Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript对象中的空插槽?_Javascript - Fatal编程技术网

JavaScript对象中的空插槽?

JavaScript对象中的空插槽?,javascript,Javascript,最近我开始在firefox的控制台上看到这一点 Object [ <6 empty slots>, false, <3 empty slots>, 1 more… ] 我只是想要一个可以访问的带有数字键的对象,但我对此感到担忧,因为如果它跟踪空插槽,那么这一定意味着浪费了一些内存 我的担心是否正确?如果是,定义这样一个对象的正确方法是什么?Javascript使用稀疏数组。“由于数组的长度可以随时更改,并且数据可以存储在数组中的非连续位置,因此JavaScript数组不

最近我开始在firefox的控制台上看到这一点

Object [ <6 empty slots>, false, <3 empty slots>, 1 more… ]
我只是想要一个可以访问的带有数字键的对象,但我对此感到担忧,因为如果它跟踪空插槽,那么这一定意味着浪费了一些内存


我的担心是否正确?如果是,定义这样一个对象的正确方法是什么?

Javascript使用稀疏数组。“由于数组的长度可以随时更改,并且数据可以存储在数组中的非连续位置,因此JavaScript数组不能保证密集;这取决于程序员选择如何使用它们。”()


如果对象的类型为
数组
,则使用的内存是引擎的实现细节。在您的例子中,对象是
对象
s,因此它只需要对象本身的内存,并存储属性名称和对属性值的引用。

问题可能是由Firefox的
控制台.log
如何解释输入对象引起的。不知怎的,它被计算为数组而不是简单的对象。Chrome做得很好。如果您深入了解如何在Javascript中管理数组,可以发现以下内容:

数组不能使用字符串作为元素索引(如在关联数组中),但必须使用整数。使用括号表示法(或点表示法)通过非整数进行设置或访问不会从数组列表本身设置或检索元素,但会设置或访问与该数组的对象属性集合关联的变量。数组的对象属性和数组元素列表是分开的,数组的遍历和变异操作不能应用于这些命名属性

对此更好的理解是修改数组的
length
属性。尤其是当您使用
[]
构建阵列时。要向数组中添加元素,我们必须使用
.push(…)
。此函数使用
length
属性(检查)。简而言之(互动示例位于底部)

您可以看到长度现在是
8
,而不是
4
。索引
3..6
保留,但未定义。下面是一个控制台输出

[
  "1stEl",
  "2ndEl",
  "3thEl",
  undefined,
  undefined,
  undefined,
  undefined,
  "7thEl"
]
如果再次使用
.push
方法,它会将新元素放在
'7thEl'
元素之后(索引8也是如此)

要检查此对象使用的键,可以在数组上使用。你会得到

[
  "0",
  "1",
  "2",
  "7"
]
您可以看到数值被用作键。就像你的物体,它是

{
  6: false,
  10: true
}
在此对象上使用
Object.keys
可以得到
[“6”,“10”]
。它具有与上述类似的输出。因此,firefox中的
console.log
将对象解释为数组,从而将其显示为数组。为了正确显示数组,它从键
0
开始(逻辑上看,还需要检查源代码),并在键
array.length-1
结束。但是索引
0,1..5
7..9
没有“定义”。因此,它导致了这种输出

Object [ <6 empty slots>, false, <3 empty slots>, 1 more… ]

如果您执行
[{6:false,10:true}]
压缩视图输出
数组[Object[11]]
@Jaromanda X Firefox严格遵循标准,因此它在控制台输出中反映出来。另一方面,Chrome为了用户/开发人员的易用性而变得简单,同时也忽略了许多W3C标准。因此,请解释行为背后的原因,而不是简单地抨击它。firefox必须有充分的理由显示空元素。在真正的情况下,它有助于调试问题,同时帮助查找数组的问题。“Array”只是一个具有特殊“length”属性的对象。你知道,我可以发誓你可以从typeof中获取“Array”,但我只是在js控制台中运行typeof[],然后获取了“object”。现在我想起了为什么我更喜欢非javascript语言!但是,如果控制台将其解释为数组,那么为什么它会像记录数组时那样说
Object
,而不是
array
。但我认为它在显示内容之前,在显示“数组”或“对象”时使用了
Object.prototype.toString.call
(“这里后面是optc”)。如果您在
b=[]
上使用optc,您将得到“Array”。如果你在你的物体上使用它,你会得到“物体”。
{
  6: false,
  10: true
}
Object [ <6 empty slots>, false, <3 empty slots>, 1 more… ]