5

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

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

怎么会?是不是错了?

4

3 回答 3

7

请参阅ECMAScript 标准

11.4.9 逻辑非运算符 (!)

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

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

9.2 ToBoolean

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

  • 未定义→假
  • 空→假
  • 布尔 → 结果等于输入参数(无转换)。
  • Number → 如果参数为 +0、-0 或 NaN,则结果为 false;否则结果为真。
  • 如果参数是空字符串(其长度为零),则结果为假;否则结果为真。
  • 对象→真

数组是一个对象。

于 2012-06-14T02:34:10.337 回答
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
于 2012-06-14T02:28:30.197 回答
0

[] == true是假的,因为[]不等于true,就像"some string"也不等于一样true

![] == true为假,因为在条件语句中使用时[] 计算为真值:

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

另一件可以帮助你思考的事情![] == falsetrue

!![] == true为真,因为!!根据条件语句中的真假将任何内容转换为真或假值。因此if(obj),并且if(!!obj)将始终具有相同的结果。

于 2012-06-14T02:37:16.863 回答