Разница между javascript Array
и Object
не очень большая. На самом деле кажется, что Array
в основном добавляет поле length
, поэтому вы можете использовать как Array
s, так и Object
s в качестве числовых массивов:
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
Итак, мои вопросы, в популярных движках javascript (V8, JavaScriptCore, SpiderMonkey и т. Д.), Как это обрабатывается? Очевидно, мы не хотим, чтобы наши массивы действительно хранились в виде хеш-карт с ключевыми значениями! Как мы можем быть уверены, что наши данные хранятся в виде фактического массива?
Насколько я вижу, есть несколько подходов, которые могли бы использовать двигатели:
Array
реализован точно так же, как Object
- как ассоциативный массив со строковыми ключами.
Array
является особым случаем, с массивом, подобным std::vector
, поддерживающим числовые ключи, и некоторой эвристической плотностью для предотвращения использования безумной памяти, если вы выполните ar[100000000] = 0;
Array
- это то же самое, что и Object
, и все объекты получают эвристику, чтобы увидеть, имеет ли смысл использовать массив.
- Что-то безумно сложное, о чем я не думал.
Действительно, было бы проще, если бы существовал правильный тип массива ( кашель Массивы, набранные WebGL кашель ).