Javascript - 当我在数组中创建一个元素时会发生什么

Javascript - what happens when I create an element in an array

我可以像这样在数组边界外的任意索引处插入一个值。

> const a = []
undefined
> a[999] = true
true
> a
[ <999 empty items>, true ]

我怀疑 v8 并没有在幕后创建 999 个空项目,而数组更像对象,而是我们正在创建一个隐藏的 class,它有一个键,即 999 处的键偏移 0。这是正确的吗?

来自 https://v8.dev/blog/fast-properties

数组[]和对象{}都是JSObjects。

区别在于数组索引项填充 elements 存储。添加数组索引属性不会创建新的 HiddenClass。

在像 arr[9999] = 'foo' 这样的稀疏数组中,v8 在 "dictionary mode" 中创建一个 "custom descriptor" 以避免创建 10k 空条目的内存浪费。字典模式下的数组操作会比连续数组慢很多。