ผู้ประกอบการท่อคู่ ( ||) คืออะไร?
ผู้ประกอบท่อคู่ ( ||) เป็นตรรกะที่ORผู้ประกอบการ ในภาษาส่วนใหญ่จะทำงานด้วยวิธีต่อไปนี้:
- หากค่าแรกคือ
falseมันจะตรวจสอบค่าที่สอง ถ้าเป็นtrueมันจะกลับมาtrueและถ้าเป็นfalseก็จะกลับfalseมา
- ถ้าค่าแรกคือ
trueมันจะคืนค่าเสมอtrueไม่ว่าค่าที่สองคืออะไร
ดังนั้นโดยทั่วไปมันใช้งานได้เหมือนฟังก์ชั่นนี้:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
หากคุณยังไม่เข้าใจให้ดูที่ตารางนี้:
| true false
------+---------------
true | true true
false | true false
กล่าวอีกนัยหนึ่งมันเป็นเท็จเฉพาะเมื่อทั้งสองค่าเป็นเท็จ
JavaScript มีความแตกต่างกันอย่างไร
JavaScript เป็นที่แตกต่างกันเล็กน้อยเพราะมันเป็นภาษาพิมพ์อย่างอิสระ ในกรณีนี้หมายความว่าคุณสามารถใช้||โอเปอเรเตอร์ที่มีค่าที่ไม่ใช่บูลีน แม้ว่ามันจะไม่สมเหตุสมผล แต่คุณสามารถใช้โอเปอเรเตอร์นี้กับตัวอย่างฟังก์ชันและวัตถุ:
(function(){}) || {}
เกิดอะไรขึ้นที่นั่น
ถ้าค่าไม่ได้บูล, JavaScript ทำให้การแปลงนัยเพื่อบูล มันหมายความว่าถ้ามีค่าเป็น falsey (เช่น0, "", null, undefined(เห็นทุกค่า falsey ใน JavaScript )) ก็จะถือว่าเป็นfalse; trueมิฉะนั้นจะถือเป็น
ตัวอย่างด้านบนควรให้trueเพราะฟังก์ชันว่างคือความจริง ก็ไม่เป็นไร ส่งคืนฟังก์ชันว่าง นั่นเป็นเพราะ||ตัวดำเนินการของ JavaScript ไม่ทำงานอย่างที่ฉันเขียนไว้ตอนต้น มันทำงานวิธีดังต่อไปนี้:
- ถ้าค่าแรกคือfalseyก็จะส่งกลับค่าที่สอง
- ถ้าค่าแรกคือtruthyก็จะส่งกลับค่าแรก
ประหลาดใจ? อันที่จริงมันเป็น "เข้ากันได้" กับ||ผู้ประกอบการแบบดั้งเดิม มันสามารถเขียนได้เป็นฟังก์ชั่นดังต่อไปนี้:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
หากคุณผ่านค่าความจริงตามที่xมันส่งคืนxนั่นคือค่าความจริง ดังนั้นถ้าคุณใช้มันในภายหลังในifข้อ:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
"Either x or y is truthy."คุณจะได้รับ
ถ้าxเป็น falsey, จะเป็นeitherXorY yในกรณีนี้คุณจะได้รับ"Either x or y is truthy."ถ้าyเป็นจริง; "Neither x nor y is truthy"มิฉะนั้นคุณจะได้รับ
คำถามจริง
ตอนนี้เมื่อคุณรู้ว่า||ผู้ให้บริการทำงานอย่างไรคุณอาจทำเองได้ด้วยความx = x || yหมาย ถ้าxเป็นจริงxได้รับมอบหมายให้xดังนั้นจริง ๆ แล้วไม่มีอะไรเกิดขึ้น; มิฉะนั้นจะถูกกำหนดให้y xมันถูกใช้เพื่อกำหนดพารามิเตอร์เริ่มต้นในฟังก์ชั่น อย่างไรก็ตามมันมักจะถูกพิจารณาว่าเป็นแบบฝึกหัดการเขียนโปรแกรมที่ไม่ดีเพราะมันจะป้องกันคุณจากการผ่านค่าความผิดพลาด (ซึ่งไม่จำเป็นundefinedหรือnull) เป็นพารามิเตอร์ ลองพิจารณาตัวอย่างต่อไปนี้:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
มันดูถูกต้องตั้งแต่แรกเห็น แต่สิ่งที่จะเกิดขึ้นถ้าคุณผ่านการfalseเป็นflagAพารามิเตอร์ (ตั้งแต่มันบูลคือสามารถtrueหรือfalse)? มันจะกลายเป็น trueในตัวอย่างนี้มีวิธีการตั้งไม่มีการflagAfalse
มันจะเป็นความคิดที่ดีกว่าเพื่อตรวจสอบอย่างชัดเจนว่าflagAเป็นundefinedเช่นนั้น:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
แม้ว่าจะใช้เวลานาน แต่ก็ใช้งานได้และเข้าใจง่ายกว่า
คุณยังสามารถใช้ไวยากรณ์ ES6 สำหรับพารามิเตอร์ฟังก์ชั่นเริ่มต้นได้ แต่โปรดทราบว่ามันจะไม่ทำงานในเบราว์เซอร์รุ่นเก่า (เช่น IE) หากคุณต้องการที่จะสนับสนุนเบราว์เซอร์เหล่านี้คุณควร transpile รหัสของคุณกับบาเบล
ดูเพิ่มเติมOperators Logical บน MDN
falsyundefinedจำนวนครั้งที่ฉันได้เห็นdoWeDoIt = doWeDoIt || trueเพียงพอที่จะทำให้ฉันร้องไห้ (เช่นdoWeDoItตอนนี้จะไม่เป็นfalse)