Создать пустой объект в JavaScript с помощью {} или new Object ()?


370

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

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

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

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

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

6
Предупреждение: есть небольшая разница, которая может вызвать очень раздражающие ошибки! Создание пустого объекта с присвоением ему «{}» в прототипе объекта будет одинаковым экземпляром объекта в каждом экземпляре объекта, созданного оператором «new». Хотя вы используете «новый объект ({})», у вас будут разные экземпляры.
Петер - Восстановить Монику

Стоит упомянуть, что кроме var objectA = {} var objectB = new Object()третьей существует конструкция, которая даст тот же результат:var objectC = Object.create(Object.prototype);
Калицов

{}и [] использовать {}вместо new Object(). Используйте []вместо new Array(). Используйте массивы, когда имена членов будут последовательными целыми числами. Используйте объекты, когда имена членов являются произвольными строками или именами. источник
ilgaar

new Object()и {}не совсем пустые объекты, это объекты с прототипом Object.prototype. Вы можете использовать Object.create(null)для действительно пустого объекта (по крайней мере, в соответствии с документами

Ответы:


459

Объекты

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

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

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

Массивы

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

var emptyArray = new Array(100);

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

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

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

22
Даже если вы используете синтаксис Array (100), этот же массив в 101-й позиции не определен; единственное, что на самом деле делает число, это изменяет значение свойства длины.
Джейсон Бантинг

6
@ Пабло, в этом нет ничего недействительного new Array(100). Прочитайте литературу: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Мар Эрлигссон

9
@ Пабло Я понятия не имею, каков твой аргумент. Как и Дуглас Крокфорд, я рекомендую использовать []. Там нет аргументов. Вы, однако, утверждали, что new Array(100)это как-то «неверно», что не соответствует действительности.
Мар Эрлигссон,

10
Кроме того , следует помнить , что new Array(1,2,3)приводит к [1,2,3], но new Array(1)это не приводит к [1]; таким образом, семантика Arrayпротиворечива и неоправданна.
Данкрамб

3
Я бы добавил, что это Object.create(null)может быть полезно для создания пустого объекта, тогда как { }наследуется от прототипа Object.
Мяу

90

Да, есть разница, они не одинаковы. Это правда, что вы получите те же результаты, но двигатель работает по-разному для них обоих. Один из них является литералом объекта, а другой - конструктором, двумя различными способами создания объекта в 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, чтобы найти больше деталей.


Буквальные обозначения на самом деле более читабельны и лаконичны для создания динамических объектов данных.
Сид

12

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

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

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


8

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

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


11
Netscape 3? Человек, который был в прошлом веке ! :-D
Томалак

8
var objectA = {}

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


1
Быстрее запустить или просто быстрее набрать?
hippietrail

Ну, по общему признанию, я имел в виду «печатать», но, учитывая дополнительное время синтаксического анализа, возможно, чуть-чуть быстрее, тоже в отношении исполнения :-)
Бобби Джек,

2
Кроме того, литералы обычно создаются во время разбора, а new Objectдолжны выполняться во время выполнения.
Phrogz

8

Я полагаю, что это {}было рекомендовано в одном из видеороликов 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

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

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

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

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

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

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

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


arr = new Array(x)эквивалентно arr = []; arr.length = x;, а не присвоению x-1индекса с undefined.
Берги

2

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


Возможно, я слишком углубляюсь в javascript здесь, но они одинаковы? Разве {proto} of Objectравно NULL, а {proto} {}является 'Object.prototype'?
Изаки

@Izhaki Прототип Objectnull, это правильно. Это потому, что Objectзаканчивается цепочка прототипов. Однако экземпляры объектов не имеют прототипа, только конструкторы имеют его. И (new Object()).constructor === ({}).constructor->true
Томалак

Так это неправильно тогда?
Изаки

Вот моя точка зрения: new Object()выдает пустой экземпляр объекта. {}дает пустой экземпляр объекта. Оба эти случая абсолютно неразличимы. Пример, на который вы ссылаетесь, делает что-то еще (он изменяет цепочку прототипов) и на самом деле не применяется здесь - или я не понимаю ваш аргумент.
Томалак

1

ОК , есть только 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!

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


ты дезфоли? в иране?
Эхсан

Привет Эсан, да, но я не живу в Иране, приятель, у вас есть отличный профиль здесь! Приятно познакомиться ...
Алиреза

Могу ли я сохранить ваш номер телефона и получить помощь по программированию?
Эхсан

Я вижу, вы используете телеграмму.
Эхсан

Да, конечно, мы можем поделиться некоторыми знаниями по телеграмме точно! ___
Алиреза
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.