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

Какова цель нового Boolean() в Javascript?

В чем заключается использование:

var flag = new Boolean(false); 

по сравнению с:

var flag = false;

Когда вы на самом деле используете new Boolean?

4b9b3361

Ответ 1

Глобальная функция 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.

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

Ответ 2

В то время как другие упоминали теорию, позвольте мне рассказать о практической части:

Поскольку объекты Boolean (как объекты вообще) всегда правдивы, считать их плохими. За многие годы JS-программирования я никогда не использовал их, и я не помню, чтобы видеть Boolean в коде других народов. Даже не один раз.

Использование примитивных значений позволит избежать путаницы и сделает ваш код немного короче.

Если вам понадобится bool, завернутый в объект, вы можете также использовать объект Object, например:

foo = { value: false };

Кроме того, вызов конструктора Boolean() как функции (как в foo = Boolean(bar)) имеет тот же эффект, что и явное приведение типов при использовании !!, и последнее обычно предпочтительнее первого.

Ответ 3

Булевой класс пород. Вместо этого кода спагетти 🍝:

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));

Намного лучше.

Ответ 4

Перед вышеупомянутым вопросом сначала булевы функции, 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.

Это позволяет очень мощные трюки.

Ответ 5

Интересный вопрос:

Вы используете новый 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");
}