ผู้ประกอบการท่อคู่ ( ||
) คืออะไร?
ผู้ประกอบท่อคู่ ( ||
) เป็นตรรกะที่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
ในตัวอย่างนี้มีวิธีการตั้งไม่มีการflagA
false
มันจะเป็นความคิดที่ดีกว่าเพื่อตรวจสอบอย่างชัดเจนว่า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
falsy
undefined
จำนวนครั้งที่ฉันได้เห็นdoWeDoIt = doWeDoIt || true
เพียงพอที่จะทำให้ฉันร้องไห้ (เช่นdoWeDoIt
ตอนนี้จะไม่เป็นfalse
)