新的布尔()在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"); }