推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
jason19659

又想起了一个黑 js 的故事,困扰好久了。。当初就没有解答

  •  
  •   jason19659 · Jul 30, 2018 · 6468 views
    This topic created in 3023 days ago, the information mentioned may be changed or developed.

    首先我们输入 [] == true //false
    也就是[] == false // true
    这个很好理解。。。
    然后我们继续 if([]) {1} else {2}
    从上面可知[]是 false 那么应该打印 2
    然后控制台打印了 1.。。。

    到底 TMD 是为什么为什么为什么为什么为什么啊啊啊啊啊啊啊!!!!

    17 replies  •  2018-08-17 13:46:15 +08:00
    jugelizi
    jugelizi
    Jul 30, 2018
    1
    []!=[] // true
    Zzdex
    Zzdex
    Jul 30, 2018
    2
    [] == ![] //true

    :doge
    remon
    remon
    Jul 30, 2018 via Android❤️5
    3
    一个是比较,[] == false 最后变成了 0 == 0,当然是 true 了,而 if 里面是转成 boolean,[]转成 boolean 就是 true,没毛病
    darkkylin
    darkkylin
    Jul 30, 2018❤️1
    4
    1、隐式类型转换
    2、falsy 值:false,null,'',0,NaN,undefined
    3、!![] //true,所以 if ( true ){1}
    jason19659
    jason19659
    OP
    Jul 30, 2018
    5
    @remon #3 布尔比较最后为什么会变成 0 == 0 ? 理论上不是应该在 false == false 才是最后
    msputup
    msputup
    Jul 30, 2018❤️1
    6
    JS 比较的时候,会强制转换为 Number。楼主可以试下 Number([])
    而判断的时候。会强制转换为 Boolean。

    楼主可以试下这个题。

    {}+[]===0 //true
    []+{}===0 //false
    console.log({}+[]===0) //false
    jason19659
    jason19659
    OP
    Jul 30, 2018
    7
    @msputup #6 也就是 == 和 if 的逻辑不是统一的??两个人写的还是有什么原因?。。。
    msputup
    msputup
    Jul 30, 2018
    8
    @jason19659 不清楚,自己了解就好了
    shintendo
    shintendo
    Jul 30, 2018❤️1
    9
    [] 是对象,只要记得所有对象都是 truthy 的就行了,包括 new Boolean(false)也是 truthy 的。
    你的例子所有的问题只是在于==符号的诡异行为,这也是为什么它是 bad parts,当这个符号不存在就好了。
    remon
    remon
    Jul 30, 2018 via Android
    10
    @msputup 这两个确实是不一样的,if 是直接转成 boolean 毫无问题,== 的判断比较不符合直觉,具体规则你可以看一下资料
    beny2mor
    beny2mor
    Jul 30, 2018
    11
    因为你没有使用===
    [] ===false
    chemzqm
    chemzqm
    Jul 30, 2018
    12
    eslint 把 == 禁掉吧,这个除了用在 == null 判定 null 或者 undefined 情况,其它时候是很容易 bug 的。
    rabbbit
    rabbbit
    Jul 30, 2018❤️1
    13
    if 操作调用 ToBoolean(GetValue(exprRef)) ,所有 Object 都返回 true
    https://es5.github.io/#x12.5

    [] == true
    1 因为 Type(true)为 Boolean, 返回 [] == ToNumber(y)
    2 因为 Type([])为 Object, 返回 ToPrimitive(x) == ToNumber(y)
    ToPrimitive 通过调用[[DefaultValue]] ,返回对象的默认值(就是分别调用 toString valueOf)
    https://es5.github.io/#x11.9.3
    rabbbit
    rabbbit
    Jul 31, 2018
    14
    更正
    1 因为 Type(true)为 Boolean, 返回 [] == ToNumber(true)
    2 因为 Type([])为 Object, 返回 ToPrimitive([]) == ToNumber(true)
    zhzer
    zhzer
    Jul 31, 2018
    16
    new Array() == false // true
    new Object() == false // false

    [0] == false // true
    [1] == false // false

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

    简单说叫做特性...用恒等就完事了
    codevvvv9
    codevvvv9
    Aug 17, 2018
    17
    if([]) {1} else {2}
    1、 []这是一个对象,都属于 truthy 值。
    2、只有 null、undefined、0、''、NaN、false 五个 falsey 值。
    所以很明显打印 1,不要相信== ,一直用===就好啦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3178 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 01:09 · PVG 09:09 · LAX 17:09 · JFK 20:09
    ♥ Do have faith in what you're doing.