比较javascript中的布尔/布尔值

时间:2014-09-09 01:01:02

标签: javascript boolean

你应该使用==或===与js中的布尔值/布尔值进行比较吗? 问题是:

> true == new Boolean(true)
< true
> true === new Boolean(true)
< false

同样适用于String:

> 'foo' == new String('foo')
< true
> 'foo' === new String('foo')
< false

我理解这种情况正在发生,因为String和Boolean是对象,而true,false和'string'是文字。

function foo(bar){
  /* if statement here{ 
    I want the code between these two lines to execute when and only when foo is true,
    or new Boolean(true), which operator to use?
  } */

}

3 个答案:

答案 0 :(得分:0)

您可以尝试使用valueOf方法获取包装布尔值的基础值:

function isTrue(b) { 
   return b.valueOf() === true; 
}

isTrue(true);                      // true
isTrue(new Boolean(true));         // true
isTrue(false);                     // false
isTrue(new Boolean(false));        // false
isTrue("true");                    // false

但是,我应该注意,可以为自定义类型甚至内置类型覆盖此功能,例如:

Boolean.prototype.valueOf = function () { return true; }; 
isTrue(false);                     // true

另请注意,此简单示例不会处理nullundefined值。

总的来说,我不会在库中使用这种方法进行通用参数验证。我认为,如果用户传入new Boolean(true)他们可能有特定原因这样做(或Barmar说的话,那么它是相当安全的,这是他们的错误码)。

答案 1 :(得分:0)

一般来说,如果你知道你正在处理对象变体,那么在性能和可读性方面,最好坚持使用.valueOf() === some_boolean而不是使用非严格的等号。例如:

var b = new Boolean(true);
b.valueOf() === true; // true

通常最好在没有特定原因的情况下避免布尔对象,因为由于这种混淆,它会很快导致错误。当它重要时,它还会产生更精简,更快速的代码。

var b = new Boolean(foo);

// ...

if (!b) {
  // This always executes, leading to some impossibly hidden bugs.
}

答案 2 :(得分:0)

我提出了这个解决方案。

function typeOf(obj) {
  return Object.prototype.toString.call(obj).slice(8, -1);
}

function foo(bar){
  if((typeOf(bar) === 'Boolean' && bar.valueOf() === true) || bar === true){
     // is this perfect though ?
  }
}



> Object.prototype.toString.call(true)
< "[object Boolean]"
> Object.prototype.toString.call(false)
< "[object Boolean]"
> Object.prototype.toString.call(Boolean(true))
< "[object Boolean]"
> Object.prototype.toString.call(Boolean(false))
< "[object Boolean]"
> Object.prototype.toString.call(new Boolean(true))
< "[object Boolean]"
> Object.prototype.toString.call(new Boolean(false))
< "[object Boolean]"
> Object.prototype.toString.call(undefined)
< "[object Undefined]"
> Object.prototype.toString.call(null)
< "[object Null]"
> Object.prototype.toString.call(1)
< "[object Number]"