Зачем использовать {} вместо нового 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