Ответ 1
Там просто нет. Все три из них буквально равны.
В Javascript, в чем разница между объектом и хешем? Как вы создаете один против другого, и почему вас это волнует? Есть ли разница между следующими примерами кода?
var kid = {
name: "juni",
age: 1
}
и
var kid = new Object();
kid.name = "juni";
kid.age = 1;
и
var kid = new Object();
kid["name"] = "juni";
kid["age"] = 1;
Можете ли вы представить себе какой-либо другой пример кода, который я должен проиллюстрировать?
Основной вопрос здесь в чем разница между объектом и хешем?
Там просто нет. Все три из них буквально равны.
Это разные системы обозначений, которые вы можете использовать взаимозаменяемо. Существует много ситуаций, когда использование синтаксиса скобки [ ]
может быть более привлекательным, примером может служить ссылка на объект с переменной.
var temp = "kid";
var obj = new Object();
obj[temp] = 5; // this is legal, and is equivalent to object.kid
obj.temp = 5; // this references literally, object.temp
В других языках, таких как Java и С#, можно использовать любой объект (а не только строку или число) в качестве ключа в хэш-таблице/хэш-карте, чего нет в JavaScript: ключи просто преобразуются в строки.
var h = {}, k = {};
h[k] = "One";
alert( h[ "[object Object]" ] ); // Alerts "One"
Может быть полезно использовать произвольные объекты в качестве ключей, и в этом случае вы можете использовать что-то вроде jshashtable.
Отказ от ответственности: я написал jshashtable.
В любом из ваших образцов нет никакой разницы. Это все объекты с именованными свойствами. Вы просто указали различные способы создания/ссылки на эти свойства.
Собственно, каждый объект в JavaScript является хешем. Это хэш свойств и методов объекта. Фактически, все в Javascript является хешем (например, список пар имя/значение).
Каждый раз, когда вы вызываете метод объекта, свойство или просто ссылаетесь на любую переменную, вы выполняете внутренний поиск хэша.
Они одинаковы.
вы можете использовать их взаимозаменяемо.
Я думаю, что это все равно. Третья версия может использоваться с динамическими именами свойств. Первый - самый короткий для записи.
Они одинаковы. Точно так же, как []
и new Array()
.
Дополнительные сведения о основных типах JavaScript см. в ссылке MDC Core JavaScript 1.5.
Если вы хотите доказать, что {}
совпадает с new Object()
:
Object.prototype.helloWorld = function () { alert('Foo!'); };
var a = new Object();
var b = {};
a.helloWorld();
b.helloWorld();
!!! ПРЕДУПРЕЖДЕНИЕ ACHTUNG AVERTISSEMENT!!! Никогда, никогда не присваивайте свойству prototype
типа Object
в производственном коде. Вы будете загрязнять все глобальное пространство имен.
Технически, они одинаковы. Когда вы пишете код, вы можете легко сделать myobject['someproprty' + 'somethingElseConcatenated]
, который вы не можете сделать при использовании "точечной нотации" - myobject.someproperty
- это все, что вы можете сделать.
Дуглас Крокфорд, один из авторов ECMAscript, предлагает не использовать синтаксис var a = new Object()
по какой-то причине, который я не совсем понял. Во всяком случае, стоит посмотреть его презентацию, если вы заинтересованы в ней (она состоит из нескольких частей, первая здесь http://video.yahoo.com/watch/111593/1710507)
Каждый движок (браузер) реализует его по-другому, но позволяет сосредоточиться на хром V8 (на основе тестов производительности, которые я выполнил год назад в большинстве современных браузеров, они дают аналогичные повышения производительности, если вы следуете руководящим принципам v8).
В основном это происходит:
Пожалуйста, ознакомьтесь с этими ссылками: https://developers.google.com/v8/design#prop_access
www.quora.com/Are-JavaScript-Objects-implemented-as-HashTables-Is-key-value-access-O-1
jayconrod.com/posts/52/a-tour-of-v8-object-representation
Также очень хорошая лекция: https://www.youtube.com/watch?v=UJPdhx5zTaw
Надеюсь, что это поможет...
На самом деле в JavaScript нет ничего, называемого hashtable или hashmap. Объект в JavaScript ведет себя как "хэш" [объекты в JavaScript - это просто свойства ключа/значения) и, следовательно, путаница.