如果变量定义了陷阱,则为true或false

时间:2012-10-19 14:23:20

标签: javascript

如果一个值必须定义为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    

SEEMS工作....

3 个答案:

答案 0 :(得分:6)

!运算符始终返回truefalse,因此假设x的评估正常完成,!!x是一个等效的布尔值其中Boolean(x)是EcmaScript内置函数的Boolean

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

  

11.4.9逻辑NOT运算符(!

     

生产 UnaryExpression ! UnaryExpression 评估如下:

     
      
  1. 让expr成为评估UnaryExpression的结果。
  2.   
  3. 让oldValue为ToBoolean(GetValue(expr))。
  4.   
  5. 如果oldValue为true,请返回false
  6.   
  7. 返回true
  8.   

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

  

9.2 ToBoolean

     

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

     

表11 - ToBoolean Conversions

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,并且如上表所示!!undefinedfalse


  

有没有问题:!!someValue

意图不如Boolean(someValue)那么清晰,但它可以跨平台一致地工作,而且大多数有经验的Javascript开发人员都会识别它。

答案 1 :(得分:0)

Javascript不是强类型的,所以如果你某个值,它会产生不同的结果,具体取决于传入的类型。所以是的,有很多陷阱!

答案 2 :(得分:0)

这基本上意味着如果它为0,null,undefined或false,则计算为false,其他任何值为true。

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

但最后,你对“陷阱”的定义过于模糊,无法在此理解。如果“null”评估为“false”会破坏您的预期用途,我不会有任何想法!