Подтвердить что ты не робот

New Number() vs Number()

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

В соответствующей заметке Mozilla говорит:

Do not use a Boolean object to convert a non-boolean value to a boolean value. Instead, use Boolean as a function to perform this task.

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

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

4b9b3361

Ответ 1

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

Ответ 2

new Number( x )

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

Number( x )

преобразует переданный аргумент в значение Number. Вы можете использовать это, чтобы передать некоторую переменную в тип 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

Ответ 3

Всегда стоит консультироваться спецификацию; из раздела 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= Результат является ложным, если аргументом является пустая строка (ее длина равна нулю); иначе результат будет правдой.
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
}

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