你们 js 用过双等号吗 - V2EX
ethusdt
0.01D

你们 js 用过双等号吗

  •  1
     
  •   ethusdt Dec 31, 2025 9725 views
    This topic created in 134 days ago, the information mentioned may be changed or developed.

    写了很多年 js ,都是用三等号。即使类型不匹配也要强制使用 Number String 等方式转换一下再判断。

    现在发现双等号直接可以帮你转类型后再比较。

    甚至可以这么用: if (a == 0) { ... }, 这里当 a 是 0 / "" / false 时候都成立。

    看到很多项目都把双等号给禁了( eslint eqeqeq ),没仔细研究,但有些情况下还是不错的。

    87 replies    2026-01-05 14:30:47 +08:00
    aisles1
        1
    aisles1  
       Dec 31, 2025   1
    无脑===
    june4
        2
    june4  
       Dec 31, 2025
    val == null 应该是 js 基本常识技能吧?那判断为 null 你是怎么做的? val === null || val === undefined?
    gorvey
        3
    gorvey  
       Dec 31, 2025   13
    隐式转换罢了
    qiaobeier
        4
    qiaobeier  
       Dec 31, 2025
    十多年前我用这个当面试题来着
    evan1
        5
    evan1  
    PRO
       Dec 31, 2025
    @june4 #2 直接 if (value)判断是否有值
    ethusdt
        6
    ethusdt  
    OP
       Dec 31, 2025
    @june4 啊?判断 null 还要 val == null 么?直接 if (val) 不行么?
    l864494871
        7
    l864494871  
       Dec 31, 2025
    @ethusdt 他的意思是当判断是否为 null 时只需要==即可。
    ixixi
        8
    ixixi  
       Dec 31, 2025
    不知道啊 ,我用 ts
    wu00
        9
    wu00  
       Dec 31, 2025
    十几年前好像都是==
    maplezzz
        10
    maplezzz  
       Dec 31, 2025
    隐式转换设计的太复杂了,不同的类型,各种各样可能的 case ,用的时候很容易出现意料之外的问题
    jydeng
        11
    jydeng  
       Dec 31, 2025
    太麻烦了,容易出问题
    june4
        12
    june4  
       Dec 31, 2025
    @ethusdt if (val)当然不行,这个把 空串,0 之类的都算 false 了,很多时候就是判断是空值(null),不是没有值
    MinorN
        13
    MinorN  
       Dec 31, 2025
    坚决 === ,我同事曾经用 == 找了 1h 的 bug ,然后叫我帮忙看看哪里出了问题
    cpstar
        14
    cpstar  
       Dec 31, 2025
    if(!!val)
    masterclock
        15
    masterclock  
       Dec 31, 2025   3
    完全不适用 ==,只用 ===
    不直接使用 if(a),全部包装成基于业务语义的 isNull isEmpty isValid isGood...
    g17
        16
    g17  
       Dec 31, 2025   1
    无脑 === ,手动转类型
    aloxaf
        17
    aloxaf  
       Dec 31, 2025
    > 甚至可以这么用: if (a == 0) { ... }, 这里当 a 是 0 / "" / false 时候都成立。

    我觉得代码中就不应该出现 a 有可能是 0 / "" / false 的情况……
    temporary
        18
    temporary  
       Dec 31, 2025
    如果需要展示的情况,0 需要展示,而 "" NaN null undefined 大概率要展示成 -
    ethusdt
        19
    ethusdt  
    OP
       Dec 31, 2025
    @june4 #12 哦,我明白了,就是判断某个值是 null ,而非 0/空字符串/false 之类的具体值。但是业务场景下,这些都是一样效果,用户没有填一个值那就给默认 false/0/空字符串,除非有特殊需求默认成其他值。

    我想到的就这点了。能再举几个例子场景么。
    craftsmanship
        20
    craftsmanship  
       Dec 31, 2025 via Android
    @masterclock 是个提升代码可读性和健壮性的好习惯
    crocoBaby
        21
    crocoBaby  
       Dec 31, 2025
    卧槽,我一直偷懒用的==,确实遇到 0 和 false 和 null 的问题
    craftsmanship
        22
    craftsmanship  
       Dec 31, 2025 via Android   3
    总有人说 JS 简单 结果在双等和三等上面都分不清楚适用场景,,,也分不清 falsy value 和 nullish value
    真特么菜。
    craftsmanship
        23
    craftsmanship  
       Dec 31, 2025 via Android
    JS 是个由于初期设计太过垃圾而导致引入过多不必要的复杂性的语言 有大量细节需要记忆 由于不规范导致的灵活性让人可以玩花活 写出来的代码难读难维护 反直觉的设计让不熟悉这门语言的人踩很多坑 很多使用者根本意识不到自己在干什么 看看上面的回复就知道了
    从改善这些缺点来讲 TS 是大救星
    shintendo
        24
    shintendo  
       Dec 31, 2025
    ESLint 关于===的规则("eqeqeq")里,有个选项开关就是允许==null 。

    此外早年流行的几个 JS 代码规范,StandardJS, Airbnb, Google Style Guide, 全都是“禁止使用==,但==null 例外”,算是通行做法。



    craftsmanship
        25
    craftsmanship  
       Dec 31, 2025 via Android
    @maplezzz 不是设计得太复杂了 而是当初压根没有设计 完全 PL 外行拍脑袋搞出来的垃圾
    craftsmanship
        26
    craftsmanship  
       Dec 31, 2025 via Android
    @shintendo 我原来就是遵守这个规范 但现在感觉#15 的做法更好 完全避免 JS 的那些隐式语义 包成 util 不费劲而且一目了然 让所有人都能读懂意图
    tonytonychopper
        27
    tonytonychopper  
       Dec 31, 2025
    @crocoBaby 这还能偷懒吗,出 bug 了就老实了
    tonytonychopper
        28
    tonytonychopper  
       Dec 31, 2025
    @craftsmanship #23 是的,但是这些设计问题变成了面试题来拷打从业者……
    meteor957
        29
    meteor957  
       Dec 31, 2025
    @tonytonychopper ===和== 甚至面试都不应该问,完全没有使用 == 的理由,默认===就行。
    craftsmanship
        30
    craftsmanship  
       Dec 31, 2025 via Android
    @tonytonychopper 怎么说呢 为了八股而八股的话 完全没必要 属于做题大国的坏习惯 但八股里考察的点 其实是有意义的 只是以八股的形式出现很恶心
    比如隐式转换就能看出使用者对 JS 的熟悉程度 也是非常常见的坑点 想全记住规则并不现实 因为确实太复杂 但这个都不了解的话 那完全不合格
    然而所有这些在 AI 时代已经不重要了…
    craftsmanship
        31
    craftsmanship  
       Dec 31, 2025 via Android
    @meteor957 有 #24 已经提过了 再具体点说就是 唯一使用双等的场景 就是用来判断 nullish value
    面试时值得问的点太多了 隐式转换确实不合适 因为这应该是 JS 基本功 默认是了解的
    GuguDan
        32
    GuguDan  
       Dec 31, 2025
    用的,因为有时候接口就是会返回 ‘0’
    craftsmanship
        33
    craftsmanship  
       Dec 31, 2025 via Android
    @GuguDan 坏习惯 这种应该 Number(val) === 0 而非偷懒使用双等的隐式转换
    想玩花活?没问题 +val === 0
    少打几个字母 让代码变得晦涩难读 有意义吗?完全没意义 但很多人这样写 显得自己很 6
    这就是 JS
    hafuhafu
        34
    hafuhafu  
       Dec 31, 2025
    以前前端工程化没流行开的时候,只用`==`的人大把,甚至反而很多人都不知道`===`。特别是一些后端顺便写前端的人。
    多亏了前端工程化和各种创建项目的脚手架以及开源项目里面用了 ESLint ,倒逼大家去学习一些规范。
    说个我感觉很搞笑的事,以前看到有不少人搜 ESlint 报红怎么解决,最后的方案是卸载掉...
    gdw1986
        35
    gdw1986  
       Dec 31, 2025 via Android
    这种现在交给 AI 应该没什么难度吧
    Shaar
        36
    Shaar  
       Dec 31, 2025
    我刚入行做 cocos-js 开发的时候,根本不知道===这个东西,一直用== 直到出现了一个隐形 bug ,查了非常久才知道有==和===的问题,十年了,我都无法忘怀这个东西
    crocoBaby
        37
    crocoBaby  
       Dec 31, 2025
    @tonytonychopper 借机跟测试小妹说话
    lueluev
        38
    lueluev  
       Dec 31, 2025
    我去,开倒车
    wangtian2020
        39
    wangtian2020  
       Dec 31, 2025
    我只用 == 很少用严格===。
    项目我一个前端没人管我。 == 能没问题的地方 === 一定没问题。=== 会出现问题的地方 == 可能反而没问题。
    通常情况下只有会 string number 之类的在进行比较,其他一切比较情况都是写法有问题
    wangtian2020
        40
    wangtian2020  
       Dec 31, 2025
    @aloxaf 动态类型转换为 false 的我直接 if(a){} 了
    woodcutter
        41
    woodcutter  
       Dec 31, 2025
    小程序页面穿参会把 number 转成 string ,一般我想省事就用==,懒得再转了。
    akakidz
        42
    akakidz  
       Dec 31, 2025
    双等号就是邪修,TC39 委员会的人,也不能把双等号在项目里用明白 太复杂了!下一个维护项目的人,难道要在脑子里跑一遍所有场景下状态机 预判前人写的双等号可能要处理的业务逻辑?
    silverwzw
        43
    silverwzw  
       Dec 31, 2025
    用 a === b || (a !== a && b !== b)
    realpg
        44
    realpg  
    PRO
       Dec 31, 2025
    我是邪修 我很常用 == 必要时候才 ===

    大概是弱类型语言用的太多了 对==和===一般不会写出 bug
    zbinlin
        45
    zbinlin  
       Dec 31, 2025
    只有一种情况会用:判断是 等于或不等于 null 和 undefined 时。
    meteor957
        46
    meteor957  
       Dec 31, 2025 via Android
    @craftsmanship 不太懂,难道你说的这种场景用 === 做不到嘛,为啥是唯一场景,==只是更简洁吧。
    ASHYWHISPER
        47
    ASHYWHISPER  
       Dec 31, 2025
    我在想,反正基本上都是无脑===为什么 ES 规范,不直接将==表示===的作用呢,当然我是刚学前端的 JS 初学者
    craftsmanship
        48
    craftsmanship  
       Dec 31, 2025 via Android
    @akakidz 是的 所以 JS 心智负担很大
    kdwnil
        49
    kdwnil  
       Dec 31, 2025 via Android   1
    多数时候都不应该用==,但特殊情境下,手搓超短代码的时候可以靠这种隐式转换省一点空间,就用了
    craftsmanship
        50
    craftsmanship  
       Dec 31, 2025 via Android
    @meteor957 可能我表述得不太清楚 不是只有双等能做得到 而是说双等只在这种情况下值得使用
    craftsmanship
        51
    craftsmanship  
       Dec 31, 2025 via Android
    @ASHYWHISPER 当然是为了兼容性 怎么可能在语言的新版本里更改原来语法的语义呢 这就是所谓的历史包袱重
    meteor957
        52
    meteor957  
       Dec 31, 2025
    @craftsmanship 既然如此,=== 依然可以 cover 所有场景且没有太多成本。我刚刚说面试都不应该问的原因是不管是实际开发还是面试都应该默认遵守使用===的规则,当你使用==时本身就引入了不必要的心智负担。
    craftsmanship
        53
    craftsmanship  
       Dec 31, 2025 via Android
    @meteor957 是的 完全赞同
    qwerty12345
        54
    qwerty12345  
       Dec 31, 2025
    老项目里全是[==],还好没有出过什么大问题,现在重构了,基本都是[===]
    v21984
        55
    v21984  
       Dec 31, 2025
    除 == null 或者 == undefined 这两种情况外,全使用 ===
    CarryOnHxy
        56
    CarryOnHxy  
       Dec 31, 2025
    eslint eqeqeq 规则有个 smart 模式
    TimPeake
        57
    TimPeake  
       Dec 31, 2025
    不用 怕别人看出我是前端仔
    rm0gang0rf
        58
    rm0gang0rf  
       Dec 31, 2025
    全是==也挺好
    TimPeake
        59
    TimPeake  
       Dec 31, 2025
    @TimPeake 噢不对,是用。不用 === 。
    ---------
    之前很久了 某个群里 吹牛闲聊,发了 类似 xxxx === xxxx 这样的伪代码,结果群里立马有人回复,“你小子前端仔 ?”
    chairuosen
        60
    chairuosen  
       Dec 31, 2025
    IamUNICODE
        61
    IamUNICODE  
       Dec 31, 2025
    我是直接设置 eslint 警告的,不接受==
    freezebreze
        62
    freezebreze  
       Dec 31, 2025
    现在回想起来以前学 js 。在没有 ai 的年代,简直是在历屎中遨游
    Strive123456
        63
    Strive123456  
       Dec 31, 2025
    肯定是用三等
    94
        64
    94  
       Dec 31, 2025
    早期很长一段时间用的 == 因为学编程的时候就是 = 和 ==。
    后面业务写的多起来之后才慢慢改成 ===。一些地方该用 _.isNill 之类的就用,而不是自己去写空值判断逻辑。

    隐式转换有些时候是好用,但是有一些时候会埋坑。
    LandCruiser
        65
    LandCruiser  
       Dec 31, 2025
    处理==null 这种问题的唯一正确方式是,if ( valid ){}else{} 而不是 if ( unvalid ){}
    icyalala
        66
    icyalala  
       Dec 31, 2025
    在我还没怎么写过 js 的时候我就听说过这个表格了:
    https://dorey.github.io/Javascript-Equality-Table/

    以至于后面真的写起来每次都胆战心惊...
    SanjinGG
        67
    SanjinGG  
       Dec 31, 2025
    @june4 #12 但 js 中的 null 更多应该指的是未赋值的对象,或者空对象,一般也就 val 是 object 时才会出现 null ,他为什么存在空串,0 的情况? if(val)完全够用。js 只是没有强约束,但应该也没憨憨就一个变量,一直赋值不同类型值一路使用吧?
    SanjinGG
        68
    SanjinGG  
       Dec 31, 2025
    @aloxaf 我也觉得是这样,属实是过于担心了
    AV1
        69
    AV1  
       Dec 31, 2025
    @icyalala 哈哈,这种真值表其实还有 PHP 版的
    https://github.com/sentientmachine/php_equality_charts
    june4
        70
    june4  
       Dec 31, 2025
    @SanjinGG 啊,你哪怕是用 ts,就没有见过这种类型 `number | null | undefined` ? 或 `string | null | ndefiend`
    Aliceeeeee
        71
    Aliceeeeee  
       Dec 31, 2025 via iPhone
    禁用==。同时也绝不使用 null, 一律 undefined
    Aliceeeeee
        72
    Aliceeeeee  
       Dec 31, 2025 via iPhone
    @craftsmanship "掌握"了语言设计上的两个 billion dollar mistake 然后沾沾自喜么
    craftsmanship
        73
    craftsmanship  
       Dec 31, 2025 via Android
    @Aliceeeeee 你需要增强阅读理解能力
    AoEiuV020JP
        74
    AoEiuV020JP  
       Dec 31, 2025
    确实有时候感觉双等号是不是方便点, 尤其奇葩项目中 userId 是 string|number 混用的,
    但 AI 写的代码总是用三等号, 搞得我都不好意思要求双等号了,
    不过我是纯 ts ,
    nicenight
        75
    nicenight  
       Dec 31, 2025
    只要你不用单等号,我都能接受。你要是像我同事一样用单等号做判断,那我就要放狗了
    duzhuo
        76
    duzhuo  
       Dec 31, 2025
    @gorvey 看一次笑一次哈哈
    qingshui33
        77
    qingshui33  
       Jan 1
    @gorvey 昨天刚遇到了,0.4 / 10000 ,出来结果是 0.39999...
    craftsmanship
        78
    craftsmanship  
       Jan 1 via Android
    @Aliceeeeee 同时 null 和 undefined 的语义是不一样的 这种 billion dollar mistake 你要不要了解下再写 JS ?
    SanjinGG
        79
    SanjinGG  
       Jan 1 via Android
    @june4 没见过,初始化大部分也是赋值空字符串,根本不会给 null ,undefined 也只有在开发阶段会出现,到最终上线根本不会让他是 undefined
    liuxue
        80
    liuxue  
       Jan 1
    自己写的代码不用,别人的代码逻辑简单的,能找到类型的就换掉。
    goodboy95
        81
    goodboy95  
       Jan 3 via Android
    没这个胆子用双等号。
    顺便,对于你说的这种“判断是否不存在有效值”,我们一般直接!a
    kenvix
        82
    kenvix  
       Jan 3
    有一种情况可以安全使用==,就是判断是否为 null 或 undefined ,这种情况我都是这样做的,没有任何问题。
    对于==,null 只 与 undefined 相等,null 不会与任何其他值相等
    kenvix
        83
    kenvix  
       Jan 3
    @evan1 #5 你这个是重大错误,if (value)会导致 0 和空串被判为 false ,比==还危险
    NerbraskaGuy
        84
    NerbraskaGuy  
       Jan 4
    无脑用===的遇到后端接口明明规定是 1 实际给'1',而且不同接口 string 和 number 看心情来,这种的就老实了
    humbass
        85
    humbass  
       Jan 5
    都没讲到重点,实际上浏览器的环境有关。

    前端表单的内容都是 字符串,当后端数据一起计算拼接的时候, === 就不是很方便,因此 == 就派上用场了。
    比如 input 的年龄,if (age == 18) ,这里的 age 实际上是 String, 引擎自己转了,非要用 === 比较,你得 parseInt(age) === 18 ,代码太丑了。
    Ketteiron
        86
    Ketteiron  
       Jan 5
    @shintendo #24 eslint 已经弃用了 allow-null ,可以传递一个对象例如 ["error", "always", {"null": "ignore"}] 进行排除。https://eslint.org/docs/latest/rules/eqeqeq
    我认为 == null 是个不太好的编程习惯,带有隐式判断
    我自己无论何时都会显式编写 if (x === null || x === undefined)
    不过也没用上几次,在有了 ?. 和 ?? 后,几乎不存在需要使用 ==null 的场景
    BetterJason
        87
    BetterJason  
       Jan 5
    @GuguDan #32 这种就是后端太垃圾导致的后果,要吗都用 0 要吗都用“0”, 一会儿这样 一会儿那样, 这种人就是把代码当儿戏,我现在接手的项目里面就是这样,导致出了很多问题,特别恶心人!
    About     Help     Advertise     Blog     API     FAQ     Solana     5543 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 242ms UTC 08:36 PVG 16:36 LAX 01:36 JFK 04:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86