ทำไมถึงaaa = 1,2,3
ทำงานและตั้งค่าaaa
เป็น1
?
ทำไมไม่var bbb = 1,2,3
ทำงาน
ทำไมถึงvar bbb = (1,2,3)
ทำงานและตั้งค่าbbb
เป็น3
?
ทำไมถึงaaa = 1,2,3
ทำงานและตั้งค่าaaa
เป็น1
?
ทำไมไม่var bbb = 1,2,3
ทำงาน
ทำไมถึงvar bbb = (1,2,3)
ทำงานและตั้งค่าbbb
เป็น3
?
คำตอบ:
มีจำนวนมากเกิดขึ้นที่นี่ แต่โดยทั่วไปมันลงมาถึงผู้ประกอบการจุลภาค
ตัวดำเนินการลูกน้ำจะประเมินตัวถูกดำเนินการทั้งสอง (จากซ้ายไปขวา) และส่งคืนค่าของตัวถูกดำเนินการที่สอง
รหัสนี้:
aaa = 1,2,3
เทียบเท่ากับ:
aaa = 1;
2;
3;
ดังนั้นaaa
มีการประกาศโดยปริยายและกำหนดค่าเป็น 1 โปรดสังเกตว่าเอาต์พุตบนคอนโซลเป็นผลลัพธ์ของคำสั่งสุดท้าย 3
รหัสนี้:
var bbb = 1,2,3
เป็นข้อผิดพลาดทางไวยากรณ์เนื่องจากใช้เครื่องหมายจุลภาคในการประกาศตัวแปรเพื่อประกาศตัวแปรหลายตัวในบรรทัดเดียว ดังที่บทความ MDN ชี้ให้เห็น
โปรดสังเกตว่าเครื่องหมายจุลภาคใน
var
คำสั่งไม่ใช่ตัวดำเนินการลูกน้ำเนื่องจากไม่มีอยู่ในนิพจน์ แต่เป็นอักขระพิเศษในvar
คำสั่งที่จะรวมหลาย ๆ ตัวเป็นหนึ่งเดียว
ดังนั้นรหัสนี้จึงเทียบเท่ากับ:
var bbb = 1;
var 2;
var 3;
แน่นอนว่า2
ไม่ใช่ตัวระบุที่ถูกต้องดังนั้นจึงล้มเหลวในตอนนั้น
รหัสนี้:
var bbb = (1,2,3)
คล้ายกับค่าแรกมากยกเว้นเนื่องจากค่าตัวเลขอยู่ในวงเล็บจึงได้รับการประเมินก่อน ดังนั้นนี่จึงน่าเกลียดเทียบเท่ากับ:
1;
2;
var bbb = 3;
=
อินvar bbb = 1;
ไม่เหมือนกับ=
ในaaa = 1;
- พวกเขามาจากการผลิตที่แตกต่างกัน (Initialiser vs AssignmentExpression) ในไวยากรณ์และเพิ่งเกิดขึ้นเพื่อใช้โทเค็นเดียวกัน
a = 1, 2, 3
สามารถใส่วงเล็บ(a = 1), 2, 3
ซึ่งประเมินเป็นa = 1; 2; 3
(และส่งกลับ 3 เช่นb = (a = 1, 2, 3)
จะกำหนด 3 ให้ b) ในทางตรงกันข้ามa = (1, 2, 3)
ประเมินเป็น1; 2; a = 3
และส่งกลับ 3
(1 + 2) * 3
ค่า1 + 2
จะถูกประเมินก่อนและผลลัพธ์ของนิพจน์นั้นจะถูกแทนที่กลับเป็นนิพจน์ด้านนอกสำหรับการประเมินที่เหลือ
จุลภาคมีประโยชน์หลายอย่างใน Javascript ในนิพจน์:
a = 1, 2, 3;
มันเป็นโอเปอเรเตอร์ที่ส่งกลับอาร์กิวเมนต์ขวามือ แต่ยังเป็นส่วนหนึ่งของไวยากรณ์ของvar
การประกาศซึ่ง ได้แก่ :
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
(ซึ่ง[...]
หมายความว่าส่วนนั้นเป็นทางเลือก) var
การประกาศของคุณไม่มีชื่อตัวแปรหลังเครื่องหมายจุลภาคดังนั้นจึงไม่แยกวิเคราะห์ คุณจะได้รับเอฟเฟกต์ที่คุณต้องการด้วย:
var a = (1, 2, 3);
วงเล็บบังคับให้ใช้เครื่องหมายจุลภาคเป็นตัวดำเนินการแทนที่จะใช้ตัวคั่นระหว่างการประกาศตัวแปร
ในตัวอย่างของคุณเครื่องหมายจุลภาคถูกใช้ในสองบริบท:
var
คำให้การไวยากรณ์ของvar
คำสั่งคือ:
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
ในที่นี้จะใช้จุลภาคเพื่อแยกคู่ชื่อ - ค่าตัวแปร สิ่งต่อไปนี้จะใช้ไม่ได้เนื่องจากชื่อตัวแปรไม่สามารถขึ้นต้นด้วยตัวเลข (ดูชื่อตัวระบุ ):
var bbb = 1, 2, 3;
// SyntaxError: Unexpected number
ตัวดำเนินการลูกน้ำจะประเมินตัวถูกดำเนินการทั้งสอง (จากซ้ายไปขวา) และส่งคืนค่าของตัวถูกดำเนินการที่สอง นิพจน์ต่อไปนี้ทำงานดังนี้:
aaa = 1, 2, 3;
aaa = 1, 2
ให้ผล 2
aaa = 1
ได้รับการประเมินก่อนเนื่องจาก=
มีลำดับความสำคัญสูงกว่า,
2, 3
ผลตอบแทน 3var bbb = (1, 2, 3);
(1, 2, 3)
ให้ผล3
ตามที่อธิบายไว้ข้างต้นbbb
ถูกกำหนดค่า3
aaa = 1, 2, 3
=> ตัวดำเนินการลูกน้ำใช้เพื่อแยก 3 คำสั่งต่อไปนี้: aaa=1
, 2
และ3
. ผลลัพธ์ของตัวดำเนินการลูกน้ำคือค่าของคำสั่งสุดท้าย 3 อย่างไรก็ตาม aaa ถูกกำหนดค่าเป็น 1 ดังที่เห็นได้ชัดเจนจากภาพหน้าจอของ OP เหตุผลนี้คือลำดับความสำคัญของตัวดำเนินการโดยตัวดำเนินการจุลภาคมีลำดับความสำคัญต่ำสุด
ในกรณีแรก:
aaa = 1,2,3
เครื่องหมายจุลภาคทำหน้าที่เป็นตัวคั่นนิพจน์ ดำเนินการมอบหมายให้aaa
แล้วคำนวณ2
และทิ้งมันจากนั้นจะคำนวณ3
และทิ้งมัน
ในวินาที:
var bbb = 1,2,3
var
คำหลักบอกคอมไพเลอร์จาวาสคริปต์ที่สิ่งต่อไปหลังจากที่,
ควรจะเป็นอีกชื่อตัวแปร มันหาไม่เจอก็เลยตายมุข
var bbb = (1,2,3)
ที่นี่คอมไพลเลอร์จะประเมิน1
และเพิกเฉยก่อน จากนั้นจะประเมิน2
และไม่สนใจมัน จากนั้นจะประเมิน3
และที่เหลืออยู่ในสแต็กจึงถูกกำหนดให้bbb
แม้ว่าการใช้เครื่องหมายจุลภาคเพื่อแยกนิพจน์ไม่ใช่เรื่องปกติ แต่บางครั้งก็มีประโยชน์ในเรื่องต่างๆเช่นfor
รูปลักษณ์
for (i = 0, l = 10; i < l; i++) {
console.log(i);
}
var a1,a2,a3;
ก็จะประกาศตัวแปรท้องถิ่นสามตัว