Разница между объектом и хешем? - PullRequest
54 голосов
/ 17 июля 2009

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

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

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

Ответы [ 11 ]

55 голосов
/ 17 июля 2009

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

18 голосов
/ 17 июля 2009

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

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
6 голосов
/ 02 января 2010

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

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

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

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

4 голосов
/ 23 июля 2009

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

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

4 голосов
/ 17 июля 2009

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

3 голосов
/ 17 июля 2009

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

3 голосов
/ 17 июля 2009

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

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

2 голосов
/ 17 июля 2009

Они одинаковы. Так же, как [] и 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();

!!! ВНИМАНИЕ! ДОСТУП К ПРОВЕРКЕ !!! Никогда, никогда не назначайте свойство prototype типа Object в рабочем коде. Вы будете загрязнять все глобальное пространство имен.

1 голос
/ 22 августа 2016

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

То, что в основном происходит, это:

  1. Для реализации динамического объекта, для которого свойства могут быть добавлены и удалены на лету - хеш-таблица является самым простым решением, но по скорости она не так эффективна, как обычный объект в Java (произвольный доступ ...).
  2. То, что делает V8, пытается угадать, основываясь на нескольких стратегиях, является ли ваш объект обычным объектом (конечный набор свойств установлен в определенном порядке и т. Д.) Или хеш-таблицей. Сначала он предполагает, что это простой объект, и каждое новое свойство вызывает создание новой структуры объекта и копирование на него старой структуры и нового свойства. Если объект относится к категории «трудный» - он перемещается в hushtable.
  3. Если v8 замечает слишком много «ошибок» - он перемещает все в хеш-таблицы - поэтому вы получаете низкую производительность (поэтому вы хотите использовать конструкторы, которые инициируют все ваши члены или структуры, инициированные в json ...)

Пожалуйста, смотрите эти ссылки: https://developers.google.com/v8/design#prop_access

www.quora.com / ли-JavaScript-объекты Реализуемый-а-HashTables-Is-ключ-значение доступа-O-1

jayconrod.com / сообщений / 52 / а-тур-оф-v8-объектного представления

Также очень хорошая лекция: https://www.youtube.com/watch?v=UJPdhx5zTaw

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

1 голос
/ 02 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...