不是很理解 js 里面的递增的逻辑,这个递增的步长是多少啊
1
kop1989smurf 2022-04-12 14:52:35 +08:00
指的是最后两行为何相差 2 ?
首先,这并不是 JS 的知识。 x++是先附值再累加。 ++x 是先累加再附值。 |
2
gdrk 2022-04-12 14:54:27 +08:00 1
++在后只是执行了这次运算,不会影响这次输出。你在 num3++后再 log 一次 num3 就明白了。
|
3
kop1989smurf 2022-04-12 14:55:41 +08:00
如果将最后两行逻辑拆开,那么倒数第二行(console.log(num3++))的逻辑是:
输出 num3; num3 = num3 + 1; |
4
LxnChan OP @kop1989smurf 那这个先赋值再累加有什么意义吗?输出的应该还是变量的值吧,另外累加这个逻辑是怎么样的,每次加 1 吗还是什么值
|
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 |
8
ChefIsAwesome 2022-04-12 15:04:38 +08:00
顺序问题。为了不绕自己,不绕他人,拒绝使用 ++ 操作符就完事了。
|
9
agdhole 2022-04-12 15:05:13 +08:00
这玩意了解下就行,不要在自己的代码里面写,折磨自己和同事😂
|
10
shintendo 2022-04-12 15:15:18 +08:00 1
相信我,你不知道这个,写出来的代码比较好
|
11
Leviathann 2022-04-12 15:16:57 +08:00
这是当年还没有表达式化控制流这个思想的时代为了方便在语法上开洞的行为
|
12
weixiangzhe 2022-04-12 15:45:16 +08:00
++ 已经是垃圾,不要用就完了
i += 1 清晰明了 |
13
retrocode 2022-04-12 16:15:51 +08:00 1
|
14
LxnChan OP @retrocode 啊这,我试了一下居然还是真的🤣 https://flow.lxnchan.cn/files/pic/pic20220412d.png
@weixiangzhe okok @Leviathann 开洞是什么 @shintendo @agdhole 哈哈哈 啊最主要的是看 js 代码完全不知道结果是啥 |
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)" 这种 |
17
pengtdyd 2022-04-12 16:57:49 +08:00
JS 的运算是玄学,哈哈哈
|
18
lvsijun 2022-04-12 16:58:05 +08:00
@LxnChan 先赋值后累加 一般用于循环操作 for(let i = 0 ; i<10; i++){ console.log(i)} //循环十次
|
19
deplivesb 2022-04-12 17:07:12 +08:00
别 tm 的++ 了,+= 不香么,非要搞自己也搞别人
|
20
NCry 2022-04-12 17:30:03 +08:00
除了 for 循环里面,基本不用 ++ 了。另外这个两个顺序差异不止存在于 js ,其他语言也有的吧。
|
21
kaiki 2022-04-12 17:32:58 +08:00
尽量只在 for 循环里用++,可以少很多事
|
22
DonDonc 2022-04-12 17:43:44 +08:00
|
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 更加直观。 |
24
yangzzzzzz 2022-04-12 17:55:12 +08:00
建议看一下表严肃的 js 精讲 一节几分钟 很快就看完了
|
26
xQmQ 2022-04-12 18:43:35 +08:00
插个楼,例如 c 和 c++,用 i++ 和 ++i ,是不是会被编译器优化,然后效率一致?
我以前记得说 i++ 要调个临时变量保存当前值,所以在我 for(;;) 里一直用 ++i |
27
xQmQ 2022-04-12 18:50:31 +08:00
@xQmQ
自个试着汇编了一下看看,for() 里面 i++ 和 ++i 编译出来的汇编代码没有差异 printf("%d\n", i++) 比 printf("%d\n", ++i) 的汇编多一步,估计就是寄存器拿着当前值去打印了,然后再自增 不太懂汇编,也没看太明白 |
28
yukinotech 2022-04-12 22:40:13 +08:00
i+=1 多写一个字符不会死的。。
|
29
ericgui 2022-04-12 22:50:53 +08:00
我就知道一个 i++
其他的真的用不上 |
30
autoxbc 2022-04-12 23:15:32 +08:00
不让用 ++ 就是扯了,应该是不要使用 ++ 操作的返回值
a = i++ ; // 这是糟粕 some code ... i++ ; // 这样毫无问题 |
31
lisongeee 2022-04-13 00:00:34 +08:00
eslint no-plusplus: "error"
|
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 |
33
xiangyuecn 2022-04-13 08:18:12 +08:00
js 不背锅,++操作符,绝大部分语言都是相同意义的操作
存在即合理,不可以教唆别人不要用,小心被铐起来 |
34
surbomfla 2022-04-13 09:12:47 +08:00
c 语言也是这样啊,难道 op 没学过 c ?
|
35
marcong95 2022-04-13 09:23:53 +08:00
楼上黑 JS 的,麻烦黑对点好吗。。。
++i++i++: Thanks for inventing C. |
36
zhw2590582 2022-04-13 10:18:15 +08:00
用 ++ 的话,我记得 eslint 默认会报警告,所以还是不要用好
|
37
irytu 2022-04-13 10:22:32 +08:00 via iPhone
你需要补的不是 Javascript…
|
38
yazinnnn 2022-04-13 10:25:59 +08:00
不要写语义模糊,让人困惑的代码
一个表达式既赋值又读值,本来就是迷惑行为 建议使用+=,或者把代码拆成两行 println(i++) => i++ println(i) |
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. 团队协作写代码的话,风格标注和文档 /注释都很重要,因为代码主要是用来给别人看的,其次才是用来运行的,可以结合团队成员的平均水平,来规定哪些写法可以用哪些不可以用,然后大家一起遵守就好了。 |
40
AllenHua 2022-04-13 10:37:23 +08:00
有些人难免有一些误解。为什么 i++ 就不能用了。
还有这和 JavaScript 关系也不大,多数编程语言都这样,大家都这么约定俗成的。 另外 for 循环里使用 i++ 或者 ++i 没有任何区别。不明白的看 #32 给一个知乎的讨论链接: https://www.zhihu.com/question/19811087 |
41
Mexion 2022-04-13 10:41:24 +08:00 1
遇到不懂的骂 JS 就完事儿了
|
42
msg7086 2022-04-13 10:41:35 +08:00
@xQmQ 编译器会按照行为去优化,只要最后程序的运行行为是正确的,编译器可以把你的代码改到面目全非。
之前用 SIMD intrinsics 写了个算法,拿各种编译器编译完以后,clang llvm 跑出来的程序比 msvc 和 gcc 的快了很多,回头看了一眼,clang 嫌弃我写的 SIMD 烂,帮我整个重写了。 |
43
cpstar 2022-04-13 10:50:56 +08:00 1
没学过 C 语言吧,
就那个 i++和++i ,正经学过 C 语言的,都经历过这个事情吧 哈哈哈,所谓科班出身,大抵如此。(不带嘲笑之意,不要多想,手动狗头) |
44
qping 2022-04-13 10:53:23 +08:00
搞得清就用,搞不清就用 n = n + 1
|
45
cpstar 2022-04-13 10:57:00 +08:00
作为灵活性较高的语言,很多逻辑过程就可以通过一行完成,那就需要了解并使用类似 i++和++i 之类的奇技淫巧。
当年在 PHP 上把需要四五行甚至一个 func 的事情硬写到了一行里。作为 JS ,诸如 if (x!=null) x=y else x={} 也可以直接 x=y||{} 完活。 |
46
lisongeee 2022-04-13 12:02:26 +08:00 1
@xiangyuecn
“存在即合理,不可以教唆别人不要用,小心被铐起来” 反对这句话,首先 “存在即合理” 是错误的,它源于对黑格尔的文章的错误翻译,原本意思是存在的事物有其存在的理由,比如 犯罪存在,能说它合理吗?只能说它有存在的理由。 python 就没有自增运算符号,而且自增运算符也没啥,重点是自增运算语句的返回值被滥用 如果 i++ 或者 ++i 返回 void 就没啥问题 |