2012-11-13 11 views
36

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

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

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

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

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

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

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

ответ

35

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

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

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

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

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

+10

Любая * продолжительность исполнения * для длинных клавиш в современных браузерах? –

+0

@AhmedFasih Я не тестировал его, поэтому не знаю точно. Если есть штраф за производительность, я бы предположил, что это связано с сравнением длинных строк. Я был бы удивлен, если на практике возникнут проблемы, которые важны на практике - если только ключи не являются _huge_ и многочисленными, и вы начинаете сталкиваться с ограничениями памяти, например. на мобильном телефоне. – hashchange

+4

Спецификация ES7 указывает [предел 2^53 - 1 из «элементов»] (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-language-types-string -тип). Но я думаю, что он ограничен максимальным размером кучи – mems

24

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

+6

«Строки являются неизменными символами»: Откуда вы это узнали? – Andrew

+3

Интересно. Можете ли вы добавить ссылку или источник? – hashchange

+5

На многих языках строки неизменяемы. Javascript является одним из этих языков. https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures # Primitive_values ​​ – hartz89

Смежные вопросы