ฉันมักจะเห็นคำแถลงการแสดงออกที่มีเงื่อนไขย่อจำนวนมากในรหัสของผู้คนที่ยิ่งใหญ่ทุกที่ หลังจากอ่านบทความบางเรื่องที่แนะนำแง่มุมนี้ฉันคิดว่า 3 วิธี 2 พูดว่า บทความนี้ (http://www.thomasfrank.se/3_ways_2_say_if.html) ไม่เลวเลย ในบทความนี้ผู้เขียนสรุปลักษณะและการใช้งานของการแสดงออกแบบดั้งเดิมของถ้า ... อื่น ๆ ... ,?:, &&/|| และสรุปพวกเขาดังนี้:
1. ถ้า ... โครงสร้างอื่น
// ตั้งค่า r เป็น 0 หรือ 1 var r = math.floor (2*math.random ()) // set a, b และ c เป็น "เล็ก" ถ้า r == 0 และอื่น ๆ ตั้งค่าเป็น "ใหญ่" // โดยใช้สามเทคนิคที่แตกต่างกัน // วิธี 1: ถ้าอื่น var a; if (r == 0) {a = "small"} else {a = "big"}; // วิธีที่ 2: ตัวดำเนินการตามเงื่อนไข var b = r == 0? "เล็ก": "ใหญ่"; // วิธีที่ 3: และ/หรือตัวดำเนินการ var c = r == 0 && "เล็ก" || "ใหญ่"; // ตรวจสอบค่าของการแจ้งเตือนตัวแปรของเรา (r+""+a+""+b+""+c);2. ถ้า ... อื่นถ้า ... โครงสร้างอื่น
// ตั้งค่า r เป็น 0,1,2 หรือ 3 var r = math.floor (4*math.random ()) // set a, b และ c เป็น "nada", "เล็ก", "ใหญ่" และ "ใหญ่" // ขึ้นอยู่กับค่าหรือ r โดยใช้สามเทคนิคที่แตกต่างกัน // วิธี 1: ถ้า .. อื่น ๆ if (r == 0) {a = "nada"} อื่นถ้า (r == 1) {a = "เล็ก"} อื่นถ้า (r == 2) {a = "ใหญ่"} อื่น {a = "ใหญ่"}; // วิธีที่ 2: ตัวดำเนินการตามเงื่อนไข var b = r == 0? "Nada": r == 1? "เล็ก": r == 2? "ใหญ่": "ใหญ่"; // วิธีที่ 3: และ/หรือตัวดำเนินการ var c = r == 0 && "nada" || r == 1 && "เล็ก" || r == 2 && "ใหญ่" || "ใหญ่"; // ตรวจสอบค่าของการแจ้งเตือนตัวแปรของเรา (r+""+a+""+b+""+c);3. ดำเนินการฟังก์ชั่น
// ตั้งค่า r เป็น 0,1,2 หรือ 3 var r = math.floor (4*math.random ()) // ตัวแปรส่วนกลาง x และสี่ฟังก์ชั่นของเรา var x = ""; nada = function () {x+= "nada!"}; small = function () {x+= "เล็ก!"}; big = function () {x+= "big!"}; ใหญ่ = ฟังก์ชั่น () {x+= "ใหญ่!"}; // เรียกฟังก์ชั่นเฉพาะขึ้นอยู่กับค่าของ r // ใช้สามเทคนิคที่แตกต่างกัน // วิธี 1: ถ้า .. อื่นถ้า ... อื่นถ้า ... อื่น ๆ ถ้า (r == 0) {nada ()} อื่นถ้า (r == 1) {เล็ก ()} อื่นถ้า (r == 2) // วิธีที่ 2: ตัวดำเนินการตามเงื่อนไข r == 0? nada (): r == 1? เล็ก (): r == 2? ใหญ่ (): ใหญ่ (); // วิธีที่ 3: และ/หรือตัวดำเนินการ r == 0 && (nada () || true) // nada () ฟังก์ชั่นไม่จำเป็นต้องส่งคืนจริง เพื่อให้แน่ใจว่าตรรกะที่ตามมาหรือ || การตัดสินไม่ได้ดำเนินการค่าที่แท้จริงจะต้องส่งคืนเช่นเดียวกันด้านล่าง || r == 1 && (เล็ก () || จริง) || r == 2 && (big () || true) || ใหญ่(); // ตรวจสอบค่าของการแจ้งเตือนตัวแปรของเรา (r+""+x);4. เรียกใช้รหัส
// ตั้งค่า r เป็น 0,1,2 หรือ 3 var r = math.floor (4*math.random ()) // ตัวแปรส่วนกลาง x var x = ""; // การดำเนินการรหัสที่แตกต่างกันขึ้นอยู่กับค่าของ r // การใช้สามเทคนิคที่แตกต่างกัน // วิธี 1: ถ้า .. อื่นถ้า ... อื่น ๆ ถ้า (r == 0) {x+= "nada!"} อื่นถ้า (r == 1) {x+= "เล็ก!"} ถ้า (r == 2) {x+= "ใหญ่! // วิธีที่ 2: ตัวดำเนินการตามเงื่อนไข r == 0? function () {x+= "nada!"} (): r == 1? function () {x+= "เล็ก!"} (): r == 2? function () {x+= "big!"} (): function () {x+= "ใหญ่!"} (); // วิธีที่ 3: และ/หรือตัวดำเนินการ r == 0 && (ฟังก์ชั่น () {x+= "nada!"} () || true) // มีคนชี้ให้เห็นในความคิดเห็นว่าฟังก์ชั่นที่ไม่ระบุชื่อที่นี่ไม่จำเป็น r == 1 && (ฟังก์ชั่น () {x+= "เล็ก!"} () || จริง) || r == 2 && (ฟังก์ชั่น () {x+= "ใหญ่!"} () || จริง) || function () {x+= "ใหญ่!"} (); // ตรวจสอบค่าของการแจ้งเตือนตัวแปรของเรา (r+""+x);ในบทความออนไลน์นี้ผู้เขียนโฟกัสอยู่ที่ความสั้นของรหัสดังนั้นโดยทั่วไปผู้เขียนชอบที่จะใช้?: ผู้ประกอบการและรู้สึกว่า && และ || วิธีการต้องพิมพ์ตัวอักษรเพิ่มอีกสองสามตัวซึ่งทำให้ดูยุ่งยากมากขึ้น เมื่อดำเนินการฟังก์ชั่นมันจะสะดวกกว่าที่จะใช้แบบดั้งเดิมถ้า ... อื่น ๆ ในความคิดเห็นบางคนแนะนำว่าการทำให้รหัสลูกค้าง่ายขึ้นและสั้นกว่านั้นมีประสิทธิภาพมากกว่าการปรับปรุงประสิทธิภาพการทำงานที่ไม่เด่นซึ่งถูกต้องในบางโปรแกรม ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องเลือกรูปแบบที่กระชับมากขึ้นในการประมวลผลคำแถลงเงื่อนไขจากมุมมองที่เป็นทางการมากกว่าประสิทธิภาพการดำเนินงานของข้อความเหล่านี้เองไม่ต้องพูดถึงว่าประสิทธิภาพการดำเนินงานจะแตกต่างกันไปจาก UA ถึง UA
ในการตัดสินว่ามีเพียงสองเงื่อนไขเท่านั้นที่ใช้ถ้า ... อื่นหรือ?: ทั้งคู่ค่อนข้างตรงไปตรงมาในขณะที่วิธีการทำงานของ && และ || มีความซับซ้อนเล็กน้อย แต่ในความเป็นจริงตราบใดที่คุณเข้าใจหลักการพื้นฐานสองประการต่อไปนี้ปัญหาทั้งหมดจะได้รับการแก้ไข:
ก่อนอื่นเมื่อใช้ตรรกะและ && และตรรกะหรือ || ผู้ประกอบการทิศทางมาจากซ้ายไปขวา && หยุดเมื่อค่าแรกเป็นเท็จ (หรือค่าที่สามารถแปลงเป็นเท็จเช่น null/undefined/0/""/nan ฯลฯ ) และหยุดเมื่อค่าแรกเป็นจริง (หรือค่าที่สามารถแปลงเป็นจริง); ค่าที่ส่งคืนโดยเงื่อนไขทั้งหมดคือค่าของเงื่อนไขที่ตรวจพบล่าสุดไม่จำเป็นต้องเป็นเพียงความจริง/เท็จ
ประการที่สองตรรกะมีลำดับความสำคัญสูงกว่าตัวดำเนินการ && มากกว่าตรรกะหรือตัวดำเนินการ
ตามหลักการแรก R == 0 และ "เล็ก" จะถูกคำนวณตามลำดับจากซ้ายไปขวา หาก r == 0 เป็นจริงจะตรวจพบ "เล็ก" "เล็ก" เป็นสตริงที่ไม่ว่างเปล่าดังนั้น C จะถูกนำมาเป็น "เล็ก"; ถ้า r == 0 เป็นเท็จเงื่อนไขที่สอง "ใหญ่" การตรวจจับตรรกะหรือ || เริ่มต้นโดยตรง ด้วยโทเค็นเดียวกันควรใช้ C เป็น "ใหญ่" ตามหลักการที่สองไม่จำเป็นต้องเพิ่มวงเล็บในระหว่างการทำงานของตัวแปร C ในรหัสข้างต้น
ตั้งแต่ใช้?: และ &&, || ผู้ประกอบการสามารถมีบทบาทในการทำให้รหัสง่ายขึ้นในโปรแกรมบางโปรแกรมมันเป็นสิ่งสำคัญมากในซอร์สโค้ดของห้องสมุดเช่น jQuery โดยสรุปผู้ให้บริการประเภทนี้มีแอปพลิเคชั่นหลักสองรายการ: หนึ่งคือการกำหนดหรือส่งคืนค่าและอีกตัวหนึ่งคือการเรียกใช้รหัส (สำหรับตอนนี้จัดประเภท)
ประเพณีสำหรับการมอบหมายมีอยู่ทุกหนทุกแห่งใน jQuery หรือห้องสมุดอื่น ๆ แอปพลิเคชันคลาสสิกคือการใช้ฟังก์ชันของค่าเริ่มต้นสำหรับอินเทอร์เฟซ เราสามารถเขียนรหัสดังกล่าวได้อย่างง่ายดายเช่น:
var myobj = ฟังก์ชั่น (ตัวเลือก) {var color = opotions.color || this.defaults.defaults; var backgroundColor = ตัวเลือก backgroundColor || this.defaults.backgroundColor;}; myobj.prototype.defaults = {color: "#393939", backgroundColor: "#222"} var myins = myobj ใหม่ ({color: "#80ff80"}); console.log ("สี:"ไม่ว่าจะใช้งานได้หรือไม่: หรือ && และ || เนื่องจากพวกเขาไม่มีฟังก์ชั่นบล็อกรหัสโดยธรรมชาติของถ้า ... อื่น (ห่อด้วยหมายเลข {}) พวกเขาสามารถเรียกใช้รหัสบรรทัดเดียวได้เช่น::
(xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200)? การแจ้งเตือน ("ความสำเร็จ!"): แจ้งเตือน ("ล้มเหลว!");ดังนั้นหากมีหลายรหัสที่ต้องดำเนินการควรใช้ฟังก์ชันที่ไม่ระบุชื่อ ชอบ:
(xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200)? function () {Alert ("ความสำเร็จ!"); var a = 100; การแจ้งเตือน (a);}: การแจ้งเตือน ("ล้มเหลว!");มีตัวย่อมากเกินไปใน jQuery 1.7.1 ซอร์สโค้ดเช่นบรรทัด 2643:
// hook สำหรับ boolean attributesboolhook = {get: function (elem, name) {// การจัดเรียงแอตทริบิวต์บูลีนกับคุณสมบัติที่สอดคล้องกัน // ถอยกลับไปที่การแสดงตนของแอตทริบิวต์ที่บูลีนบางตัวไม่รองรับ var attrNode, คุณสมบัติ = jQuery.prop คืนทรัพย์สิน === True || คุณสมบัติ typeof! == "Boolean" && (attrNode = elem.getattributenode (ชื่อ)) && attrNode.nodevalue! == FALSE? Name.toLowerCase (): ไม่ได้กำหนด; }, set: function () {... }}ดูเหมือนว่าเราต้องเรียนรู้และสรุปต่อไป
ประโยคย่อตัวย่อ JavaScript ข้างต้น (แนะนำ) เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น