簡體   English   中英

Javascript:為什么不(p + 1)++工作?

[英]Javascript: Why doesn't (p+1)++ work?

關於

p = 0;
(p+1)++;
> ReferenceError: Invalid left-hand side expression in postfix operation

p = 0;
++(p+4);
> ReferenceError: Invalid left-hand side expression in prefix operation

我只是有點意外,因為我期望postfix / prefix運算符可以處理表達式的分辨率(括號具有最高的運算符優先級)。

有人可以給我一兩行來解釋這里發生的事情嗎?

謝謝

編輯:感謝您的快速回復,第一個答案標記為答案。 我覺得我也應該下面的@thefourtheye那里得到深刻的回答

++增加變量的值,因此它比以前更大。 例如:

var x = 3;
x++;
alert(x); // will show 4

對於這一點, ++的左邊的表達式必須是可訪問和可變的,否則增量是可能的。 例如:

3++

沒有任何意義,因為3是一個常數,不能遞增。 我們不希望這是可能的:

3++;
alert(3); // outputs 4???

這就是你的表達不起作用的原因。 即:

var p = 2;
(p + 1)++;

有與上面相同的問題。 (p + 1)將評估為3,而++不能改變常數3的值。

您正在嘗試遞增()increment/decrement運算符可以應用於變量,請嘗試示例代碼

(p++) + 1

要么

(++p) + 1

請記住,當你編寫p++ ,它實際上被轉換為p = p + 1 運算符++--是用於遞增/遞減變量以供將來使用的便捷符號。 但是(p+1)++++(p+4)應該如何被翻譯? 那種暗示14正在增加/減少以供將來使用,這是沒有意義的。

當你有這樣的表達式

(expr)++;

這些是JavaScript將在內部執行的操作

  1. 解析expr引用的實際對象。

    這一步很重要,因為你甚至可以做這樣的事情

     var a = {b: 1}; ++ab; a.b++; console.log(ab); # 3 

    現在,JavaScript必須解析要遞增的實際對象。 在這種情況下,這將是b中的a

  2. 獲取引用的值並將該值轉換為數字。

    此步驟也非常重要,因為您甚至可能擁有這樣的值

     var a = {b: '1'}; console.log(++ab); # 2 

    JavaScript將盡力獲取數值,而不是立即失敗。

  3. 增加數量。

  4. 將新的vale存儲在expr 這是表達式失敗的步驟。

    在你的情況下, exprp + 1 ,當它被解析時,值只是一個數字,其值永遠不會改變。 (你永遠不能將1的值更改為其他內容)。 因此,在遞增部分之后,當必須存儲新值時,JavaScript找不到存儲它的有效引用。 這就是它拋出這個錯誤的原因。

    ReferenceError:后綴操作中的左側表達式無效

實際上從內部PutValue方法拋出此錯誤消息。 第一步是這樣的

 If Type(V) is not Reference, throw a ReferenceError exception. 

參考: ECMA Script 5.1 Prefix Increment Operator標准規范

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM