Есть ли ограничение на длину ключа (строки) в объекте 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 элементов.