Разница между javascript Array
и Object
не очень велика. На самом деле кажется, что Array
в основном добавляет поле length
, поэтому вы можете использовать как Array
, так и Object
как числовые массивы:
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, типизированный массив кашля).