3

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

 2 years ago
source link: https://www.v2ex.com/t/846528
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  JavaScript

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

  LxnChan · 20 小时 46 分钟前 · 2711 次点击

pic20220412b

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

45 条回复    2022-04-13 10:57:00 +08:00

kop1989smurf

kop1989smurf      20 小时 43 分钟前

指的是最后两行为何相差 2 ?

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

x++是先附值再累加。
++x 是先累加再附值。

gdrk

gdrk      20 小时 41 分钟前   ❤️ 1

++在后只是执行了这次运算,不会影响这次输出。你在 num3++后再 log 一次 num3 就明白了。

kop1989smurf

kop1989smurf      20 小时 40 分钟前

如果将最后两行逻辑拆开,那么倒数第二行(console.log(num3++))的逻辑是:

输出 num3;
num3 = num3 + 1;

LxnChan

LxnChan      20 小时 40 分钟前

@kop1989smurf 那这个先赋值再累加有什么意义吗?输出的应该还是变量的值吧,另外累加这个逻辑是怎么样的,每次加 1 吗还是什么值

LxnChan

LxnChan      20 小时 38 分钟前

@gdrk 也就是说在倒数第二行的时候 num3 的值就已经是 22 了吗?

LxnChan

LxnChan      20 小时 37 分钟前

@gdrk 理解了,谢谢。

wangtian2020

wangtian2020      20 小时 34 分钟前

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



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

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


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

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

https://zh.javascript.info/operators

ChefIsAwesome

ChefIsAwesome      20 小时 31 分钟前

顺序问题。为了不绕自己,不绕他人,拒绝使用 ++ 操作符就完事了。

agdhole

agdhole      20 小时 30 分钟前

这玩意了解下就行,不要在自己的代码里面写,折磨自己和同事😂

shintendo

shintendo      20 小时 20 分钟前   ❤️ 1

相信我,你不知道这个,写出来的代码比较好

Leviathann

Leviathann      20 小时 19 分钟前

这是当年还没有表达式化控制流这个思想的时代为了方便在语法上开洞的行为

weixiangzhe

weixiangzhe      19 小时 50 分钟前

++ 已经是垃圾,不要用就完了
i += 1 清晰明了

gogogo1203

gogogo1203      18 小时 47 分钟前

vs code 有一个 js playground 的插件 quokka. 有很多团队的 eslint rule 直接不让用++

hazardous

hazardous      18 小时 40 分钟前

别的语言不也是这样的么。

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

要避免的是 "func(a++, ++a)" 这种

pengtdyd

pengtdyd      18 小时 38 分钟前

JS 的运算是玄学,哈哈哈

lvsijun

lvsijun      18 小时 37 分钟前

@LxnChan 先赋值后累加 一般用于循环操作 for(let i = 0 ; i<10; i++){ console.log(i)} //循环十次

deplivesb

deplivesb      18 小时 28 分钟前

别 tm 的++ 了,+= 不香么,非要搞自己也搞别人

NCry

NCry      18 小时 5 分钟前

除了 for 循环里面,基本不用 ++ 了。另外这个两个顺序差异不止存在于 js ,其他语言也有的吧。

kaiki

kaiki      18 小时 3 分钟前

尽量只在 for 循环里用++,可以少很多事

ksco

ksco      17 小时 41 分钟前

++ 虽然是旧时代的遗产,但在少数场景中还是有用的。

随便举个例子

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

yangzzzzzz      17 小时 40 分钟前

建议看一下表严肃的 js 精讲 一节几分钟 很快就看完了

galikeoy

galikeoy      17 小时 16 分钟前

@pengtdyd #17 js 不背这个锅。。

xQmQ

xQmQ      16 小时 52 分钟前

插个楼,例如 c 和 c++,用 i++ 和 ++i ,是不是会被编译器优化,然后效率一致?

我以前记得说 i++ 要调个临时变量保存当前值,所以在我 for(;;) 里一直用 ++i

xQmQ

xQmQ      16 小时 45 分钟前

@xQmQ

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

不太懂汇编,也没看太明白

yukinotech

yukinotech      12 小时 55 分钟前

i+=1 多写一个字符不会死的。。

ericgui

ericgui      12 小时 45 分钟前

我就知道一个 i++
其他的真的用不上

autoxbc

autoxbc      12 小时 20 分钟前

不让用 ++ 就是扯了,应该是不要使用 ++ 操作的返回值

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

some code ...
i++ ;
// 这样毫无问题

lisongeee

lisongeee      11 小时 35 分钟前

eslint no-plusplus: "error"

AllenHua

AllenHua      10 小时 54 分钟前 via iPhone

记得是左右值的问题。

假如 num 初始值是 1

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

++num 是先自增,后赋值,于是 ++num 返回了 3 此时 console.log num 的值也是 3

xiangyuecn

xiangyuecn      3 小时 17 分钟前

js 不背锅,++操作符,绝大部分语言都是相同意义的操作

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

surbomfla

surbomfla      2 小时 23 分钟前

c 语言也是这样啊,难道 op 没学过 c ?

marcong95

marcong95      2 小时 12 分钟前

楼上黑 JS 的,麻烦黑对点好吗。。。

++i++i++: Thanks for inventing C.

zhw2590582

zhw2590582      1 小时 17 分钟前

用 ++ 的话,我记得 eslint 默认会报警告,所以还是不要用好

irytu

irytu      1 小时 13 分钟前 via iPhone

你需要补的不是 Javascript…

yazinnnn

yazinnnn      1 小时 10 分钟前

不要写语义模糊,让人困惑的代码

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

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

println(i++) =>

i++
println(i)

libook

libook      59 分钟前

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

AllenHua      58 分钟前

有些人难免有一些误解。为什么 i++ 就不能用了。

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

另外 for 循环里使用 i++ 或者 ++i 没有任何区别。不明白的看 #32 给一个知乎的讨论链接: https://www.zhihu.com/question/19811087

Mexion

Mexion      54 分钟前

遇到不懂的骂 JS 就完事儿了

msg7086

msg7086      54 分钟前

@xQmQ 编译器会按照行为去优化,只要最后程序的运行行为是正确的,编译器可以把你的代码改到面目全非。

之前用 SIMD intrinsics 写了个算法,拿各种编译器编译完以后,clang llvm 跑出来的程序比 msvc 和 gcc 的快了很多,回头看了一眼,clang 嫌弃我写的 SIMD 烂,帮我整个重写了。

cpstar

cpstar      45 分钟前

没学过 C 语言吧,
就那个 i++和++i ,正经学过 C 语言的,都经历过这个事情吧

哈哈哈,所谓科班出身,大抵如此。(不带嘲笑之意,不要多想,手动狗头)

qping

qping      42 分钟前

搞得清就用,搞不清就用 n = n + 1

cpstar

cpstar      38 分钟前

作为灵活性较高的语言,很多逻辑过程就可以通过一行完成,那就需要了解并使用类似 i++和++i 之类的奇技淫巧。
当年在 PHP 上把需要四五行甚至一个 func 的事情硬写到了一行里。作为 JS ,诸如 if (x!=null) x=y else x={} 也可以直接 x=y||{} 完活。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK