新的布尔()在Javascript中的目的是什么?

有什么用途:

var flag = new Boolean(false); 

相比:

 var flag = false; 

你什么时候会使用new Boolean

全局函数Boolean()可以用于在没有new情况下调用types转换,例如

 var foo = Boolean(bar); // equivalent to `var foo = !!bar` 

当用new调用时,会另外创build一个包装器对象,这意味着您可以为该对象分配任意属性:

 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 。 一次也没有。

使用原始值将会避免混淆,并会缩短代码长度。

如果你需要一个包裹在一个对象中的布尔,那么你也可以像这样使用一个Object对象:

 foo = { value: false }; 

另外,调用Boolean()构造函数(如foo = Boolean(bar) )与使用显式types转换具有相同的效果!! ,后者通常优于前者。

布尔类岩石。 而不是这个意大利面代码🍝:

 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)//返回true布尔(4> 9)//返回false

下一步:所有具有实际价值的东西都会返 例如

100 -4 4.4“hello”“false”//注意即使是string值false也返回true。

假如没有真正的价值,

NaN // var x = 10 /“H”;
//布尔(x); 返回false。

未定义

“”0

-0

空值

现在,布尔对象是一个布尔值的对象包装器。 如果需要,作为第一个parameter passing的值将转换为布尔值。 如果value被省略或者是0,-0,null,false,NaN,undefined或者空string(“”),则对象的初始值为false。 所有其他值,包括任何对象或string“false”,都会创build一个初始值为true的对象。

这允许非常强大的技巧。

有趣的问题:

您使用新的布尔值来创build布尔对象。 可以有很多场景,但我已经在下面讨论了一个场景。

假设你想在你的代码中想要匹配string值和它的数据types的比较,它必须布尔(真/假),那么你将使用新的布尔值,而不是分配简单的假值。

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