Javascript中新的Boolean()的目的是什么?

时间:2009-05-13 06:10:21

标签: javascript boolean

有什么用途:

var flag = new Boolean(false); 

与之相比:

var flag = false;

您何时会实际使用new Boolean

5 个答案:

答案 0 :(得分:63)

在没有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

我从来没有遇到过能够为booleans分配属性的有用应用程序,但是在需要引用原始值的情况下,装箱可能很有用。

答案 1 :(得分:20)

虽然其他人提到了理论,但让我谈谈实际部分:

因为Boolean个对象(一般来说是对象)总是真实的,所以使用它们被认为是不好的做法。在JS编程的多年中,我从未使用它们,我也记不起在其他人的代码中看到Boolean。甚至没有一次。

使用原始值可以避免混淆并使代码缩短一点。

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

foo = { value: false };

此外,将Boolean()构造函数作为函数调用(如在foo = Boolean(bar)中)与使用!!的显式类型转换具有相同的效果,后者通常优先于前者。 / p>

答案 2 :(得分:4)

布尔类摇滚。而不是这个意大利面条代码:

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

现在好多了。

答案 3 :(得分:1)

在上述问题之前,首先是布尔函数Boolean ()

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

下一步:具有实际价值的一切都返回真实。 E.g

100
-4
4.4
"hello"
"false" // note even the string value false return true.
没有实际值的everthing返回false 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的对象。

这允许非常强大的技巧。

答案 4 :(得分:-2)

有趣的问题:

使用new Boolean创建布尔对象。可能有很多场景,但我在下面讨论了一个场景。

假设您希望在代码中进行比较,以便匹配字符串值及其数据类型,并且必须使用bool(true / false),那么您将使用new 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");
}