Javascript 怎么会![]不是真的吗?

Javascript 怎么会![]不是真的吗?,javascript,Javascript,当我测试这个时,我只是在玩nodejs和chrome的控制台: [] == true // false ![] == true // false !![] == true // true 为什么?是不是错了?这与浏览器如何处理JS中的隐式转换有关。 由于[]是一个空数组,它的计算结果为false: [] == true false == true ![] == true false == true !![] == true !false == true true == true 但是

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

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

为什么?是不是错了?

这与浏览器如何处理JS中的隐式转换有关。
由于
[]
是一个空数组,它的计算结果为
false

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

但是,
not
ing将对象转换为值为
false
的布尔值:

[] == true
false == true
![] == true
false == true
!![] == true
!false == true
true == true
但是,
boolean([])
将返回
true

但是,
not
ing将其转换为值为
的布尔值!错误

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

这就是除非需要,否则不推荐隐式转换的原因:

"1" == true
true == true

"1" === true
false
见:

11.4.9逻辑非运算符(!) 生产一元表达式:UnaryExpression的计算方法如下:

  • 让expr作为计算一元表达式的结果
  • 让oldValue为ToBoolean(GetValue(expr))
  • 如果oldValue为true,则返回false
  • 返回真值
  • 9.2托布利安 抽象操作ToBoolean根据表11将其参数转换为布尔类型的值:

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

    数组是一个对象。

    []==true
    为false,因为
    []
    不等于
    true
    ,就像
    “某些字符串”
    也不等于
    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,因为
    根据条件语句中的值是真还是假,将任何内容转换为真或假值。因此,
    if(obj)
    if(!!obj)
    将始终具有相同的结果。

    在node.js上是相同的(编辑:当然,它是相同的引擎。但在IE的控制台上也是相同的)@zneak这是一个错误,修复了
    布尔([])
    ->真的,试试看。@hugo_leonardo,因为隐式转换和显式转换不一样。欢迎使用Javascript,其中强制转换不是同构的。@FatalError:
    ==
    算法有点复杂,这是无法回避的事实。首先要记住的是,
    ==
    没有对其操作数进行布尔运算。当人们假设这一点时,它会变得令人困惑,这是可以理解的。这就是为什么除非需要,否则不使用隐式的。@ColeJohnson考虑
    运算符将LHS转换为布尔值,并且RHS已经是布尔值,结果将相同。对于后两种算法,两种算法(和比较算法)的步骤完全相同,因此使用一种算法比使用另一种算法没有任何好处。可能有很好的理由去做
    []==0
    而不是
    []==0
    ,因为前者可能是真的,也可能是假的(取决于arra中的成员),但后者总是假的。但是,奇怪的是,空对象是更接近真或假的D:@hugo_leonardo:当作为布尔值计算时,空对象总是
    true
    a={};a==真;a==假
    在我的控制台中,两个比较结果都返回false…@hugo_leonardo:
    =
    运算符不会将其操作数强制转换为布尔值values@hugo_leonardo:研究抽象相等比较算法,您会发现,当两个操作数的类型不同时,转换几乎总是一个toNumber转换。对象获得TopPrimitive转换。对于数组,我相信它首先得到字符串,然后是toNumber。因此,空数组将被转换为
    ,然后转换为
    0
    。布尔值转换为数字,因此
    false
    0
    0==0
    我个人使用术语“相等”表示
    =
    ,“相同”表示
    ==
    ,当两者之间的区别很重要时。只要我的2美分。