การออกแบบภาษา JavaScript นั้นไม่เข้มงวดพอและหลายสถานที่จะทำผิดพลาดหากคุณไม่ระวัง
ตัวอย่างเช่นพิจารณาสถานการณ์ต่อไปนี้
ตอนนี้เราจำเป็นต้องพิจารณาว่าวัตถุระดับโลก MyOBJ มีอยู่จริงหรือไม่และหากไม่มีอยู่ให้ประกาศ อัลกอริทึมที่อธิบายไว้ในภาษาธรรมชาติมีดังนี้:
ถ้า (myobj ไม่มีอยู่) {ประกาศ myobj; -คุณอาจพบว่าง่ายต่อการเขียนรหัสนี้ แต่ในความเป็นจริงประเด็นทางไวยากรณ์ที่เกี่ยวข้องนั้นซับซ้อนกว่าที่เราคิด Juriy Zaytsev ชี้ให้เห็นว่ามีมากกว่า 50 วิธีในการตรวจสอบว่ามีวัตถุ JavaScript อยู่หรือไม่ เฉพาะเมื่อรายละเอียดการใช้งานของภาษาจาวาสคริปต์มีความชัดเจนมากพวกเขาจะสามารถแยกแยะได้
วิธีแรกในการเขียน
ขึ้นอยู่กับสัญชาตญาณของคุณคุณอาจคิดว่าคุณสามารถเขียนสิ่งนี้:
if (! myobj) {myobj = {}; -อย่างไรก็ตามหากคุณเรียกใช้รหัสนี้เบราว์เซอร์จะส่งข้อผิดพลาดอ้างอิงโดยตรงทำให้การดำเนินการถูกขัดจังหวะ เกิดอะไรขึ้น?
โดยวิธีการเมื่อคำสั่ง IF กำหนดว่า MyOBJ จะว่างเปล่าตัวแปรนี้ยังไม่มีอยู่หรือไม่ดังนั้นจะมีการรายงานข้อผิดพลาด เปลี่ยนเป็นสิ่งต่อไปนี้และมันจะทำงานอย่างถูกต้อง
if (! myobj) {var myobj = {}; -เหตุใดจึงไม่รายงานข้อผิดพลาดหลังจากเพิ่ม VAR MyOBJ มีอยู่แล้วในกรณีนี้เมื่อคำสั่ง IF ทำให้การตัดสินหรือไม่?
ในการตอบคำถามนี้คุณต้องรู้ว่าล่าม JavaScript ทำงานอย่างไร ภาษา JavaScript คือ "แยกวิเคราะห์ก่อนวิ่งภายหลัง" การประกาศตัวแปรจะเสร็จสมบูรณ์ในระหว่างการแยกวิเคราะห์ดังนั้นรหัสข้างต้นจะเทียบเท่ากับ:
var myobj; if (! myobj) {var myobj = {}; -ดังนั้นเมื่อคำสั่ง IF ทำให้การตัดสิน MYOBJ มีอยู่ดังนั้นจึงไม่มีข้อผิดพลาด นี่คือเอฟเฟกต์ "การปรับปรุงรหัส" ของคำสั่ง VAR ตัวแปร JavaScript เท่านั้นตัวแปร "ยกระดับ" ที่กำหนดโดยคำสั่ง VAR และไม่ทำงานสำหรับตัวแปรที่ไม่ได้ใช้คำสั่ง VAR และกำหนดโดยตรง นี่คือเหตุผลที่มันจะทำให้เกิดข้อผิดพลาดหากคุณไม่เพิ่ม var
วิธีที่สองในการเขียน
นอกเหนือจากคำสั่ง VAR แล้วยังมีการเขียนอีกครั้งและคุณยังสามารถได้รับผลลัพธ์ที่ถูกต้อง:
if (! window.myobj) {myobj = {}; -หน้าต่างเป็นวัตถุระดับบนสุดของ JavaScript และตัวแปรทั่วโลกทั้งหมดเป็นคุณสมบัติ ดังนั้นการตัดสินว่า MyOBJ นั้นว่างเปล่าเทียบเท่ากับการตัดสินว่าวัตถุหน้าต่างมีแอตทริบิวต์ MyOBJ หรือไม่เพื่อหลีกเลี่ยงข้อผิดพลาดอ้างอิงถึงหรือไม่เพราะ MyOBJ ไม่ได้ถูกกำหนด อย่างไรก็ตามจากมาตรฐานของรหัสควรเพิ่ม VAR ไปยังบรรทัดที่สอง:
if (! window.myobj) {var myobj = {}; -หรือเขียนแบบนี้:
if (! window.myobj) {window.myobj = {}; -วิธีที่สามในการเขียน
ข้อเสียของวิธีการเขียนข้างต้นคือในสภาพแวดล้อมการทำงานบางอย่าง (เช่น V8 และ Rhino) หน้าต่างอาจไม่ใช่วัตถุระดับบนสุด ดังนั้นให้พิจารณาการเขียนใหม่เป็น:
if (! this.myobj) {this.myobj = {}; -ในระดับตัวแปรทั่วโลกคำหลักนี้จะชี้ไปที่ตัวแปรระดับบนสุดเสมอดังนั้นจึงสามารถเป็นอิสระจากสภาพแวดล้อมการทำงานที่แตกต่างกัน
วิธีที่สี่ในการเขียน
อย่างไรก็ตามการเขียนข้างต้นนั้นสามารถอ่านได้ไม่ดีและการชี้ของสิ่งนี้เป็นตัวแปรและผิดพลาดได้ง่ายดังนั้นจึงมีการเขียนใหม่เพิ่มเติม:
var global = this; if (! global.myobj) {global.myobj = {}; -มีความชัดเจนมากขึ้นที่จะใช้ตัวแปรที่กำหนดเองทั่วโลกเพื่อเป็นตัวแทนของวัตถุระดับบนสุด
วิธีที่ห้าในการเขียน
นอกจากนี้คุณยังสามารถใช้ตัวดำเนินการ typeof เพื่อตรวจสอบว่า MyOBJ ถูกกำหนดหรือไม่
if (typeof myobj == "undefined") {var myobj = {}; -นี่เป็นวิธีที่ใช้กันอย่างแพร่หลายที่สุดในการตรวจสอบว่ามีวัตถุจาวาสคริปต์อยู่หรือไม่
วิธีที่หกในการเขียน
เนื่องจากค่าของ MyOBJ นั้นเท่ากับไม่ได้กำหนดโดยตรงในกรณีของการกำหนด แต่ไม่ได้รับมอบหมายวิธีการเขียนข้างต้นสามารถทำให้ง่ายขึ้น:
if (myobj == undefined) {var myobj = {}; -มีสองสถานที่ให้สังเกตที่นี่ ขั้นแรกคำหลักของ VAR ในบรรทัดที่สองจะต้องไม่หายไปมิฉะนั้นข้อผิดพลาดของ ReferenceRror จะเกิดขึ้น ประการที่สองไม่สามารถเพิ่มที่ไม่ได้กำหนดด้วยคำพูดเดี่ยวหรือสองเท่าเนื่องจากชนิดข้อมูลของ undefined ถูกเปรียบเทียบที่นี่แทนที่จะเป็นสตริง "undefined"
วิธีที่เจ็ดในการเขียน
วิธีการเขียนข้างต้นยังคงใช้ได้ภายใต้เงื่อนไขของ "การเปรียบเทียบที่ถูกต้อง" (===):
if (myobj === undefined) {var myobj = {}; -วิธีที่แปดในการเขียน
ตามการออกแบบภาษาของ JavaScript, undefined == null ดังนั้นคุณยังสามารถรับผลลัพธ์ที่ถูกต้องโดยการเปรียบเทียบว่า MyOBJ เท่ากับ NULL หรือไม่:
if (myobj == null) {var myobj = {}; -อย่างไรก็ตามแม้ว่าผลการดำเนินการจะถูกต้อง แต่วิธีการตัดสินนี้ไม่ถูกต้องและควรหลีกเลี่ยง เนื่องจาก NULL หมายถึงวัตถุที่ว่างเปล่าที่ได้รับมอบหมายให้เป็นโมฆะนั่นคือวัตถุนี้มีค่าจริงในขณะที่ไม่ได้กำหนดหมายถึงวัตถุที่ไม่มีอยู่หรือไม่มีการมอบหมาย ดังนั้นคุณสามารถใช้ "ผู้ประกอบการเปรียบเทียบ" (==) ได้ที่นี่และหากคุณใช้ "ตัวดำเนินการเปรียบเทียบที่แน่นอน" (===) ที่นี่คุณจะได้รับข้อผิดพลาด
วิธีที่เก้าในการเขียน
นอกจากนี้คุณยังสามารถใช้ตัวดำเนินการในเพื่อตรวจสอบว่า MyOBJ เป็นคุณลักษณะของวัตถุระดับบนสุดหรือไม่:
if (! ('myobj' ในหน้าต่าง)) {window.myobj = {}; -วิธีที่สิบในการเขียน
ในที่สุดใช้วิธี HasownProperty เพื่อตรวจสอบว่า MyOBJ เป็นคุณสมบัติของวัตถุระดับบนสุดหรือไม่:
if (! this.hasownproperty ('myobj')) {this.myobj = {}; -สรุป
1. หากคุณพิจารณาว่าวัตถุนั้นมีอยู่หรือไม่ขอแนะนำให้ใช้วิธีการเขียนที่ห้า
2. หากนอกเหนือจากวัตถุที่มีอยู่แล้วมันก็จำเป็นที่จะต้องพิจารณาว่าวัตถุนั้นมีค่าโมฆะขอแนะนำให้ใช้วิธีการเขียนครั้งแรก
3. เว้นแต่จะระบุไว้เป็นอย่างอื่นตัวแปรทั้งหมดควรได้รับการประกาศโดยใช้คำสั่ง VAR
4. สำหรับข้ามแพลตฟอร์มขอแนะนำให้หลีกเลี่ยงการใช้หน้าต่างเพื่อแสดงวัตถุระดับบนสุด
5. ในภาษา JavaScript Null และ Undefined มีแนวโน้มที่จะสับสน ในกรณีที่ทั้งคู่อาจเกี่ยวข้องขอแนะนำให้ใช้ตัวดำเนินการ "การเปรียบเทียบที่แน่นอน" (===)
(เกิน)
ตัวอย่างง่ายๆข้างต้นของวิธีการตัดสินว่าวัตถุ JavaScript มีอยู่เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณหรือไม่ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น