如果一个值必须定义为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工作....
答案 0 :(得分:6)
!
运算符始终返回true
或false
,因此假设x
的评估正常完成,!!x
是一个等效的布尔值其中Boolean(x)
是EcmaScript内置函数的Boolean
。
http://es5.github.com/#x11.4.9说
11.4.9逻辑NOT运算符(
!
)生产 UnaryExpression :
!
UnaryExpression 评估如下:
- 让expr成为评估UnaryExpression的结果。
- 让oldValue为ToBoolean(GetValue(expr))。
- 如果oldValue为
true
,请返回false
。- 返回
醇>true
。
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
,并且如上表所示!!undefined
为false
。
有没有问题:
!!someValue
?
意图不如Boolean(someValue)
那么清晰,但它可以跨平台一致地工作,而且大多数有经验的Javascript开发人员都会识别它。
答案 1 :(得分:0)
Javascript不是强类型的,所以如果你不某个值,它会产生不同的结果,具体取决于传入的类型。所以是的,有很多陷阱!
答案 2 :(得分:0)
这基本上意味着如果它为0,null,undefined或false,则计算为false,其他任何值为true。
顺便说一句,如果在自动转换为布尔值的情况下使用,则与仅仅评估变量本身完全相同。 “if(someValue){}”将与“if(!! someValue){}”相同,因为if语句会自动将内容计算为布尔值,而!!正在做同样的事情(在那种情况下多余)。但事实上,当您使用任何类型的布尔值时,99.9999%的时间最终将以这种方式进行评估,这就是为什么!!除了冗余之外,在代码中确实占有很少的位置。
但最后,你对“陷阱”的定义过于模糊,无法在此理解。如果“null”评估为“false”会破坏您的预期用途,我不会有任何想法!