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

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

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

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

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

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

Ответ 1

Объекты

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

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

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!').

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

var objectA = {}

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

Ответ 5

Я считаю, что {} был рекомендован в одном из Javascript vids на здесь как хорошее соглашение о кодировании. 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.

Ответ 6

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

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

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

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

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

Ответ 8

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

Ответ 9

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

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

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

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

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

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

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

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

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!

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