++ someVariable so với someVariable ++ trong JavaScript


135

Trong JavaScript, bạn có thể sử dụng ++toán tử trước ( tăng trước ) hoặc sau tên biến ( tăng sau ). Điều gì, nếu có, là sự khác biệt giữa các cách tăng một biến?


1
Xem thêm Sự khác biệt
Bergi

Tôi đã suy nghĩ về điều này ngày hôm qua khi đọc câu trả lời này cho câu hỏi về các giả định xấu trong C / C ++ . Trong mọi trường hợp, chúng tôi có thể đảm bảo rằng Javascript hoạt động theo cách này không? Hoặc bạn có nghĩ rằng việc sử dụng câu lệnh gia tăng trong một câu lệnh phức tạp hơn không?
palswim

Nhận xét trước đó thực sự là một bản sao của một câu trả lời (không phải là câu trả lời, thay vào đó) tôi đã đăng vào năm 2010 . Tôi đã xóa câu trả lời, nhưng Jon Skeet đã trả lời : "Nhìn vào ECMA-262, nó có vẻ được chỉ định hợp lý."
palswim

Câu trả lời:


242

Tương tự như trong các ngôn ngữ khác:

  • ++x (tăng trước) có nghĩa là "tăng biến; giá trị của biểu thức là giá trị cuối cùng"
  • x++ (tăng sau) có nghĩa là "nhớ giá trị ban đầu, sau đó tăng biến; giá trị của biểu thức là giá trị ban đầu"

Bây giờ khi được sử dụng như một tuyên bố độc lập, chúng có nghĩa tương tự:

x++;
++x;

Sự khác biệt đến khi bạn sử dụng giá trị của biểu thức ở nơi khác. Ví dụ:

x = 0;
y = array[x++]; // This will get array[0]

x = 0;
y = array[++x]; // This will get array[1]

13
Nguyền rủa, tôi gần như đánh bại bạn với một câu trả lời nếu tôi không dừng lại để tải lên một câu trả lời jsfiddle thực tế. ;-)
Chris

2
Điều này sẽ trông như thế nào nếu bạn sử dụng + 1thay vì ++? Có cách nào để tăng trước hay sau khi thêm số không?
Keavon

Tôi muốn biết tại sao nếu bạn thực hiện thao tác này const r1 = (x ++) + (x ++); nó không tạo ra kết quả như mong đợi theo ví dụ của bạn.
Jean Jimenez

1
@JeanJimenez: Vâng, nó tạo ra kết quả mà tôi mong đợi. Ví dụ: nếu xbắt đầu là 10, giá trị r1là 21, là 10 + 11. Giá trị của x++biểu thức thứ nhất là 10 và xđược tăng lên 11. Giá trị của x++biểu thức thứ hai là 11 và xđược tăng lên 12.
Jon Skeet

Gửi @JonSkeet cảm ơn vì phản hồi cực nhanh đó, tôi mới học JavaScript và sự nhầm lẫn của tôi là về lý do tại sao cái này tăng và cái kia thì không.
Jean Jimenez

43
  • ++x tăng giá trị, sau đó đánh giá và lưu trữ nó.
  • x++ đánh giá giá trị, sau đó tăng và lưu trữ nó.
var n = 0, m = 0;

alert(n++); /* Shows 0, then stores n = 1 */
alert(++m); /* Shows 1, then stores m = 1 */

Lưu ý rằng có những lợi ích hiệu suất nhỏ khi sử dụng ++xkhi có thể, bởi vì bạn đọc biến, sửa đổi nó, sau đó đánh giá và lưu trữ nó. So với x++toán tử nơi bạn đọc giá trị, đánh giá nó, sửa đổi nó, sau đó lưu trữ nó.


7

Theo tôi hiểu nếu bạn sử dụng chúng độc lập thì họ cũng làm điều tương tự. Nếu bạn cố gắng đưa ra kết quả của chúng dưới dạng một biểu thức thì chúng có thể khác nhau. Hãy thử cảnh báo (i ++) so với cảnh báo (++ i) để thấy sự khác biệt. i ++ đánh giá i trước khi bổ sung và ++ tôi thực hiện bổ sung trước khi đánh giá.

Xem http://jsfiddle.net/xaDC4/ để biết ví dụ.


2
var a = 1;
var b = ++a;
alert('a:' + a + ';b:' + b); //a:2;b:2

var c = 1;
var d = c++;
alert('c:' + c + ';d:' + d); //c:2;d:1

jsfiddle


0
var x = 0, y = 0;

//post-increment: i++ returns value then adds one to it
console.log('x++ will log: ', x++); //0
console.log('x after x++ : ', x);    //1

//pre-increment: adds one to the value, then returns it
console.log('++y will log: ', ++y); //1
console.log('y after ++y : ', y);   //1

0

Tôi có một lời giải thích về việc hiểu tăng sau và tăng trước. Vì vậy, tôi đang đặt nó ở đây.

Cho phép gán 0chox

let x = 0;

Hãy bắt đầu với tăng sau

console.log(x++); // Outputs 0

Tại sao?

Hãy phá vỡ x++biểu thức

x = x;
x = x + 1;

Câu lệnh đầu tiên trả về giá trị của xnó là0

Và sau này khi bạn sử dụng xbiến ở bất cứ đâu, thì câu lệnh thứ hai được thực thi

Câu lệnh thứ hai trả về giá trị của x + 1biểu thức này(0 + 1) = 1

Hãy ghi nhớ giá trị của xtrạng thái này1

Bây giờ hãy bắt đầu với tăng trước

console.log(++x); // Outputs 2

Tại sao?

Hãy phá vỡ ++xbiểu thức

x = x + 1;
x = x;

Câu lệnh đầu tiên trả về giá trị của x + 1biểu thức này(1 + 1) = 2

Câu lệnh thứ hai trả về giá trị của xnó là 2do x = 2đó nó trả về2

Hy vọng điều này sẽ giúp bạn hiểu thế nào là tăng sau và tăng trước!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.