V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
jason19659
V2EX  ›  JavaScript

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

  •  
  •   jason19659 · 2018-07-30 22:57:43 +08:00 · 5520 次点击
    这是一个创建于 2300 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    17 条回复    2018-08-17 13:46:15 +08:00
    jugelizi
        1
    jugelizi  
       2018-07-30 23:01:26 +08:00
    []!=[] // true
    Zzdex
        2
    Zzdex  
       2018-07-30 23:01:34 +08:00
    [] == ![] //true

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

    楼主可以试下这个题。

    {}+[]===0 //true
    []+{}===0 //false
    console.log({}+[]===0) //false
    jason19659
        7
    jason19659  
    OP
       2018-07-30 23:22:44 +08:00
    @msputup #6 也就是 == 和 if 的逻辑不是统一的??两个人写的还是有什么原因?。。。
    msputup
        8
    msputup  
       2018-07-30 23:23:29 +08:00
    @jason19659 不清楚,自己了解就好了
    shintendo
        9
    shintendo  
       2018-07-30 23:32:03 +08:00   ❤️ 1
    [] 是对象,只要记得所有对象都是 truthy 的就行了,包括 new Boolean(false)也是 truthy 的。
    你的例子所有的问题只是在于==符号的诡异行为,这也是为什么它是 bad parts,当这个符号不存在就好了。
    remon
        10
    remon  
       2018-07-30 23:43:24 +08:00 via Android
    @msputup 这两个确实是不一样的,if 是直接转成 boolean 毫无问题,== 的判断比较不符合直觉,具体规则你可以看一下资料
    beny2mor
        11
    beny2mor  
       2018-07-30 23:43:54 +08:00
    因为你没有使用===
    [] ===false
    chemzqm
        12
    chemzqm  
       2018-07-30 23:45:40 +08:00
    eslint 把 == 禁掉吧,这个除了用在 == null 判定 null 或者 undefined 情况,其它时候是很容易 bug 的。
    rabbbit
        13
    rabbbit  
       2018-07-30 23:59:55 +08:00   ❤️ 1
    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
        14
    rabbbit  
       2018-07-31 00:06:42 +08:00
    更正
    1 因为 Type(true)为 Boolean, 返回 [] == ToNumber(true)
    2 因为 Type([])为 Object, 返回 ToPrimitive([]) == ToNumber(true)
    mingyun
        15
    mingyun  
       2018-07-31 00:23:25 +08:00
    zhzer
        16
    zhzer  
       2018-07-31 09:22:15 +08:00
    new Array() == false // true
    new Object() == false // false

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

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

    简单说叫做特性...用恒等就完事了
    codevvvv9
        17
    codevvvv9  
       2018-08-17 13:46:15 +08:00
    if([]) {1} else {2}
    1、 []这是一个对象,都属于 truthy 值。
    2、只有 null、undefined、0、''、NaN、false 五个 falsey 值。
    所以很明显打印 1,不要相信== ,一直用===就好啦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2642 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:32 · PVG 12:32 · LAX 20:32 · JFK 23:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.