特尔;博士:
据我所知,数组的长度似乎是在内部缓存的(至少在 V8 中)。
(详细信息?继续阅读:))
所以,这个问题在我的脑海中出现了几次,我决定找到问题的根源(至少,在一个实现中)。
挖掘 V8 源代码产生了JSArray类。
// The JSArray describes JavaScript Arrays
// Such an array can be in one of two modes:
// - fast, backing storage is a FixedArray and length <= elements.length();
// Please note: push and pop can be used to grow and shrink the array.
// - slow, backing storage is a HashTable with numbers as keys.
我假设数组元素的类型决定了它是快还是慢。我在set_has_fast_elements
( set_bit_field2(bit_field2() | (1 << kHasFastElements))
)中设置了一个位标志,这是我想在我查看 google 代码时绘制挖掘线的地方,并且在本地没有源代码。
现在,它似乎是任何时候任何操作是在阵列上完成(这是一个子类的JSObject
,就会调用作出NormalizeElements()
,其执行以下操作:
// Compute the effective length.
int length = IsJSArray() ?
Smi::cast(JSArray::cast(this)->length())->value() :
array->length();
因此,在回答您的问题时:
- Chrome(或其他使用 V8 的浏览器)似乎没有任何优势来缓存
length
数组的属性(除非你做一些奇怪的事情会迫使它成为slow
(我不确定这些条件是什么) ) - 话虽如此,我很可能会继续缓存,length
直到我有机会完成所有操作系统浏览器实现;)
- 在对对象
length
进行任何操作后,该属性似乎已更改。
编辑:
附带说明一下,似乎“空”数组实际上被分配为具有 4 个元素:
// Number of element slots to pre-allocate for an empty array.
static const int kPreallocatedArrayElements = 4;
我不知道数组有多少元素增长由曾经的范围已经超出了-我没有挖的是深:)