用途:
var flag = new Boolean(false);
相比之下:
var flag = false;
你什么时候会真正使用 new Boolean?
new Boolean
全局函数 Boolean()可用于类型铸造时调用没有 new,例如
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。
valueOf()
true
false
我从未遇到过能够将属性分配给布尔型的有用应用程序,但在需要引用原始值的情况下,装箱可能会很有用。
当其他人提到这个理论时,让我来谈谈实践部分:
因为 Boolean对象(通常是对象)总是真实的,所以使用它们被认为是不好的做法。在多年的 JS 编程中,我从未使用过它们,我也不记得在其他人的代码中看到过 Boolean。一次都没有。
Boolean
使用基元值可以避免混淆,并使代码更短一些。
如果你需要一个包装在对象中的 bool,你也可以像这样使用一个 Object对象:
Object
foo = { value: false };
此外,将 Boolean()构造函数作为函数调用(如在 foo = Boolean(bar)中)与使用 !!进行显式类型转换具有相同的效果,后者通常优于前者。
foo = Boolean(bar)
!!
有趣的问题:
使用新的布尔值创建布尔对象。可能有许多场景,但是我已经在下面讨论了一个场景。
假设你想在你的代码中进行一个比较,你想匹配字符串值和它的数据类型,它必须 bool (true/false) ,那么你将使用新的 boolean 而不是赋予简单的 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"); }
在上述问题之前,首先是布尔函数
Boolean(10 > 4) // return true Boolean(4 > 9) // return false
其次,所有有实际价值的东西都返回真值
100 -4 4.4 "hello" "false" // note even the string value false return true.
没有实际价值的事物返回虚假的
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, -0, null, false, NaN, undefined
""
这使得非常强大的技巧。