鍍金池/ 問答/HTML/ javascript:自增++/自減--運(yùn)算符的小問題?

javascript:自增++/自減--運(yùn)算符的小問題?

MDN-運(yùn)算符優(yōu)先級(jí)上,后置自增a++比前置自增++a有更高的優(yōu)先級(jí),這是什么原因?

例如:

var a = 1;
var b = ++a;
//=> b = 2;

那么:

var a = 1;
var b = a++;
//=> b = 1;

表面看起來是++a優(yōu)先級(jí)高于=,而a--優(yōu)先級(jí)低于=。這是什么原因呢?

回答
編輯回答
撿肥皂

遞增 (++)
遞增運(yùn)算符為其操作數(shù)增加1,返回一個(gè)數(shù)值。

如果后置(postfix)使用,即運(yùn)算符位于操作數(shù)的后面(如 x++),那么將會(huì)在遞增前返回?cái)?shù)值。
如果前置(prefix)使用,即運(yùn)算符位于操作數(shù)的前面(如 ++x),那么將會(huì)在遞增后返回?cái)?shù)值。

2017年5月22日 07:30
編輯回答
拽很帥

++a返回2,所以b=2
a++返回1,所以b=1
和優(yōu)先級(jí)無關(guān)

2017年6月5日 14:00
編輯回答
祈歡

javascript中的運(yùn)算符優(yōu)先級(jí),你可以理解為結(jié)合優(yōu)先級(jí),javascript永遠(yuǎn)是從左向右執(zhí)行。
賦值表達(dá)式中 =++ 的優(yōu)先級(jí)關(guān)系不成立,不會(huì)因?yàn)?++ 優(yōu)先級(jí)高,而先于 = 計(jì)算,只是先于結(jié)合。
= 的運(yùn)算方法查看ECMAScript 5.1 中 11.3.1

b = ++a; 可以理解為:

var a = 1;
var b = fun();
function fun() {
    a = a + 1;
    return a;
}

b = a++; 可以理解為:

var a = 1;
var b = fun();
function fun() {
    var t = a;
    a = a + 1;
    return t;
}

可以參考 ECMAScript 5.1 規(guī)范(中文版部分規(guī)則缺失):
中文版:http://lzw.me/pages/ecmascrip...
英文版:http://www.ecma-international...

附錄D中有說明:

11.8.2,11.8.3,11.8.5:ECMAScript 總體上是以從左到右的順序解釋執(zhí)行,但是第 3 版規(guī)范中 > 和 <= 運(yùn)算符的描述語言導(dǎo)致了局部從右到左的順序。本規(guī)范已經(jīng)更正了這些運(yùn)算符,現(xiàn)在完全是從左到右的順序解釋執(zhí)行。然而,這個(gè)對(duì)順序的修改,如果在解釋執(zhí)行過程期間產(chǎn)生副作用,就有可能被觀察到。

ECMAScript 中所有代碼均為從左到右進(jìn)行執(zhí)行(評(píng)估順序 evaluation order) ,如果你的函數(shù)中有副作用時(shí),例如問題中的代碼,則可以明確觀察到“從左到右”。例如該問題:
https://segmentfault.com/q/10...

運(yùn)算符優(yōu)先級(jí)和評(píng)估順序是2個(gè)不同的概念,sqrt(9) + sqrt(16) * sqrt(25) 中乘法先運(yùn)行時(shí)錯(cuò)誤的,表達(dá)式總是從左到右運(yùn)行,只是遇到 * 運(yùn)算符時(shí),會(huì)優(yōu)先結(jié)合。

執(zhí)行過程類似如下:

  1. sqrt(9)
  2. sqrt(16)
  3. sqrt(25)
  4. 4 * 5
  5. 3 + 20
2017年1月16日 18:58
編輯回答
初念

其他人說的都不對(duì)
a+++b會(huì)被識(shí)別為(a++)+b而不是a+(++b)
后置自增比前置自增有更高的優(yōu)先級(jí),是表現(xiàn)在這里的

2017年4月2日 00:27
編輯回答
萌小萌

其實(shí)關(guān)注這些沒有特別的意義,如果不確定,就加括號(hào),而++只在單目中使用,而不要用太多奇技淫巧。

2017年10月22日 10:08