ฉันต้องการทราบว่า JavaScript มีการประเมิน "ลัดวงจร" เช่น && Operator ใน C # หรือไม่ ถ้าไม่ฉันต้องการทราบว่ามีวิธีแก้ปัญหาที่เหมาะสมในการนำไปใช้หรือไม่
ฉันต้องการทราบว่า JavaScript มีการประเมิน "ลัดวงจร" เช่น && Operator ใน C # หรือไม่ ถ้าไม่ฉันต้องการทราบว่ามีวิธีแก้ปัญหาที่เหมาะสมในการนำไปใช้หรือไม่
คำตอบ:
ใช่ JavaScript มีการประเมินแบบ "ลัดวงจร"
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
Short-circuit
ตัวดำเนินการตรรกะนั้น เพียงแค่ลองด้วยตัวคุณเอง ใช้การสาธิตของฉัน
คำตอบนี้มีรายละเอียดมากเกี่ยวกับวิธีการ การลัดวงจรทำงานใน JavaScript พร้อม gotcha ทั้งหมดและธีมที่เกี่ยวข้องเช่นลำดับความสำคัญของตัวดำเนินการหากคุณกำลังมองหาคำจำกัดความที่รวดเร็วและเข้าใจแล้วว่าการลัดวงจรทำงานอย่างไรฉันขอแนะนำให้ตรวจสอบคำตอบอื่น ๆ
ก่อนอื่นให้ตรวจสอบพฤติกรรมที่เราทุกคนคุ้นเคยภายในif()
บล็อกที่เราใช้&&
ตรวจสอบว่าทั้งสองสิ่งคือtrue
:
if (true && true) {
console.log('bar');
}
ตอนนี้สัญชาตญาณแรกของคุณอาจจะพูดว่า: 'อ่าใช่ค่อนข้างง่ายรหัสจะเรียกใช้คำสั่งถ้าทั้งคู่expr1
และexpr2
ได้รับการประเมินเป็นtrue
'
ใช่และไม่ใช่ คุณเข้าใจถูกต้องในทางเทคนิคนั่นคือพฤติกรรมที่คุณอธิบายไว้แต่นั่นไม่ใช่วิธีการประเมินโค้ดอย่างแน่นอนและเราจะต้องเจาะลึกลงไปเพื่อที่จะเข้าใจอย่างถ่องแท้
&&
และ||
ตีความอย่างไร:ถึงเวลาดู "ภายใต้ฝากระโปรง จาวาสคริปต์ เครื่องยนต์ "ลองพิจารณาตัวอย่างที่ใช้ได้จริงนี้:
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
ผลก็คือ260
.. แต่ทำไม? เพื่อให้ได้คำตอบเราต้องเข้าใจว่าการประเมินการลัดวงจรทำงานอย่างไร
โดยคำจำกัดความของ MDN ตัว
&&
ดำเนินการในexpr1 && expr2
จะดำเนินการดังต่อไปนี้:ถ้า
expr1
สามารถแปลงเป็นtrue
ส่งคืนexpr2
;expr1
อื่นผลตอบแทน
ดังนั้นหมายความว่าในตัวอย่างการปฏิบัติของเราได้รับการconst res
ประเมินด้วยวิธีต่อไปนี้:
expr1
-sanitise(0xFF)
0xFF
เป็นเลขฐานสิบหกที่ถูกต้องสำหรับ 250 มิฉะนั้นฉันจะส่งคืน NaN
expr1
กลับ "truthy" ค่าเวลาในการดำเนินการexpr2
(มิฉะนั้นผมจะหยุดNaN
เป็น falsy)userinput
เป็นความจริง (ตัวเลข) ฉันสามารถเพิ่ม+5
เข้าไปได้ดังนั้นที่นี่เราจึงสามารถหลีกเลี่ยงการif
บล็อกเพิ่มเติมและisNaN
ตรวจสอบเพิ่มเติมได้ด้วยการใช้งานตัว&&
ดำเนินการง่ายๆ
ตอนนี้อย่างน้อยเราควรมีภาพว่าไฟล์ ไฟฟ้าลัดวงจรผู้ประกอบการทำงาน กฎสากลดำเนินไป:
(some falsy expression) && expr
จะประเมินว่าเป็นการแสดงออกที่ไม่ถูกต้อง(some truthy expression) || expr
จะประเมินเป็นการแสดงออกที่แท้จริงนี่คือตัวอย่างเพิ่มเติมเพื่อความเข้าใจที่ดีขึ้น:
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
ดีหวังว่าคุณจะได้รับมัน! สิ่งสุดท้ายที่เราต้องรู้คือกฎเกี่ยวกับลำดับความสำคัญของตัวดำเนินการนั่นคือ:
&&
ดำเนินการจะถูกดำเนินการก่อนตัว||
ดำเนินการเสมอพิจารณาตัวอย่างต่อไปนี้:
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
a()
นี้จะกลับมาเป็นบางทีอาจจะทำให้เกิดความสับสนในการบางอย่าง เหตุผลนั้นค่อนข้างง่ายเพียงแค่สายตาของเราที่หลอกลวงเราเพราะเราคุ้นเคยกับการอ่านจากซ้ายไปขวา ลองนำconsole.log()
สิ่งที่ไม่ออกและมุ่งเน้นไปที่การประเมินผลอย่างแท้จริง
true || false && false
ตอนนี้ให้ห่อหัวของคุณรอบนี้:
เรากล่าวว่าตัว&&
ดำเนินการมีความสำคัญเหนือกว่าดังนั้นจึงได้รับการประเมินเป็นอันดับแรก เพื่อช่วยให้เราจินตนาการถึงการประเมินผลได้ดีขึ้นให้นึกถึงคำจำกัดความ
expr1 && expr2
ที่ไหน:
expr2
คือ false
expr1
คือ true || false
นั่นเป็นส่วนที่ยุ่งยากตอนนี้true || false
ได้รับการประเมินแล้ว ( expr1
ด้านซ้ายของ&&
)
||
ดำเนินการหยุดการดำเนินการหากexpr1 || expr2
ในการexpr1
ประเมินว่าเป็นจริงการexpr1
ดำเนินการจะถูกดำเนินการและการเรียกใช้โค้ดจะหยุดลงค่าที่ส่งคืนคือ true
นั่นค่อนข้างยุ่งยากทั้งหมดเป็นเพราะกฎและความหมายแปลก ๆ ไม่กี่ข้อ แต่จำไว้คุณก็สามารถหลบหนีความสำคัญกับผู้ประกอบการ()
- เช่นเดียวกับในทางคณิตศาสตร์
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1
และexpr2
หรือcondition1
หรืออะไรก็ตามที่เป็นเพียงความสับสน ตัดสินใจอย่างใดอย่างหนึ่งคุณสามารถแนะนำตัวแปรท้องถิ่นเช่น const expr1 = true; if(expr1 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%s
เป็นทางลัดการค้นหา (Chrome / Firefox) เพื่อเพิ่มความเร็วในการค้นหา