【问题标题】:What is the purpose of new Boolean() in Javascript?Javascript中new Boolean()的目的是什么?
【发布时间】:2010-10-25 18:34:20
【问题描述】:

有什么用:

var flag = new Boolean(false); 

相比:

var flag = false;

你什么时候会真正使用new Boolean

【问题讨论】:

标签: javascript boolean


【解决方案1】:

全局函数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(someVar) 可用于转换为布尔基元,但请记住 Boolean(false) == false,但 new Boolean(false) == true,因为它是一个对象
  • 你并不总是需要使用valueOf——它会在需要原语时自动调用。例如,boolean_object === true 将强制对象为其底层原语(但!boolean_object 不会)。
  • @torazaburo: === 不强制 - new Boolean(true) === true 是假的
  • @Christoph 对不起,我的错误。但是,boolean_object == true(两个等号,不是三个)WILL 强制(我很确定,刚刚测试过)。
  • @torazaburo: == 确实强制 - 该算法在 ECMA-262 ed5,第 11.9.3 节中描述;将new Boolean(false) == false 翻译回Javascript,实际执行的比较是Number(new Boolean(false).valueOf()) === Number(false);该算法有一些“有趣”的结果,例如new Number(0) == false,即使Boolean(new Number(0)) === true
【解决方案2】:

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

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

使用原始值可以避免混淆,并使您的代码更短。

如果您需要一个包含在对象中的 bool,您不妨像这样使用 Object 对象:

foo = { value: false };

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

【讨论】:

  • 您声称对一对 not 运算符 !! 具有普遍偏好。但是!! 的目的和效果似乎没有传统的Boolean() 转换器那么明显,我想知道这里是否需要考虑代码清晰度。
  • 一张便条。永远不要使用new,这会导致Boolean Object。然后每次你都必须在条件句中使用foo.valueOf()。相反,只需将 Boolean 作为一个简单地导致类型转换的函数调用,即 Boolean(bar) === !!bar
【解决方案3】:

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

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 对象是一个布尔值的对象包装器。如有必要,作为第一个参数传递的值将转换为布尔值。如果 value 被省略或者是 0, -0, null, false, NaN, undefined,或者是空字符串 (""),则该对象的初始值为 false。所有其他值,包括任何对象或字符串“false”,都会创建一个初始值为 true 的对象。

这允许使用非常强大的技巧。

【讨论】:

    【解决方案4】:

    有趣的问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      相关资源
      最近更新 更多