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 空条目的内存浪费。字典模式下的数组操作会比连续数组慢很多。
我可以像这样在数组边界外的任意索引处插入一个值。
> 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 空条目的内存浪费。字典模式下的数组操作会比连续数组慢很多。