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