государства jshashtable:
код JavaScript'ы встроенных объектов, обеспечивают функциональность хеш-таблице, используя В квадратные скобки для обозначения Свойства, предоставили свои ключи строки или числа:
Насколько я знаю, ключи только строки, (так как цифры все равно заставляют строк). Я просто хочу, чтобы проверить и быть уверенным, что то, что указано выше, является ложным (так как ключи могут'т быть цифры).
Сделал стандарт ECMA сказано ничего об этом..
Или браузер-конкретные реализации?
код JavaScript'ы встроенных объектов, обеспечивают функциональность хеш-таблице, используя В квадратные скобки нотации для свойств, при условии ваши ключи строки или числа
Что кажется неправильным - объект ключи <удар>всегда строки</удара> может быть строками или (начиная с ECMAScript 2015, ака ЕСМА-262 ЕД 6) символы. Но это другая тема в квадратные скобки доступа к свойству.
Смотри в ECMA-262 ЕД 3 § 11.2.1 (см. Также в ECMAScript 2017 (проект).):
Свойства доступны по названию, используя либо точечную нотацию:
MemberExpression . IdentifierName
CallExpression . IdentifierName
или квадратные скобки:
MemberExpression [ выражение ]
CallExpression [ выражение ]
точечную нотацию объясняется следующим синтаксические преобразования:
MemberExpression . IdentifierName
> есть идентичны в своем поведении, чтобы
MemberExpression [ &ЛТ;идентификатор-название-строка&ГТ; ]
> и точно так же
CallExpression . IdentifierName
> есть идентичны в своем поведении, чтобы
CallExpression [ &ЛТ;идентификатор-название-строка&ГТ; ]
где &ЛТ;идентификатор-название-строка> строковый литерал, содержащий В той же последовательности символов после обработки защитить Юникод последовательности как IdentifierName.
Поэтому при использовании точечной нотации, немного после точки должно соответствовать критериям IdentifierName. Но когда, используя квадратные скобки, выражения ** предусмотрено, что оценивается и решается в строку.
Кратко, квадратных скобок, чтобы свойства можно получить с помощью выражения**, например
var y = {};
var x = 'foo';
y[x] = 'foo value';
В приведенном выше, "х", приводятся в квадратных скобках, поэтому он оценивается, возвращая строку 'фу'. Так как это свойство не'т существуют на Г
, то добавляется. Класса Foo
собственность г
присваивается значение 'ФОО значение'.
В общих чертах, выражения в квадратных скобках вычисляется, и его метод toString (метод) называется. Это значение используется в качестве имени свойства.
В точечный метод доступа к свойству, идентификатор не оценивали, так:
y.bar = 'bar value';
создает свойство бар
со значением планку стоимости
.
Если вы хотите создать числовое свойство, то:
y[5] = 5;
проведет оценку 5
, увидеть это's не строку, звоните (более или менее) количество(5).метод toString (), который возвращает строку
5, который используется для имени свойства. Она присваивается значение
5`, который является числом.
Этот ответ был написан, когда в ECMAScript ed3 являются актуальными, однако жизнь не стоит на месте. Пожалуйста, см. Ниже ссылки и МДН.
Вы'вновь правую клавиши могут быть только строки и числовые ключи, такие как те, которые используются в массивах принуждают и хранятся как строки.
var arr = [true];
arr[0] === true;
arr['0'] = false;
arr[0] === false;
В ECMAScript спецификаций, стр. 42: ЕСМА-262 Сценарий 3-й Edition.
Имя_свойства производства: NumericLiteral
вычисляется следующим образом:
Ну, вот мой ответ -- в основном потому, что я не был удовлетворен со ссылками на другие (правильные) ответы ... выражений для имен свойств в [ ] не всегда coereced в строки и это хорошо определены в спецификации. Таким образом, в зависимости от интерпретации цитаты В вопрос, оно может быть принято как вводящую в заблуждение и/или ошибочные.
Однако, цитировать не берусь, что `Х[42] и Х [с"42" и] разные; его государств-с сообщают исключения других примитивов и детали ... это только строки и числа использовать - как "хэш-ключи и" (на самом деле имена свойств) при нормальных собственность резолюции и, в этом смысле, цитата, пожалуй, правильно.
Эти правила из стандарт ECMA-262 в ECMAScript спецификации языка 5-е издание (декабрь 2009)
Из раздела "методы доступа к свойствам и quot 11.2.1; (пропущено продукционных правил):
в MemberExpression производства : MemberExpression [ выражение ] вычисляется следующим образом:
- Пусть baseReference быть результатом оценки MemberExpression.
- Пусть baseValue быть и getValue(baseReference).
- Пусть propertyNameReference быть результатом вычисления выражения.
- Пусть propertyNameValue быть и getValue(propertyNameReference).
- Позвоните CheckObjectCoercible(baseValue).
- Пусть propertyNameString быть метод toString(propertyNameValue).
- Если синтаксическая производства, которое оценивается, содержащейся в строгом режиме кода, пусть строгий, правда, еще давайте строгим быть ложным.
- Возвращает значение ссылочного типа базы, значение которого является baseValue и которого ссылается зовут propertyNameString, и чей строгий флаг режим строгий.
Удачи в кодировании.
Ключи всегда строки. Это означает, что вы можете'т использовать экземпляр объекта'личность в качестве ключа.
В Flash'с помощью ActionScript 3 (использует сильные во время выполнения типы В отличие от АС2) есть словарь объект, который используется строгое равенство сравнения ключей, так что вы можете использовать экземпляры объектов самостоятельно в качестве ключей (а также числа, строки и т. д.).
Если вы хотели сделать то же самое в JavaScript, это будет трудно, потому что вы'd должны создавать свои собственные уникальные идентификаторы объекта и прикрепить их к каждому объекту вы хотите отслеживать. Некоторые предположили, добавив функцию прототипа к объекту класса, но что бы добавить накладные расходы на каждый объект излишне. В любом случае, вы'd не хочу, чтобы дать объекту идентификатор отслеживается через вызов функции, которая присваивает увеличивая статический номер к уникальной недвижимости, таких как "__ид_объекта__в
".
Тогда стало бы возможно создание словаря-как класс с методами, как добавить(ключ,значение), а то бы хранить строки, цифры и объекты на три отдельные внутренние хэши, чтобы убедиться, что "3" и не'т сталкиваются с цифры 3 или объект с идентификатором 3. Метод Add будет автоматически назначен `__ид_объекта__ на любой ключ типа объекта, что это'т уже есть идентификатор. Даже после всего этого, вы не'т быть в состоянии получить доступ к словарю с помощью квадратных скобок, если есть некоторые крючки для назначения свойств, что я'м не в курсе в JavaScript.
Вот массив функтор
. Это полезно при использовании парадигмы функционального программирования.
javascript:
alert(["Using ",window.navigator.userAgent] );
FunctorRA=[]; f=function(){return f}; g=function(x){return x};
FunctorRA[f]=43;
FunctorRA[g(function(){})]="generic";
FunctorRA[g(g)]="idempotent";
alert(FunctorRA);
for (i in FunctorRA)
alert([ "Functor[ ", i,
"]'s\n\n value is \n\n", FunctorRA[i]].join(""));
отображает:
Using ,Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423
Ubuntu/10.04 (lucid) Firefox/3.6.3
пустым предупреждением, а затем:
Functor[ function () {
return f;
}]'s
value is
43
и т. д.
Примечание Bene:
показывает
.метод toString()` не перечислить нечисловые индексыFunctorRA
является универсальным объектом в массиве'ы с "Одежда"и.
синтаксический эквивалент ( даже с строкой ивал
принуждение )
см https://stackoverflow.com/questions/5905492/dynamic-function-name-in-javascript/6104795#6104795 подробные сведения о:
двоеточие, может быть встроен в имя функции, хотя это, как правило, разделитель для синтаксически определить свойства инициализатора, этикетки ?:
(условные выражения) и т. д. Аналогичная проблема существует с .
требующих экранирования, все синтаксически значимых кодов на JavaScript символ, например (){}\п.,
... . В []
построить эффективно ли это, в скобках, содержится выражение, в целом, по-видимому, откладывая оценку строку объект типа String. Это похоже на то 43.х=2-это не запрещено, но если 43 представлен как объект номер типа
(43).х=2или
43 [на"Х", У]=2. (доказательство:
на JavaScript:предупреждение( [ (43).х=2, 43 [на"Х", У]=2 ] )отображает
2,2но
в JavaScript:предупреждение(43.х=2)` генерирует ошибку).код JavaScript'ы встроенных объектов, обеспечивают функциональность хеш-таблицы ...
Да, вроде того. Объекты по определению просто коллекция пар ключ-значение (хотя ключи являются строками или символами). Однако, поскольку они используются как таблиц много людей, большинство двигателей будет выбрать хеш-таблица как структура данных для реализации объектов внутри (в некоторых случаях). Так что да, вы можете использовать объекты в качестве хеш-таблицы (но это не гарантировано, что двигатель будет использовать хеш-таблицу под капотом).
ключи являются строками или числами ...
Нет. Чисел будет преобразован в строку при использовании в качестве ключей объектов, как и любое другое значение. Поэтому вы можете использовать объекты в качестве хеш-таблицу для чисел, и для строк, но не для обоих одновременно:
{ "1": true }[1] // true
Если вам нужна хеш-таблица для произвольной / смешанные ценности, ["карта"] ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map ) или установить
будет лучшим выбором, особенно потому, что они гарантируют за O(1) время поиска.
Ну все, что вы используете для ключа преобразуется в строку из-за функции хэширования строк хэши почти уникальный короткий набор байтов, которые можно интерпретировать как целое число, потому что сравнение целочисленных во время линейного поиска низком уровне и быстро.(Объекты JavaScript являются хэш-таблиц). Вы преобразовать в строки массивы объекты и использовать их в качестве ключа. Ключи могут быть ограничены в размерах. Но будьте осторожны, потому что объекты JavaScript являются неупорядоченными.
Вчера и сегодня, я'вэ пытался обернуть мою голову вокруг проблемы, возникающие в этой области, и я'вэ написано эти решения. Первый-это пользовательская реализация хэш-таблицы, http://stamat.wordpress.com/javascript-quickly-find-very-large-objects-in-a-large-array/ И там все объясняется в дилетантов условия...
другой апгрейд до первой, и она является детерминированным в JSON stringify и что stringifies объектов, упорядоченных по алфавиту свойства: http://stamat.wordpress.com/2013/07/03/javascript-object-ordered-property-stringify/
Зацените :)
Да, ключи могут быть цифры. По сути, спецификация использует те же универсальные функции сопоставления для объектов и массивов.