ЗамененоПочему JSLint не нравится объект (объект)
Object(obj)
С
{}.constructor(obj)
ли они в точности эквивалентны?
Первоначальные испытания показывают, что они есть.
Почему вторая версия проходит через jslint, а не в первую очередь?
ЗамененоПочему JSLint не нравится объект (объект)
Object(obj)
С
{}.constructor(obj)
ли они в точности эквивалентны?
Первоначальные испытания показывают, что они есть.
Почему вторая версия проходит через jslint, а не в первую очередь?
Не уверен, что вы упрощаете их, но ни одно из заявлений не выглядит особенно замечательным. Крокфорд действительно советует против new Object()
нотации и предпочитает {}
, в котором вы увидите много разработчиков js.
Использование var Something = {}
vs var Something = new Object()
сохраняет вас в конце, но в конце концов, это действительно вопрос предпочтения. Также некоторые люди скажут вам, что их легче читать, когда вы используете литерал объекта. И как указано в here в качестве третьей причины, не имеет значения, кто-то перезаписывает функцию Object.
Есть несколько преимуществ для использования каждого, и у this question было более широкое обсуждение.
В любом случае, если вы делаете new Object()
и включили опцию /*jshint newcap:true*/
, все должно быть хорошо.
Вот краткое изложение разницы (взято из jslinterrors):
// Overwrite the Object function.
window.Object = 10;
// Execution of the following will raise:
// "TypeError: number is not a function" (Chrome)
var x = new Object();
Объекта буквального понятия var x = {};
удается независимо от состояния window.Object.
Являются ли они в точности эквивалентными?
No. Можно либо переписать глобальную переменную Object
или Object.prototype.constructor
свойство, чтобы получить отличные результаты.
Почему вторая версия проходит через jslint, а не в первую очередь?
сообщение «ошибка» должен вам сказать:
Use the object literal notation {} or Object.create(null).
Это сообщение на самом деле должен [только] показать для использований new Object
(где это вполне законно, так как Crockford considers new
harmful и object literal notation is cleaner). По какой-то причине jslint также выводит предупреждение для вашего кода, хотя оно не применяется. Никогда не доверяйте JsLint, он не понимает ваш код, но просматривает его только для шаблонов с ошибками beginner-errors.
Ваше использование функции Object
полностью прекрасное, вы не пытаетесь создать новый объект.
Это не только прекрасно, для большинства случаев это ТОЛЬКО решение! Object.create (undefined) vs. Object (undefined), как было предложено, приводит к типу TypeError!
Это также приводит к ненужным (и даже сломанным) копиям объектов: Object.create (new Date()). GetDate();
Скорее всего, потому что crockford не любит использовать конструктор Object вместо использования {}. –