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

js 0 1 负数和 Boolean 值的转换

  •  
  •   TomVista · 2019-01-24 09:18:32 +08:00 · 6011 次点击
    这是一个创建于 2166 天前的主题,其中的信息可能已经有所发展或是发生改变。
    console.log(0==true)
    VM70:1 false
    undefined
    console.log(-1=true)
    VM121:1 Uncaught ReferenceError: Invalid left-hand side in assignment
    console.log(-1==true)
    VM135:1 false
    undefined
    if(-1){console.log('1')}
    VM172:1 1
    undefined
    console.log(1==true)
    VM225:1 true
    undefined
    console.log(-1==false)
    VM284:1 false
    undefined
    

    上面是谷歌浏览器控制台.

    谁能说下为什么?

    第 1 条附言  ·  2019-01-24 10:58:32 +08:00
    问这个问题是因为用到了 array.indexOf(),返回-1 和数组索引. 用它来判断数组中是否存在某个值.
    23 条回复    2019-01-30 10:55:27 +08:00
    IsaacYoung
        1
    IsaacYoung  
       2019-01-24 09:21:35 +08:00 via iPhone   ❤️ 1
    true 变成 number 是 1
    false 是 0
    y33772516
        2
    y33772516  
       2019-01-24 09:21:48 +08:00   ❤️ 1
    建议你回去看一下 js 入门……
    zn
        3
    zn  
       2019-01-24 09:21:53 +08:00
    月经贴了。
    js 的类型转换臭名昭著。
    hjdtl
        4
    hjdtl  
       2019-01-24 09:23:20 +08:00   ❤️ 1
    单单上面几行代码完全没问题,多看看红宝书的基础部分
    tionsin
        5
    tionsin  
       2019-01-24 09:25:27 +08:00   ❤️ 1
    1. true == 1 -- true
    2. false == 0 -- true
    3. true === 1 -- false
    4. false === 0 -- false
    ayase252
        6
    ayase252  
       2019-01-24 09:29:06 +08:00 via iPhone   ❤️ 1
    0 == true 相当于 0 == toNumber(true)
    toNumber(true) = 1

    -1 == false 相当于 -1 == toNumber(false)
    toNumber(false) = +0

    if(-1) 相当于 if(toBoolean(-1))
    而 toBoolean 对于参数是 number 的规则是只在参数为-0 +0 NaN 时返回 false,其他情况返回 true
    xuziang111
        7
    xuziang111  
       2019-01-24 09:45:01 +08:00
    永远不要用==就行了,哪来这么多问题
    jera
        8
    jera  
       2019-01-24 09:47:45 +08:00   ❤️ 1
    VDimos
        9
    VDimos  
       2019-01-24 09:50:23 +08:00 via Android   ❤️ 1
    隐式类型转换,js 的" feature"之一
    wu67
        10
    wu67  
       2019-01-24 09:50:41 +08:00
    如果不想管, 一股脑===. 如果你看懂了类型转换, 那可以在适当的地方用上==, 可以稍微灵活一点变换使用
    grewer
        11
    grewer  
       2019-01-24 09:50:56 +08:00
    用 ===
    TomVista
        12
    TomVista  
    OP
       2019-01-24 09:58:24 +08:00
    @jera 感谢
    FakeLeung
        14
    FakeLeung  
       2019-01-24 10:02:51 +08:00   ❤️ 1
    console.log(0==true)
    console.log(-1==true)
    这里因为隐式转换
    true == toNumber(true) == 1
    false == toNumber(false) == 0
    所以
    0 == 1 返回 false
    -1 == 1 返回 false
    1 == 1 返回 true
    -1 == 0 返回 false

    == 会有隐式转换的,如果 x y 有一个是数字,则另一个也会转会数字再比较。

    if(-1){console.log('1')}
    这里就不是用 -1 == true 来做判断的。
    在 js 的 if 里面,只要括号中的表达式是 **真值** 就可以了。
    什么是真值?太多了。
    你只需要知道,什么是假值:false, Boolean(0), null, undefined, 0 (这是数字 0,不是字符串 '0')

    注意,其他的像 [], {}, '0', 'false' 都 **不是假值** !!!!!!
    hungryhenry
        15
    hungryhenry  
       2019-01-24 10:05:52 +08:00
    ==会有隐式转换
    Sapp
        16
    Sapp  
       2019-01-24 10:06:02 +08:00
    js 不要用 == 就屁事没有,就烦一些人以为自己会用了 ==,结果用出了 bug
    DOLLOR
        17
    DOLLOR  
       2019-01-24 10:24:35 +08:00 via Android
    看到代码里写==和!=的,先打死再说
    yyfearth
        18
    yyfearth  
       2019-01-24 10:26:37 +08:00
    @Sapp 我觉得唯一可以用 == 的地方 就是 == null 了
    就是 null / undefined 因为很多时候我们不 care 到底是 值是 null 还是 undefined 还是 压根不存在
    whileFalse
        19
    whileFalse  
       2019-01-24 10:55:55 +08:00
    看到上面说用==就打死的,我倒是觉得没事把数字跟 bool 放一起比的应该打死。
    zhigang1992
        20
    zhigang1992  
       2019-01-24 14:42:27 +08:00
    TomVista
        21
    TomVista  
    OP
       2019-01-24 15:32:56 +08:00
    @zhigang1992 php 是世界上最好的计算机语言
    kwrush
        22
    kwrush  
       2019-01-25 23:51:15 +08:00
    全用===解决大部分问题
    libook
        23
    libook  
       2019-01-30 10:55:27 +08:00
    看是否存在用 Array.prototype.includes,Array.prototype.indexOf 适用于真的想知道找到的东西的 index 的时候用。
    相应的,想找一下数组中有没有一个值,如果有就取出来,用 Array.prototype.find

    在 MDN 上刷一刷 Array 都有哪些方法,会发现 JS 好贴心,好多功能都有现成的了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2828 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:40 · PVG 22:40 · LAX 06:40 · JFK 09:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.