Подтвердить что ты не робот

Разница между объектом и хешем?

В 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;

Можете ли вы представить себе какой-либо другой пример кода, который я должен проиллюстрировать?

Основной вопрос здесь в чем разница между объектом и хешем?

4b9b3361

Ответ 1

Там просто нет. Все три из них буквально равны.

Ответ 2

Это разные системы обозначений, которые вы можете использовать взаимозаменяемо. Существует много ситуаций, когда использование синтаксиса скобки [ ] может быть более привлекательным, примером может служить ссылка на объект с переменной.

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

Ответ 3

В других языках, таких как Java и С#, можно использовать любой объект (а не только строку или число) в качестве ключа в хэш-таблице/хэш-карте, чего нет в JavaScript: ключи просто преобразуются в строки.

var h = {}, k = {};
h[k] = "One";
alert( h[ "[object Object]" ] ); // Alerts "One"

Может быть полезно использовать произвольные объекты в качестве ключей, и в этом случае вы можете использовать что-то вроде jshashtable.

Отказ от ответственности: я написал jshashtable.

Ответ 4

В любом из ваших образцов нет никакой разницы. Это все объекты с именованными свойствами. Вы просто указали различные способы создания/ссылки на эти свойства.

Ответ 5

Собственно, каждый объект в JavaScript является хешем. Это хэш свойств и методов объекта. Фактически, все в Javascript является хешем (например, список пар имя/значение).

Каждый раз, когда вы вызываете метод объекта, свойство или просто ссылаетесь на любую переменную, вы выполняете внутренний поиск хэша.

Ответ 6

Они одинаковы.

вы можете использовать их взаимозаменяемо.

Ответ 7

Я думаю, что это все равно. Третья версия может использоваться с динамическими именами свойств. Первый - самый короткий для записи.

Ответ 8

Они одинаковы. Точно так же, как [] и 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 в производственном коде. Вы будете загрязнять все глобальное пространство имен.

Ответ 9

Технически, они одинаковы. Когда вы пишете код, вы можете легко сделать myobject['someproprty' + 'somethingElseConcatenated], который вы не можете сделать при использовании "точечной нотации" - myobject.someproperty - это все, что вы можете сделать.

Дуглас Крокфорд, один из авторов ECMAscript, предлагает не использовать синтаксис var a = new Object() по какой-то причине, который я не совсем понял. Во всяком случае, стоит посмотреть его презентацию, если вы заинтересованы в ней (она состоит из нескольких частей, первая здесь http://video.yahoo.com/watch/111593/1710507)

Ответ 10

Каждый движок (браузер) реализует его по-другому, но позволяет сосредоточиться на хром V8 (на основе тестов производительности, которые я выполнил год назад в большинстве современных браузеров, они дают аналогичные повышения производительности, если вы следуете руководящим принципам v8).

В основном это происходит:

  • Для реализации динамического объекта, по которому свойства могут быть добавлены и удалены на лету - хеш-таблица является самым простым решением, но быстрее ее не так эффективно, как обычный объект в java (произвольный доступ...).
  • Что V8 пытается угадать на основе нескольких стратегий, если ваш объект является обычным объектом (имеет окончательный набор свойств, заданных в определенном порядке и т.д.) или хеш-таблицу. Сначала он предполагает, что это простой объект, и каждое новое свойство вызывает создание новой структуры объекта и копирование старого на нем плюс новое свойство. Если объект классифицируется как "трудный" - он перемещается в hushtable.
  • Если v8 отмечает слишком много "ошибок" - он перемещает все в хеш-таблицы - поэтому вы получаете плохую производительность (вот почему вы хотите использовать конструкторы, которые инициализируют все ваши члены или структуры, заложенные в json...)

Пожалуйста, ознакомьтесь с этими ссылками: 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

Надеюсь, что это поможет...

Ответ 11

На самом деле в JavaScript нет ничего, называемого hashtable или hashmap. Объект в JavaScript ведет себя как "хэш" [объекты в JavaScript - это просто свойства ключа/значения) и, следовательно, путаница.