有什么用:
var flag = new Boolean(false);
相比:
var flag = false;
你什么时候真正使用new Boolean
?
有什么用:
var flag = new Boolean(false);
相比:
var flag = false;
你什么时候真正使用new Boolean
?
全局函数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
.
我从来没有遇到过能够将属性分配给布尔值的有用应用程序,但是在需要引用原始值的情况下,装箱可能很有用。
在其他人提到理论的时候,让我谈谈实践部分:
因为Boolean
对象(作为一般对象)总是真实的,所以使用它们被认为是不好的做法。在多年的JS编程中,我从来没有使用过它们,我也不记得Boolean
在别人的代码中看到过s。一次都无。
使用原始值将避免混淆,并使您的代码更短一些。
如果您需要一个包含在对象中的 bool,您不妨使用Object
这样的对象:
foo = { value: false };
此外,将Boolean()
构造函数作为函数调用(如在 中foo = Boolean(bar)
)与使用的显式类型转换具有相同的效果!!
,并且后者通常优于前者。
在上述问题之前首先是布尔函数,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.
没有实际价值的一切都返回假,例如
NaN
var x = 10 / "H"; // Boolean(x); return false.
undefined
""
0
-0
false
null
现在该Boolean
对象是一个布尔值的对象包装器。如有必要,作为第一个参数传递的值将转换为布尔值。如果省略 value 或 is0, -0, null, false, NaN, undefined
或空字符串 ( ""
),则对象的初始值为 false。所有其他值,包括任何对象或字符串“false”,都会创建一个初始值为 true 的对象。
这允许非常强大的技巧。
有趣的问题:
您使用 new Boolean 创建一个布尔对象。可能有很多情况,但我在下面讨论了一种情况。
假设您想要在代码中进行比较,您想要匹配字符串值及其数据类型,并且它必须为 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");
}