Что делает доступным использование примитивных и объектно-ориентированных значений в JavaScript полезным? - PullRequest
4 голосов
/ 02 мая 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 02 мая 2010

Согласно Дугласу Крокфорду , они никогда не будут полезны:

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

Источник: JavaScript: Хорошие части - Приложение B. Плохие части (Страница 114).

Он даже рекомендовал их исключить для 4-го издания спецификации ECMAScript .

0 голосов
/ 02 мая 2010

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

Примитивные значения всегда передаются вокруг по значению , а объекты по ссылке . Так что если по какой-то причине вам нужно передать числа по ссылке , то вы можете сделать это с объектами 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 голосов
/ 02 мая 2010

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

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

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

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

...