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
Почему? Я думал, что результаты были одинаковыми?
Ответы
Ответ 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
}
Живой пример... в то время как вы почти всегда хотите булевы для их тестирования.