怎么来了![] 不是真的

how come ![] is not true?

本文关键字:真的 来了      更新时间:2023-09-26

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

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

怎么来了?难道没有错吗?

参见 ECMAScript 标准:

11.4.9 逻辑非运算符 ( !

生产 一元表达式一元表达式的计算方法如下:

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

9.2 托布尔值

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

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

数组是一个对象。

它与浏览器如何处理 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

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

![] == true 为 false,因为在条件语句中使用时[]计算结果为 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

另一件可以帮助您思考的事情是 ![] == false 将是 true .

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

相关文章: