怎么来的![]不是真的吗?

时间:2012-06-14 02:26:38

标签: javascript

我在测试时只是在玩nodejs和chrome的控制台:

[] == true // false
![] == true // false
!![] == true // true

为什么?不是吗?

3 个答案:

答案 0 :(得分:7)

请参阅ECMAScript standard

  

11.4.9逻辑NOT运算符(!)

     

生产 UnaryExpression UnaryExpression 评估如下:

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

    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)将始终具有相同的结果。