новый номер () против номера () - PullRequest
53 голосов
/ 18 января 2011

В чем разница между new Number() и Number()?Я получаю, что new Number() создает Number объект, а Number() - это просто функция, но когда мне следует вызывать какую и почему?

В связанной заметке Mozilla говорит:

Не используйте логический объект для преобразования не логического значения в логическое значение.Вместо этого используйте Boolean как функцию для выполнения этой задачи.

x = Boolean(expression);     // preferred
x = new Boolean(expression); // don't use

Почему это так?Я думал, что результаты были одинаковыми?

Ответы [ 3 ]

51 голосов
/ 18 января 2011

Boolean(expression) просто преобразует выражение в логическое примитивное значение , а new Boolean(expression) создаст объект-оболочку вокруг преобразованного логического значения.

Разницу можно увидеть с помощью этого:

// Note I'm using strict-equals
new Boolean("true") === true; // false
Boolean("true") === true; // true

А также с этим (спасибо @hobbs):

typeof new Boolean("true"); // "object"
typeof Boolean("true"); // "boolean"

Примечание: Хотя объект-оболочка будет преобразован в примитив автоматически при необходимости (и наоборот), есть только один случай, который я могу вспомнить, где вы хотите использовать new Boolean, или любой издругие оболочки для примитивов - если вы хотите прикрепить свойства к одному значению.Например:

var b = new Boolean(true);
b.relatedMessage = "this should be true initially";
alert(b.relatedMessage); // will work

var b = true;
b.relatedMessage = "this should be true initially";
alert(b.relatedMessage); // undefined
31 голосов
/ 18 января 2011
new Number( x )

создает новый объект-оболочку.Я не думаю, что есть веская причина, чтобы когда-либо использовать это.

Number( x )

преобразует переданный аргумент в числовое значение.Вы можете использовать это для приведения некоторой переменной к типу Number.Однако для этого нужно выполнить ту же работу:

+x

Обычно:

Вам не нужны такие:

new Number()
new String()
new Boolean()

Вы можете использовать их для каста:

Number( value )
String( value )
Boolean( value )

Однако, есть более простые решения для кастинга:

+x // cast to Number
'' + x // cast to String
!!x // cast to Boolean
17 голосов
/ 18 января 2011

Всегда стоит проконсультироваться спецификация ; из раздела 15.7.1:

Когда Number вызывается как функция, а не как конструктор, он выполняет преобразование типа.

Аналогично, используя Boolean как функцию (15.6.1):

Когда Boolean вызывается как функция, а не как конструктор, он выполняет преобразование типа.

... что означает, что вы обращаетесь к Разделу 9.2 («ToBoolean»):

Абстрактная операция ToBoolean преобразует свой аргумент в значение типа Boolean в соответствии с таблицей 11:
Undefined = false
Null = false
Boolean = Результат равен входному аргументу (без преобразования).
Number = Результат равен false, если аргумент равен +0, −0 или NaN; в противном случае результат верен.
String = Результат равен false, если аргумент является пустой строкой (ее длина равна нулю); в противном случае результат верен.
Object = true

Разница между new Boolean(value) и Boolean(value) в основном в том, что первый возвращает объект, но последний возвращает примитив согласно приведенному выше. Это имеет значение , потому что объекты правдивы:

var b = new Boolean(false);

display(b);            // Displays "false"
if (b) {
  display("true");     // This is the path that gets taken, displaying "true"
}
else {
  display("false");    // This path does NOT get taken
}

Живой пример ... тогда как вы почти всегда хотите иметь логические значения для тестирования их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...