我可以像这样在数组边界之外的任意索引处插入值。
> const a = []
undefined
> a[999] = true
true
> a
[ <999 empty items>, true ]
我怀疑v8并没有在引擎盖下创建999个空项,Arrays的工作方式更像Objects,而是创建了一个隐藏类,它有一个键,即偏移0
处的键999
。这是正确的吗?
来源https://v8.dev/blog/fast-properties
数组[]
和对象{}
都是JSObjects。
不同之处在于数组索引项填充elements
存储。添加数组索引属性不会创建新的HiddenClass。
在像arr[9999] = 'foo'
v8这样人烟稀少的数组中,它会在"字典模式"中创建一个"自定义描述符",以避免创建10k个空条目的内存浪费。字典模式下的数组操作将明显慢于连续数组。