Есть ли ограничение на длину ключа (строки) в объекте JS?

Таким образом, у нас был случай, когда у нас был бы объект, где ключ - это id (int), а значение - это строка. Но мы заметили, что в большинстве случаев мы ищем id на основе строки, поэтому мы решили изменить его и сделать строку ключом, а значение - id. Так как вместо того, чтобы проходить через каждый элемент и сравнивать значения, мы могли бы просто сделать var id = storage[text]; , Ниже приведены примеры того, что мы сделали.

Вот пример старой реализации:

var storage = {
  0 : null,
  1 : "Hello",
  2 : "world!",
  3 : "How are you?"
}

Вот пример новой реализации:

var storage = {
  "null" : 0,
  "Hello" : 1,
  "world!" : 2,
  "How are you?" : 3
}

Я понимаю, что теперь строка является ключом, и это нормально, чтобы получить тот же идентификатор для тех же строк. Но так как теперь строка может быть довольно большой (маловероятно, но, вероятно, максимум 1 КБ на строку), есть ли ограничение длины, которое JS или Android WebView накладывает на объектные ключи?

А также, имеет ли эта реализация недостатки? Я не заметил никаких проблем до сих пор, но вы никогда не знаете.

Ответ 1

Я немного изучил это.

MDN молчал в этом вопросе, а также спецификация (ES5, ES6). Они утверждают, что аксессор свойств должен быть строкой без какой-либо квалификации - другими словами, нет предела в отношении спецификации. Это неудивительно.

Как браузеры обрабатывают это, другое дело. Я установил тест и запустил его в нескольких браузерах. Chrome 40 (Desktop), Chrome 40 (Android 5.1), Firefox 36, Opera 27 и IE9 + могут обрабатывать имя свойства до 2 символов 27. Safari 8 (OS X Yosemite) может обрабатывать имена свойств 2 30 символов.

Для всех этих браузеров, кроме IE, максимальная длина свойства такая же, как максимальная длина строки. IE9 + может обрабатывать максимальную длину строки ~ 2 30 символов, но ограничение для ключей объектов составляет 2 символа 27 как и в других браузерах.

Тест не работал в IE8 и Safari на iOS, предположительно из-за проблем с памятью, вызванных тестовым кодом.

В двух словах, можно надежно использовать длинные имена свойств, даже если принимать их в крайности. Пока сами строки остаются в пределах того, что могут обрабатывать браузеры, вы также можете использовать их как имена свойств.

Ответ 2

Нет, нет предела для длины строки (пока она вписывается в память), и ваша реализация тоже выглядит нормально. Общепринято, чтобы иметь такие "развернутые" массивы, например. boolean values. И что касается строк как ключей: строки являются неизменяемыми символами, которые хранятся на определенном адресе, а тем, что фактически используется в качестве индекса для массива, является адрес (ака указатель aka reference), а не сама строка.

Ответ 3

Похоже, что с ECMAScript 2016, теперь есть окончательный ответ на этот вопрос. В соответствии с MDN Web Docs на string.length:

ECMAScript 2016 (изд. 7) установил максимальную длину 2 ^ 53 - 1 элемента. Ранее максимальная длина не указана.

Вы также можете найти это в спецификации языка ECMAScript® 2016:

Тип String - это набор всех упорядоченных последовательностей, состоящих из нуля или более 16-разрядных целочисленных значений без знака ("элементы"), длиной не более 2 53 -1 элементов.