В чем заключается использование:
var flag = new Boolean(false);
по сравнению с:
var flag = false;
Когда вы на самом деле используете new Boolean
?
В чем заключается использование:
var flag = new Boolean(false);
по сравнению с:
var flag = false;
Когда вы на самом деле используете new Boolean
?
Глобальная функция Boolean()
может использоваться для приведения типов при вызове без new
, например
var foo = Boolean(bar); // equivalent to `var foo = !!bar`
При вызове с new
объект-обертка будет создан дополнительно, что означает, что вы можете назначить произвольные свойства объекту:
var foo = new Boolean(bar); // equivalent to `var foo = Object(Boolean(bar));`
foo.baz = 'quux';
alert(foo.baz);
Это невозможно с примитивными значениями, поскольку примитивы не могут сохранять свойства:
var foo = true;
foo.baz = 'quux';
alert(foo.baz); // `foo.baz` is `undefined`
Присвоение свойства примитиву не приводит к ошибке из-за автоматического бокса, т.е.
foo.baz = 'quux';
будет интерпретироваться как
// create and immediately discard a wrapper object:
(new Boolean(foo)).baz = 'quux';
Чтобы вернуть примитивное значение, вам придется вызвать метод valueOf()
. Это необходимо, если вы хотите фактически использовать обернутое значение, потому что объекты всегда оценивают true
в булевых контекстах - даже если обернутое значение false
.
Я никогда не сталкивался с полезным приложением, позволяющим присваивать свойства логическим значениям, но бокс может быть полезен в случаях, когда необходима ссылка на примитивное значение.
В то время как другие упоминали теорию, позвольте мне рассказать о практической части:
Поскольку объекты Boolean
(как объекты вообще) всегда правдивы, считать их плохими. За многие годы JS-программирования я никогда не использовал их, и я не помню, чтобы видеть Boolean
в коде других народов. Даже не один раз.
Использование примитивных значений позволит избежать путаницы и сделает ваш код немного короче.
Если вам понадобится bool, завернутый в объект, вы можете также использовать объект Object
, например:
foo = { value: false };
Кроме того, вызов конструктора Boolean()
как функции (как в foo = Boolean(bar)
) имеет тот же эффект, что и явное приведение типов при использовании !!
, и последнее обычно предпочтительнее первого.
Булевой класс пород. Вместо этого кода спагетти 🍝:
if (foo===true) this.launch();
else this.dontLaunch();
Вы можете делать то, что сделает любой великий программист, и продлить прототип!
Boolean.prototype.ifTrue=function(ifFunc,elseFunc){
if (this.valueOf()===true) ifFunc();
else elseFunc();
}
var foo=new Boolean(/*expression*/);
foo.ifTrue(this.launch.bind(this),this.dontLaunch.bind(this));
Намного лучше.
Перед вышеупомянутым вопросом сначала булевы функции, Boolean ()
Boolean(10 > 4) // return true
Boolean(4 > 9) // return false
Далее: все с реальным значением возвращают true. Например
100
-4
4.4
"hello"
"false" // note even the string value false return true.
everthing без реального значения return false E.g
NaN
var x = 10 / "H"; // Boolean(x); return false.
undefined
""
0
-0
false
null
Теперь объект Boolean
является оберткой объекта для логического значения. Значение, переданное как первый параметр, при необходимости преобразуется в булево значение. Если значение опущено или оно 0, -0, null, false, NaN, undefined
или пустая строка (""
), объект имеет начальное значение false. Все остальные значения, включая любой объект или строку "false", создают объект с начальным значением true.
Это позволяет очень мощные трюки.
Интересный вопрос:
Вы используете новый Boolean для создания логического объекта. Могут быть много сценариев, но я обсуждал ниже один сценарий.
Предположим, что вы хотите сравнить в своем коде, где вы хотите сопоставить строковое значение и его тип данных, и ему нужно bool (true/false), тогда вы будете использовать новое логическое значение вместо назначения простого ложного значения.
var flag = false;
var flag2 = new Boolean (false);
alert(typeof flag); //boolean object
alert(typeof flag2); //simple object
if (flag === flag2){
alert("Value and datatype match");
}
else{
alert("Value and datatype do not match");
}