2013-06-25 2 views
3

ЗамененоПочему JSLint не нравится объект (объект)

Object(obj) 

С

{}.constructor(obj) 

ли они в точности эквивалентны?

Первоначальные испытания показывают, что они есть.

Почему вторая версия проходит через jslint, а не в первую очередь?

+0

Скорее всего, потому что crockford не любит использовать конструктор Object вместо использования {}. –

ответ

1

Не уверен, что вы упрощаете их, но ни одно из заявлений не выглядит особенно замечательным. Крокфорд действительно советует против new Object() нотации и предпочитает {}, в котором вы увидите много разработчиков js.

Использование var Something = {} vs var Something = new Object() сохраняет вас в конце, но в конце концов, это действительно вопрос предпочтения. Также некоторые люди скажут вам, что их легче читать, когда вы используете литерал объекта. И как указано в here в качестве третьей причины, не имеет значения, кто-то перезаписывает функцию Object.

Есть несколько преимуществ для использования каждого, и у this question было более широкое обсуждение.

В любом случае, если вы делаете new Object() и включили опцию /*jshint newcap:true*/, все должно быть хорошо.

5

Вот краткое изложение разницы (взято из 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.

1

Являются ли они в точности эквивалентными?

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 полностью прекрасное, вы не пытаетесь создать новый объект.

0

Это не только прекрасно, для большинства случаев это ТОЛЬКО решение! Object.create (undefined) vs. Object (undefined), как было предложено, приводит к типу TypeError!

Это также приводит к ненужным (и даже сломанным) копиям объектов: Object.create (new Date()). GetDate();