Какова цель нового Boolean () в Javascript? - PullRequest
57 голосов
/ 13 мая 2009

Какая польза от:

var flag = new Boolean(false); 

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

var flag = false;

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

Ответы [ 5 ]

64 голосов
/ 13 мая 2009

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

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

21 голосов
/ 21 июня 2013

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

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

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

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

foo = { value: false };

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

4 голосов
/ 10 сентября 2014

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

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

Теперь намного лучше.

1 голос
/ 14 апреля 2016

Перед вышеупомянутым вопросом сначала булева функция, Boolean ()

Boolean(10 > 4) // return true
Boolean(4 > 9) // return false

Далее: все с реальным значением возвращает true. * Например 1005 *

100
-4
4.4
"hello"
"false" // note even the string value false return true.

все, что не имеет реального значения, возвращает ложь 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.

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

0 голосов
/ 23 июня 2015

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

Вы используете новый логический тип для создания логического объекта. Может быть много сценариев, но я обсудил ниже один сценарий.

Предположим, вам нужно сравнение в вашем коде, где вы хотите сопоставить строковое значение и его тип данных, и оно должно быть 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");
}
...