Действительно ли массивы javascript реализованы в виде массивов?

Разница между 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 и т. Д.), Как это обрабатывается? Очевидно, мы не хотим, чтобы наши массивы фактически сохранялись в виде хэш-карт со значениями ключей! Как мы можем быть разумно уверены, что наши данные хранятся в виде реального массива?

Насколько я понимаю, движки могут использовать несколько подходов:

  1. Массив реализован точно так же, как Объект - как ассоциативный массив со строковыми ключами.
  2. Массив - это особый случай с массивом, подобным std :: vector , поддерживающим числовые ключи, и некоторой эвристикой плотности для предотвращения безумного использования памяти, если вы используете ar [100000000 ] = 0;
  3. Массив совпадает с Object , и все объекты проходят эвристику, чтобы увидеть, имеет ли смысл использование массива.
  4. Что-то безумно сложное, о чем я не думал.

На самом деле это было бы проще, если бы существовал правильный тип массива ( кашель Типизированные массивы WebGL кашель ).

19
задан Timmmm 10 February 2012 в 19:42
поделиться