Зачем использовать {} вместо нового Object() и использовать [] вместо нового Array() и true/false вместо нового Boolean()?

Многие говорят, что вам следует избегать нового Object, new Array() и вместо этого использовать {}. [] и true/false.

В чем преимущества использования литералов-конструкций для получения нового экземпляра объекта или массива вместо использования нового? Я понимаю, что Крокфорду не нравится новый, но является ли это главным аргументом?

Ответ 1

Преимущества литералов объектов и массивов с использованием соответствующих конструкторов:

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

В случае массивов существует дополнительное преимущество литерала: невозможно создать массив с одним элементом, используя только конструктор Array. Например, [3] создаст массив с одним элементом, который является номером 3, а new Array(3) создает массив длиной 3.

Обновление: следующий абзац больше не имеет значения, теперь вопрос был отредактирован.

Что касается булевых, у вас, похоже, есть неправильное представление: new Boolean(false) не совпадает с false. Конструктор Boolean() создает объект Boolean, тогда как false и true являются булевыми примитивами. Фактически, new Boolean(false) оценивается true при принуждении к булевому, например, в инструкции if. Короче говоря, очень редко возникает причина использовать конструктор Boolean(). Вместо этого используйте true и false. Аналогично, другие примитивы, такие как строки и числа, имеют соответствующие конструкторы String() и Number(), которые создают объекты String и Number, которые отличаются от примитивных строк и чисел, и их обычно следует избегать.

Ответ 2

Например, если вы хотите сделать это:

{name:"bla",address:"address"}

новый способ Object():

var o = new Object();
o.name="bla";
o.address="address";

Первый намного короче. И я думаю, что во многих браузерах это было бы быстрее (jsperf testcase).

Ответ 3

Я думаю, что это в основном о лаконичности.

Зачем писать new Array(), когда вы можете писать [] или new Object(), когда можете писать {}?

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

Ответ 4

В большинстве случаев литерал объекта или литерал массива достаточно и проще в использовании. Вы можете даже вызвать или применить методы прототипа (например, [].prototype.slice.call(someObj)). В основном это быстрее. Вы можете заметить, что конструктор {} и [] не может быть перезаписан и что Object и Array являются конструкторами, где {} и [] являются экземплярами.

Ответ 5

Одна из причин, о которых еще не упоминалось, - это двусмысленность при передаче параметров конструктору Array. Все это заданное поведение, это просто причудливый.

new Array(1,2,3); // [1,2,3], that OK
new Array(1); // [undefined], some may expect to get [1] instead

Массив JavaScript инициализируется заданными элементами, за исключением случая, когда один аргумент передается конструктору Array, и этот аргумент является числом. (См. Ниже.) Обратите внимание, что этот специальный случай применяется только к массивам JavaScript, созданным с помощью конструктора Array, а не к литералам массивов, созданным с помощью синтаксиса. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Syntax