Я пишу интерпретатор JavaScript для встроенных устройств с ограниченными ресурсами (http://www.espruino.com), и каждый раз, когда я думаю, что у меня есть реализовал некоторый бит JavaScript правильно, я понимаю, что ошибаюсь.
Теперь мой вопрос о []
. Как бы вы реализовали один из самых простых битов JavaScript правильно?
Я просмотрел спецификацию JavaScript и, возможно, я не нашел нужный бит, но я не могу найти полезный ответ.
Ранее я предполагал, что у вас фактически есть две "карты" - одна для целых чисел и одна для строк. И длина массива была значением самого высокого целого числа плюс один. Однако это кажется неправильным, согласно jsconsole на chrome:
var a = [];
a[5] = 42;
a["5"]; // 42
a.length; // 6
но также:
var a = [];
a["5"] = 42;
a[5]; // 42
a.length; // 6
Итак... great - все преобразуется в строку, а строка с наивысшей оценкой, представляющая целое число, используется (плюс одна) для получения длины? Неправильно.
var a = [];
a["05"] = 42;
a.length; // 0
"05"
- действительное целое число - даже в Octal. Итак, почему это не влияет на длину?
Вам нужно преобразовать строку в целое число, а затем проверить, что при преобразовании обратно в строку оно соответствует?
Есть ли у кого-нибудь ссылка на точный алгоритм, используемый для хранения и получения элементов в массиве или объекте? Похоже, это должно быть очень просто, но похоже, что на самом деле это не так!