Создать пустой объект в JavaScript с помощью {} или new Object ()? - PullRequest
342 голосов
/ 30 октября 2008

Существует два разных способа создания пустого объекта в JavaScript:

var objectA = {}
var objectB = new Object()

Есть ли разница в том, как обработчик скриптов обрабатывает их? Есть ли причина использовать один над другим?

Аналогичным образом можно также создать пустой массив, используя другой синтаксис:

var arrayA = []
var arrayB = new Array()

Ответы [ 9 ]

432 голосов
/ 31 октября 2008

Объекты

Нет смысла использовать new Object(); - тогда как {}; может сделать ваш код более компактным и более читабельным.

Для определения пустых объектов они технически одинаковы. Синтаксис {} короче, аккуратнее (меньше Java-иша) и позволяет мгновенно заполнять объект встроенным образом, например:

var myObject = {
        title:  'Frog',
        url:    '/img/picture.jpg',
        width:  300,
        height: 200
      };

Массивы

Для массивов практически невозможно использовать new Array(); по сравнению с []; - с одним незначительным исключением:

var emptyArray = new Array(100);

создает массив из 100 элементов со всеми слотами, содержащими undefined - что может быть полезно / полезно в определенных ситуациях (например, (new Array(9)).join('Na-Na ') + 'Batman!').

Моя рекомендация

  1. Никогда не используйте new Object(); - он более грубый, чем '{}' и выглядит глупо.
  2. Всегда используйте []; - за исключением случаев, когда вам нужно быстро создать «пустой» массив заранее определенной длины.
85 голосов
/ 14 апреля 2011

Да, есть разница, они не одинаковы. Это правда, что вы получите те же результаты, но двигатель работает по-разному для них обоих. Один из них является литералом объекта, а другой - конструктором, двумя различными способами создания объекта в javascript.

var objectA = {} //This is an object literal

var objectB = new Object() //This is the object constructor

В JS все является объектом, но вы должны знать о следующей вещи с новым Object (): он может получить параметр, и в зависимости от этого параметра он создаст строку, число или просто пустое объект.

Например: new Object(1), вернет число. new Object("hello") вернет строку, это означает, что конструктор объекта может делегировать - в зависимости от параметра - создание объекта другим конструкторам, таким как строка, число и т. Д. Очень важно помнить об этом, когда вы управляете динамические данные для создания объектов ..

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

Я предлагаю вам продолжить чтение различий между литеральной нотацией и конструкторами в javascript, чтобы узнать больше.

11 голосов
/ 30 октября 2008

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

Еще одна вещь: у вас могут быть незначительные ошибки, если вы забудете использовать оператор new. Таким образом, использование литералов поможет вам избежать этой проблемы.

В конечном счете, это будет зависеть как от ситуации, так и от предпочтений.

7 голосов
/ 06 августа 2016

Производительность создания массива

Если вы хотите создать массив без длины:

var arr = []; быстрее, чем var arr = new Array();

Если вы хотите создать пустой массив определенной длины:

var arr = new Array(x); быстрее, чем var arr = []; arr[x-1] = undefined;

Для тестирования нажмите следующее: https://jsfiddle.net/basickarl/ktbbry5b/

Тем не менее, я не знаю, сколько памяти занимают оба, я могу себе представить, что new Array() занимает больше места.

7 голосов
/ 30 октября 2008

Я считаю, что {} было рекомендовано в одном из видео Javascript на здесь в качестве хорошего соглашения о кодировании. new необходимо для псевдоклассического наследования. способ var obj = {}; помогает напомнить вам, что это не классический объектно-ориентированный язык, а прототипный. Таким образом, единственный раз, когда вам действительно понадобится new, это когда вы используете функции конструкторов. Например:

var Mammal = function (name) {
  this.name = name;
};

Mammal.prototype.get_name = function () {
  return this.name;
}

Mammal.prototype.says = function() {
  return this.saying || '';
}

Тогда это используется так:

var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name();

Другое преимущество использования {} по сравнению с new Object состоит в том, что вы можете использовать его для создания литералов объектов в стиле JSON.

7 голосов
/ 30 октября 2008

Литеральный синтаксис объекта и массива {} / [] был введен в JavaScript 1.2, поэтому недоступен (и приведет к синтаксической ошибке) в версиях Netscape Navigator до 4.0.

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

7 голосов
/ 30 октября 2008
var objectA = {}

намного быстрее и, по моему опыту, более широко используется, поэтому, вероятно, лучше принять «стандарт» и сэкономить некоторую печать.

2 голосов
/ 30 октября 2008

Это по сути то же самое. Используйте то, что вам удобнее.

1 голос
/ 09 июля 2017

ОК , есть только 2 разных способа сделать одно и то же! Один называется object literal, а другой является функцией constructor!

Но продолжайте читать, есть несколько вещей, которыми я хотел бы поделиться:

Использование {} делает ваш код более читабельным, при этом не рекомендуется создавать экземпляры Object или других встроенных функций ...

Кроме того, функция Object получает параметры как функцию, например, Object(params) ... но {} - это просто способ запустить объект в JavaScript ...

Использование объектного литерала делает ваш код более понятным и удобным для чтения другими разработчиками, а также соответствует рекомендациям по JavaScript ...

В то время как Object в Javascript может быть почти любым, {} указывает только на объекты javascript, чтобы проверить, как он работает, выполните ниже в вашем коде javascript или консоли:

var n = new Object(1); //Number {[[PrimitiveValue]]: 1}

Удивительно, но это создает число!

var a = new Object([1,2,3]); //[1, 2, 3]

И это создает массив!

var s = new Object('alireza'); //String {0: "a", 1: "l", 2: "i", 3: "r", 4: "e", 5: "z", 6: "a", length: 7, [[PrimitiveValue]]: "alireza"}

и этот странный результат для String!

Так что, если вы создаете объект, рекомендуется использовать литерал объекта, иметь стандартный код и избегать любых ошибок кода, как описано выше, а также, по моему опыту, лучше использовать {}!

...