首页 > 解决方案 > Javascript - 当我在数组中创建一个元素时会发生什么

问题描述

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

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

我怀疑 v8 并没有在后台创建 999 个空项目,并且 Arrays 更像 Objects 工作,相反我们正在创建一个隐藏类,它有一个键,它是999offset的键0。这个对吗?

标签: javascriptnode.jsv8

解决方案


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

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

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

在像 v8 这样的稀疏数组arr[9999] = 'foo'中,在“字典模式”中创建一个“自定义描述符”,以避免创建 10k 个空条目造成的内存浪费。字典模式下的数组操作将比连续数组慢得多。


推荐阅读