你应该使用==或===与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?
} */
}
答案 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
另请注意,此简单示例不会处理null
或undefined
值。
总的来说,我不会在库中使用这种方法进行通用参数验证。我认为,如果用户传入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]"