我在测试时只是在玩nodejs和chrome的控制台:
[] == true // false
![] == true // false
!![] == true // true
为什么?不是吗?
答案 0 :(得分:7)
11.4.9逻辑NOT运算符(!)
生产 UnaryExpression :! UnaryExpression 评估如下:
- 让 expr 成为评估 UnaryExpression 的结果。
- 让 oldValue 为ToBoolean(GetValue( expr ))。
- 如果 oldValue 为 true ,请返回 false 。
- 返回 true 。
醇>9.2 ToBoolean
抽象操作ToBoolean根据表11将其参数转换为Boolean类型的值:
- undefined→false
- null→false
- Boolean→结果等于输入参数(无转换)。
- Number→如果参数为+ 0,-0或NaN,则结果为false;否则结果是 真。
- 如果参数为空String(其长度为零),则结果为false; 否则结果是真的。
- 对象→真实
数组是一个对象。
答案 1 :(得分:2)
它与浏览器如何处理JS中的隐式转换有关。
<小时/> 由于[]
是一个空数组,因此它的计算结果为false
:
[] == true
false == true
<小时/> 但是,
not
它会将对象转换为值为false
的布尔值:
![] == true
false == true
但是,boolean([])
将返回true
。
not
会将其转换为值为!false
的布尔值:
!![] == true
!false == true
true == true
<小时/> 这就是为什么除非需要,否则不会推荐隐式转换:
"1" == true
true == true
"1" === true
false
答案 2 :(得分:0)
[] == true
是错误的,因为[]
不等于true
,就像"some string"
也不等于true
。
![] == true
为false,因为[]
在条件语句中使用时将计算为真值:
if([]) console.log('[]');
if(![]) console.log('![]');
// the result will be '[]' because [] will evaluate to true
// in a conditional even though it doesn't equal true
可能有助于您考虑的另一件事是![] == false
true
。
!![] == true
为true,因为!!
根据条件语句中的真或假将任何内容转换为true或false值。因此if(obj)
和if(!!obj)
将始终具有相同的结果。