当我测试这个时,我只是在玩 nodejs 和 chrome 的控制台:
[] == true // false
![] == true // false
!![] == true // true
怎么会?是不是错了?
当我测试这个时,我只是在玩 nodejs 和 chrome 的控制台:
[] == true // false
![] == true // false
!![] == true // true
怎么会?是不是错了?
请参阅ECMAScript 标准:
11.4.9 逻辑非运算符 (!)
产生式 UnaryExpression : ! UnaryExpression的评估如下:
- 令expr为计算UnaryExpression的结果。
- 让oldValue为 ToBoolean(GetValue( expr ))。
- 如果oldValue为true,则返回false。
- 返回真。
9.2 ToBoolean
根据表 11,抽象操作 ToBoolean 将其参数转换为布尔类型的值:
- 未定义→假
- 空→假
- 布尔 → 结果等于输入参数(无转换)。
- Number → 如果参数为 +0、-0 或 NaN,则结果为 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
为假,因为在条件语句中使用时[]
计算为真值:
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
为真,因为!!
根据条件语句中的真假将任何内容转换为真或假值。因此if(obj)
,并且if(!!obj)
将始终具有相同的结果。