-4

如果必须将一个值定义为 true 或 false,则基于检查另一个值,是否有任何陷阱:

!!someValue

只需快速运行 chrome 的引擎即可:

boolCheck=function(someValue){
    return !! someValue;
}

console.log(boolCheck());           //false
console.log(boolCheck(undefined));  //false
console.log(boolCheck(null));       //false
console.log(boolCheck(1));          //true
console.log(boolCheck({va:1}));     //true
console.log(boolCheck("someTS"));   //true
console.log(boolCheck(boolCheck));  //true    

哪个似乎有效....

4

3 回答 3

6

!运算符总是返回trueor ,因此false假设评估x正常完成,!!x是一个布尔值,相当于EcmaScript 内置函数Boolean(x)where is。Boolean

http://es5.github.com/#x11.4.9

11.4.9 逻辑非运算符 ( !)

产生式 UnaryExpression : ! UnaryExpression的评估如下:

  1. 令 expr 为计算 UnaryExpression 的结果。
  2. 让 oldValue 为 ToBoolean(GetValue(expr))。
  3. 如果 oldValue 是true,则返回false
  4. 返回true

http://es5.github.com/#x9.2解释了ToBoolean 的工作原理

9.2 ToBoolean

根据表 11,抽象操作 ToBoolean 将其参数转换为布尔类型的值:

表 11 - ToBoolean 转换

Argument Type    Result 
Undefined        false
Null             false
Boolean          The result equals the input argument (no conversion).
Number           The result is false if the argument is +0, −0, or NaN; otherwise the result is true.
String           The result is false if the argument is the empty String (its length is zero); otherwise the result is true.
Object           true

上表解释了您的大部分示例,但原因可能并不明显

 console.log(boolCheck());

false。当你调用一个实际参数比形式参数少的函数时,额外的参数有值undefined,如上表!!undefined所示false


这样做有什么问题吗:!!someValue

其意图不如 清晰Boolean(someValue),但它可以跨平台始终如一地工作,并且大多数有经验的 Javascript 开发人员都会认出它。

于 2012-10-19T14:27:35.177 回答
0

这基本上意味着如果它是 0、null、undefined 或 false,则评估为 false,其他任何内容都评估为 true。

顺便说一句,如果在自动转换为布尔值的情况下使用它与仅评估变量本身完全相同。"if(someValue){}" 将与 "if(!!someValue){}" 相同,因为 if 语句会自动将内容评估为布尔值,而 !! 只是在做同样的事情(在那种情况下是多余的)。但显而易见的事实是,当您使用任何类型的布尔值时,99.9999% 的时间最终都会以这种方式进行评估,这就是为什么!除了冗余之外,在代码中确实没有什么位置。

但最后,您对“陷阱”的定义过于模糊,无法在这里理解。我不知道“null”评估为“false”是否会破坏您的预期用途!

于 2012-10-19T15:01:03.453 回答
0

Javascript 不是强类型的,所以如果你没有一些值,它会根据传入的类型产生不同的结果。所以是的,有很多陷阱!

于 2012-10-19T14:27:14.227 回答