最近在恶补 Javascript,对运算符这个地方不太理解 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
LxnChan
V2EX    Javascript

最近在恶补 Javascript,对运算符这个地方不太理解

  •  
  •   LxnChan 2022-04-12 14:49:42 +08:00 5796 次点击
    这是一个创建于 1309 天前的主题,其中的信息可能已经有所发展或是发生改变。

    pic20220412b

    不是很理解 js 里面的递增的逻辑,这个递增的步长是多少啊

    47 条回复    2022-04-13 13:40:18 +08:00
    kop1989smurf
        1
    kop1989smurf  
       2022-04-12 14:52:35 +08:00
    指的是最后两行为何相差 2 ?

    首先,这并不是 JS 的知识。

    x++是先附值再累加。
    ++x 是先累加再附值。
    gdrk
        2
    gdrk  
       2022-04-12 14:54:27 +08:00   1
    div class="reply_content">++在后只是执行了这次运算,不会影响这次输出。你在 num3++后再 log 一次 num3 就明白了。
    kop1989smurf
        3
    kop1989smurf  
       2022-04-12 14:55:41 +08:00
    如果将最后两行逻辑拆开,那么倒数第二行(console.log(num3++))的逻辑是:

    输出 num3;
    num3 = num3 + 1;
    LxnChan
        4
    LxnChan  
    OP
       2022-04-12 14:55:47 +08:00
    @kop1989smurf 那这个先赋值再累加有什么意义吗?输出的应该还是变量的值吧,另外累加这个逻辑是怎么样的,每次加 1 吗还是什么值
    LxnChan
        5
    LxnChan  
    OP
       2022-04-12 14:57:19 +08:00
    @gdrk 也就是说在倒数第二行的时候 num3 的值就已经是 22 了吗?
    LxnChan
        6
    LxnChan  
    OP
       2022-04-12 14:58:29 +08:00
    @gdrk 理解了,谢谢。
    wangtian2020
        7
    wangtian2020  
       2022-04-12 15:01:29 +08:00
    let i=0
    i++
    console.log(i)



    let i=0
    ++i
    console.log(i)

    的运算结果是一样的。
    通常都是这种写法。
    把 变量++ 写在表达式里的意义一般就是为了炫酷,自己写代码的时候,如果不知道代码的运行结果是什么,那么最好就不要这么写。


    运算符 ++ 和 -- 可以置于变量前,也可以置于变量后。

    当运算符置于变量后,被称为“后置形式”:counter++。
    当运算符置于变量前,被称为“前置形式”:++counter 。
    两者都做同一件事:将变量 counter 与 1 相加。

    https://zh.Javascript.info/operators
    ChefIsAwesome
        8
    ChefIsAwesome  
       2022-04-12 15:04:38 +08:00
    顺序问题。为了不绕自己,不绕他人,拒绝使用 ++ 操作符就完事了。
    agdhole
        9
    agdhole  
       2022-04-12 15:05:13 +08:00
    这玩意了解下就行,不要在自己的代码里面写,折磨自己和同事
    shintendo
        10
    shintendo  
       2022-04-12 15:15:18 +08:00   1
    相信我,你不知道这个,写出来的代码比较好
    Leviathann
        11
    Leviathann  
       2022-04-12 15:16:57 +08:00
    这是当年还没有表达式化控制流这个思想的时代为了方便在语法上开洞的行为
    weixiangzhe
        12
    weixiangzhe  
       2022-04-12 15:45:16 +08:00
    ++ 已经是垃圾,不要用就完了
    i += 1 清晰明了
    LxnChan
        14
    LxnChan  
    OP
       2022-04-12 16:38:27 +08:00
    @retrocode 啊这,我试了一下居然还是真的 https://flow.lxnchan.cn/files/pic/pic20220412d.png
    @weixiangzhe okok
    @Leviathann 开洞是什么
    @shintendo @agdhole 哈哈哈

    啊最主要的是看 js 代码完全不知道结果是啥
    gogogo1203
        15
    gogogo1203  
       2022-04-12 16:48:28 +08:00
    vs code 有一个 js playground 的插件 quokka. 有很多团队的 eslint rule 直接不让用++
        16
    hazardous  
       2022-04-12 16:55:37 +08:00
    别的语言不也是这样的么。

    其实这个不算奇淫巧计了,行为结果是固定的,我觉得写代码时可以用。

    要避免的是 "func(a++, ++a)" 这种
    pengtdyd
        17
    pengtdyd  
       2022-04-12 16:57:49 +08:00
    JS 的运算是玄学,哈哈哈
    lvsijun
        18
    lvsijun  
       2022-04-12 16:58:05 +08:00
    @LxnChan 先赋值后累加 一般用于循环操作 for(let i = 0 ; i<10; i++){ console.log(i)} //循环十次
    deplivesb
        19
    deplivesb  
       2022-04-12 17:07:12 +08:00
    别 tm 的++ 了,+= 不香么,非要搞自己也搞别人
    NCry
        20
    NCry  
       2022-04-12 17:30:03 +08:00
    除了 for 循环里面,基本不用 ++ 了。另外这个两个顺序差异不止存在于 js ,其他语言也有的吧。
    kaiki
        21
    kaiki  
       2022-04-12 17:32:58 +08:00
    尽量只在 for 循环里用++,可以少很多事
    ksco
        23
    ksco  
       2022-04-12 17:54:02 +08:00
    ++ 虽然是旧时代的遗产,但在少数场景中还是有用的。

    随便举个例子

    num = 0
    if (condA) { setElem(num++, a) }
    if (condB) { setElem(num++, b) }
    if (condC) { setElem(num++, c) }

    print("added: ", num)

    另外在 C 语言中,往前步进指针使用 p++ 也比 p += 1 更加直观。
    yangzzzzzz
        24
    yangzzzzzz  
       2022-04-12 17:55:12 +08:00
    建议看一下表严肃的 js 精讲 一节几分钟 很快就看完了
    dfourc
        25
    dfourc  
       2022-04-12 18:19:33 +08:00
    @pengtdyd #17 js 不背这个锅。。
    xQmQ
        26
    xQmQ  
       2022-04-12 18:43:35 +08:00
    插个楼,例如 c 和 c++,用 i++ 和 ++i ,是不是会被编译器优化,然后效率一致?

    我以前记得说 i++ 要调个临时变量保存当前值,所以在我 for(;;) 里一直用 ++i
    xQmQ
        27
    xQmQ  
       2022-04-12 18:50:31 +08:00
    @xQmQ

    自个试着汇编了一下看看,for() 里面 i++ 和 ++i 编译出来的汇编代码没有差异
    printf("%d\n", i++) 比 printf("%d\n", ++i) 的汇编多一步,估计就是寄存器拿着当前值去打印了,然后再自增

    不太懂汇编,也没看太明白
    yukinotech
        28
    yukinotech  
       2022-04-12 22:40:13 +08:00
    i+=1 多写一个字符不会死的。。
    ericgui
        29
    ericgui  
       2022-04-12 22:50:53 +08:00
    我就知道一个 i++
    其他的真的用不上
    autoxbc
        30
    autoxbc  
       2022-04-12 23:15:32 +08:00
    不让用 ++ 就是扯了,应该是不要使用 ++ 操作的返回值

    a = i++ ;
    // 这是糟粕

    some code ...
    i++ ;
    // 这样毫无问题
    lisongeee
        31
    lisongeee  
       2022-04-13 00:00:34 +08:00
    eslint no-plusplus: "error"
    AllenHua
        32
    AllenHua  
       2022-04-13 00:41:59 +08:00 via iPhone
    记得是左右值的问题。

    假如 num 初始值是 1

    num++ 是先赋值,后自增,把 num++ 当作一个整体,于是 num++ 还是 1 (但是 num 变成了 2)

    ++num 是先自增,后赋值,于是 ++num 返回了 3 此时 console.log num 的值也是 3
    xiangyuecn
        33
    xiangyuecn  
       2022-04-13 08:18:12 +08:00
    js 不背锅,++操作符,绝大部分语言都是相同意义的操作

    存在即合理,不可以教唆别人不要用,小心被铐起来
    surbomfla
        34
    surbomfla  
       2022-04-13 09:12:47 +08:00
    c 语言也是这样啊,难道 op 没学过 c ?
    marcong95
        35
    marcong95  
       2022-04-13 09:23:53 +08:00
    楼上黑 JS 的,麻烦黑对点好吗。。。

    ++i++i++: Thanks for inventing C.
    zhw2590582
        36
    zhw2590582  
       2022-04-13 10:18:15 +08:00
    用 ++ 的话,我记得 eslint 默认会报警告,所以还是不要用好
    irytu
        37
    irytu  
       2022-04-13 10:22:32 +08:00 via iPhone
    你需要补的不是 Javascript…
    yazinnnn
        38
    yazinnnn  
       2022-04-13 10:25:59 +08:00
    不要写语义模糊,让人困惑的代码

    一个表达式既赋值又读值,本来就是迷惑行为

    建议使用+=,或者把代码拆成两行

    println(i++) =>

    i++
    println(i)
    libook
        39
    libook  
       2022-04-13 10:36:49 +08:00   1
    1. JS 是个历史非常长的语言了,语言特性受一些同样历史非常长的其他语言影响,同时又产生了一些历史包袱;比如 C 和 Java 也都有相同的自增自减特性,计算机专业大多会首先学 C ,自增自减放左边放右边不一样的这个特性也是一个比较重要的知识点。
    2. 一个人对一个知识了解越少就会越通过主观感受去评判,了解越多就越尊重客观事实;语言没有好不好,只有适合不适合、习惯不习惯。
    3. JS 是一们特别灵活的语言,灵活的代价就是对开发者要求很高,开发者得思考运行结果、异常风险,以及要在众多实现方案里选出一种最合适的;也存在着一些语言写出来的代码千人一面,但同时也损失了灵活性。
    4. MDN 上关于 JS 的资料非常全,比如自增运算符的: https://developer.mozilla.org/zh-CN/docs/Web/Javascript/Reference/Operators/Increment ;建议不管是 JS 新手还是老手都仔细看一遍 MDN 上关于 JS 的文档,即便大多内容都已经了解,边边角角的地方往往会给你一些惊喜。
    5. 团队协作写代码的话,风格标注和文档 /注释都很重要,因为代码主要是用来给别人看的,其次才是用来运行的,可以结合团队成员的平均水平,来规定哪些写法可以用哪些不可以用,然后大家一起遵守就好了。
    AllenHua
        40
    AllenHua  
       2022-04-13 10:37:23 +08:00
    有些人难免有一些误解。为什么 i++ 就不能用了。

    还有这和 Javascript 关系也不大,多数编程语言都这样,大家都这么约定俗成的。

    另外 for 循环里使用 i++ 或者 ++i 没有任何区别。不明白的看 #32 给一个知乎的讨论链接: https://www.zhihu.com/question/19811087
    Wanex
        41
    Wanex  
       2022-04-13 10:41:24 +08:00   1
    遇到不懂的骂 JS 就完事儿了
    msg7086
        42
    msg7086  
       2022-04-13 10:41:35 +08:00
    @xQmQ 编译器会按照行为去优化,只要最后程序的运行行为是正确的,编译器可以把你的代码改到面目全非。

    之前用 SIMD intrinsics 写了个算法,拿各种编译器编译完以后,clang llvm 跑出来的程序比 msvc 和 gcc 的快了很多,回头看了一眼,clang 嫌弃我写的 SIMD 烂,帮我整个重写了。
    cpstar
        43
    cpstar  
       2022-04-13 10:50:56 +08:00   1
    没学过 C 语言吧,
    就那个 i++和++i ,正经学过 C 语言的,都经历过这个事情吧

    哈哈哈,所谓科班出身,大抵如此。(不带嘲笑之意,不要多想,手动狗头)
    qping
        44
    qping  
       2022-04-13 10:53:23 +08:00
    搞得清就用,搞不清就用 n = n + 1
    cpstar
        45
    cpstar  
       2022-04-13 10:57:00 +08:00
    作为灵活性较高的语言,很多逻辑过程就可以通过一行完成,那就需要了解并使用类似 i++和++i 之类的奇技淫巧。
    当年在 PHP 上把需要四五行甚至一个 func 的事情硬写到了一行里。作为 JS ,诸如 if (x!=null) x=y else x={} 也可以直接 x=y||{} 完活。
    lisongeee
        46
    lisongeee  
       2022-04-13 12:02:26 +08:00   1
    @xiangyuecn

    “存在即合理,不可以教唆别人不要用,小心被铐起来”

    反对这句话,首先 “存在即合理” 是错误的,它源于对黑格尔的文章的错误翻译,原本意思是存在的事物有其存在的理由,比如 犯罪存在,能说它合理吗?只能说它有存在的理由。

    python 就没有自增运算符号,而且自增运算符也没啥,重点是自增运算语句的返回值被滥用

    如果 i++ 或者 ++i 返回 void 就没啥问题
    xQmQ
        47
    xQmQ  
       2022-04-13 13:40:18 +08:00
    @msg7086
    现在的编译器确实给力,优化一开。我是还没工作,平时编译器优化这方面接触的也不多
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5729 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 01:54 PVG 09:54 LAX 17:54 JFK 20:54
    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