++ someVariable กับ someVariable ++ ใน JavaScript


140

ใน JavaScript คุณสามารถใช้++โอเปอเรเตอร์ก่อน ( เพิ่มก่อน ) หรือหลังชื่อตัวแปร ( เพิ่มหลัง ) อะไรคือความแตกต่างระหว่างวิธีการเพิ่มตัวแปรเหล่านี้?



ฉันคิดเกี่ยวกับเมื่อวานนี้อ่านการตอบสนองนี้คำถามเกี่ยวกับสมมติฐานที่ไม่ดีใน C ในทุกกรณีเราสามารถรับประกันได้หรือไม่ว่า Javascript ทำงานในลักษณะนี้ หรือคุณคิดว่าการใช้คำสั่งเพิ่มในประโยคที่ซับซ้อนกว่านั้นเป็นการปฏิบัติที่ไม่ดีเลย?
palswim

ความคิดเห็นก่อนหน้านี้เป็นจริงสำเนาของคำตอบ (ที่ไม่ใช่คำตอบมากกว่า) ผมโพสต์ในปี 2010 ฉันได้ลบคำตอบแล้ว แต่Jon Skeet ตอบกลับว่า : "เมื่อมองไปที่ ECMA-262 ดูเหมือนว่าจะระบุได้ดีพอสมควร"
palswim

คำตอบ:


256

เช่นเดียวกับในภาษาอื่น ๆ :

  • ++x (pre-Increment) หมายถึง "การเพิ่มตัวแปรค่าของนิพจน์คือค่าสุดท้าย"
  • x++ (post-Increment) หมายถึง "จำค่าเดิมจากนั้นเพิ่มตัวแปรค่าของนิพจน์คือค่าดั้งเดิม"

ตอนนี้เมื่อใช้เป็นคำสั่งแบบสแตนด์อโลนพวกเขาหมายถึงสิ่งเดียวกัน:

x++;
++x;

ความแตกต่างเกิดขึ้นเมื่อคุณใช้ค่าของนิพจน์ที่อื่น ตัวอย่างเช่น:

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

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

14
คำสาปฉันเกือบจะเอาชนะคุณเพื่อหาคำตอบหากฉันไม่หยุดโหลดคำตอบ jsfiddle ที่ใช้งานได้จริง ;-)
คริส

2
สิ่งนี้จะเป็นอย่างไรถ้าคุณใช้+ 1แทน++? มีวิธีเพิ่มก่อนหรือหลังเมื่อเพิ่มตัวเลขหรือไม่?
Keavon

ฉันอยากทราบว่าทำไมถ้าคุณดำเนินการนี้ const r1 = (x ++) + (x ++); มันไม่ได้ผลลัพธ์ที่คาดหวังตามตัวอย่างของคุณ
Jean Jimenez

2
@JeanJimenez: มันให้ผลลัพธ์ที่ฉันคาดหวัง ตัวอย่างเช่นหากxเริ่มต้นด้วย 10 ค่าของr1คือ 21 ซึ่งก็คือ 10 + 11 ค่าของx++นิพจน์แรกคือ 10 และxเพิ่มขึ้นเป็น 11 ค่าของx++นิพจน์ที่สองคือ 11 และxเพิ่มขึ้นเป็น 12
Jon Skeet

เรียน @JonSkeet ขอบคุณสำหรับการตอบสนองที่รวดเร็วเป็นพิเศษฉันยังใหม่กับการเรียนรู้ JavaScript และความสับสนของฉันคือสาเหตุที่การเพิ่มขึ้นหนึ่งครั้งและอีกครั้งไม่ได้
Jean Jimenez

48
  • ++x เพิ่มมูลค่าจากนั้นประเมินและจัดเก็บ
  • x++ ประเมินมูลค่าจากนั้นเพิ่มขึ้นและจัดเก็บ
var n = 0, m = 0;

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

โปรดทราบว่ามีประโยชน์ด้านประสิทธิภาพเล็กน้อยในการใช้++xหากเป็นไปได้เนื่องจากคุณอ่านตัวแปรแก้ไขแล้วประเมินและจัดเก็บ เทียบกับx++โอเปอเรเตอร์ที่คุณอ่านค่าประเมินแก้ไขแล้วจัดเก็บ


8

อย่างที่ฉันเข้าใจหากคุณใช้มันแบบสแตนด์อโลนพวกเขาก็ทำสิ่งเดียวกัน หากคุณพยายามแสดงผลลัพธ์เป็นนิพจน์ผลลัพธ์อาจแตกต่างกัน ลองใช้ alert (i ++) เทียบกับ alert (++ i) เพื่อดูความแตกต่าง i ++ ประเมินเป็น i ก่อนการเพิ่มและ ++ ฉันทำการเพิ่มก่อนที่จะประเมิน

ดูตัวอย่างhttp://jsfiddle.net/xaDC4/


3

ฉันมีคำอธิบายเกี่ยวกับการทำความเข้าใจหลังการเพิ่มและการเพิ่มขึ้นล่วงหน้า ผมวางไว้ตรงนี้

ให้กำหนด0ให้x

let x = 0;

เริ่มต้นด้วยการเพิ่มโพสต์

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

ทำไม?

ให้แบ่งx++นิพจน์ลง

x = x;
x = x + 1;

คำสั่งแรกส่งคืนค่าxซึ่งเป็น0

และในภายหลังเมื่อคุณใช้xตัวแปรที่ใดก็ได้คำสั่งที่สองจะถูกดำเนินการ

คำสั่งที่สองส่งคืนค่าของx + 1นิพจน์นี้ซึ่งเป็น(0 + 1) = 1

โปรดจำไว้ว่าค่าของxสถานะนี้คืออะไร1

ตอนนี้เริ่มต้นด้วยการเพิ่มขึ้นล่วงหน้า

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

ทำไม?

ให้แบ่ง++xนิพจน์ลง

x = x + 1;
x = x;

คำสั่งแรกส่งคืนค่าของx + 1นิพจน์นี้ซึ่งเป็น(1 + 1) = 2

คำสั่งที่สองส่งคืนค่าxที่เป็น2ดังนั้นx = 2จึงส่งกลับ2

หวังว่านี่จะช่วยให้คุณเข้าใจว่าการเพิ่มหลังและการเพิ่มขึ้นล่วงหน้าคืออะไร!



1
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.