2010-05-02 4 views
4

Я написал blog post некоторое время назад, в котором подробно описывается, как доступность как примитивных, так и объектных типов значений в JavaScript (для таких вещей, как Number, String и Boolean) вызывает проблемы, включая, помимо прочего, листинг типов для булевых (например, обернутый объектами NaN, "" и false, на самом деле тип-cast для true).Что делает доступность как примитивных, так и объектно-ориентированных значений в JavaScript полезной?

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

Редактировать: Спасибо за быстрые ответы. Я думаю, что создатели JavaScript, предназначенные для обернутых туземцев, как способ создания скалярных значений, имеют дочерние методы, но это явно обратное, что вызывает больше проблем.

+0

@ Delan: Первоначально было предпринято большое усилие, чтобы сделать JavaScript удобным для разработчиков, свободно владеющих Java. Возможно, это была одна (безуспешная) попытка достичь этой цели. В качестве одного из примеров того, насколько это плохо получилось: объект 'Boolean' всегда будет оцениваться как истинный, даже если он имеет значение false. –

+0

Я просто рассматриваю их как детали реализации, чтобы предоставить прототипы для литералов. – eyelidlessness

ответ

0

JavaScript, как и многие языки, имеет хорошие детали и Плохие части.

Это один из действительно очень плохо частей.

ИМХО, там действительно мало пользы, только вред, от типизированных оберток.

Наш друг Douglas Crockford был по всему этому вопросу, на самом деле он был против него с первого дня. Это все, что вам нужно знать.

5

Согласно Douglas Crockford, они никогда не полезны:

типизированных оберток оказываются совершенно ненужными, а иногда сбивает с толку. Не используйте new Boolean или new Number или new String.

Источник: JavaScript: The Good Parts - Приложение B: Плохие детали (Cтр. 114).

Он даже recommended their deprecation для 4-го издания спецификации ECMAScript.

0

Дуглас Крокфорд, хотя он и является одним из самых умных парней, не является Богом - все, что он говорит, не следует слепо следовать. На самом деле есть одна ситуация, когда вы хотели бы предпочесть оболочки с примитивными типами - если вы хотите передать значения по ссылке.

Примитивные значения всегда передаются вокруг по значению и объектов посредством ссылки. Поэтому, если по какой-то причине вам необходимо передать номерами по ссылке, вы можете сделать это с помощью объектов Number. Фактически вы не можете изменить значение числа без потери ссылки (AFAIK), но вы можете добавлять дополнительные параметры по желанию, как и к любому объекту - это то, что примитивные номера не поддерживают.

var nr1 = new Number(123), 
    nr2 = nr1; // reference to nr1 
nr1.name = "number"; //parameter "name" for nr1 is set AFTER the initialization of nr2 
alert(nr2.name); // nr2 has the same parameter as nr1 
+0

Вы также можете утверждать, что существует ограниченная область действия при передаче неизменяемых примитивов по ссылке, потому что, как вы сказали, значения не могут быть изменены. Вы можете добавить дополнительные поля, как в вашем примере, но мне интересно, на практике это должно быть сделано с ** примитивным ** типом. –

+0

Я согласен, что это не самое практичное использование, но я хотел показать фактическую разницу между примитивами и объектами-оболочками, вместо того, чтобы заявить, что Крокфорд сказал что-то, поэтому мы должны повиноваться. Я никогда не использую ** новый номер ** сам по себе, поскольку есть лучшие способы совершить одно и то же поведение, но если кто-то захочет его использовать, то я не вижу причин, почему он/она не должен. – Andris

+0

@ Андрис: Я думаю, причина в том, что они «совершенно ненужны и изредка запутывают». Они не нужны, потому что, как вы сказали, «есть лучшие способы добиться такого же поведения». И они иногда запутываются, потому что в этом случае 'b' оценивает значение true: var b = new Boolean (false); если (b) {alert (b)} ' –