[英]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)
應該如何被翻譯? 那種暗示1
或4
正在增加/減少以供將來使用,這是沒有意義的。
當你有這樣的表達式
(expr)++;
這些是JavaScript將在內部執行的操作
解析expr
引用的實際對象。
這一步很重要,因為你甚至可以做這樣的事情
var a = {b: 1}; ++ab; a.b++; console.log(ab); # 3
現在,JavaScript必須解析要遞增的實際對象。 在這種情況下,這將是b
中的a
。
獲取引用的值並將該值轉換為數字。
此步驟也非常重要,因為您甚至可能擁有這樣的值
var a = {b: '1'}; console.log(++ab); # 2
JavaScript將盡力獲取數值,而不是立即失敗。
增加數量。
將新的vale存儲在expr
。 這是表達式失敗的步驟。
在你的情況下, expr
是p + 1
,當它被解析時,值只是一個數字,其值永遠不會改變。 (你永遠不能將1的值更改為其他內容)。 因此,在遞增部分之后,當必須存儲新值時,JavaScript找不到存儲它的有效引用。 這就是它拋出這個錯誤的原因。
ReferenceError:后綴操作中的左側表達式無效
實際上從內部PutValue
方法拋出此錯誤消息。 第一步是這樣的
If Type(V) is not Reference, throw a ReferenceError exception.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.