วันนี้เมื่อฉันดูโค้ดต้นแบบ ฉันค้นพบตัวดำเนินการลบ
ไม่ได้ตั้งค่า: ฟังก์ชั่น (คีย์) {
ค่า var = this._object [คีย์];
ลบ this._object[คีย์];
ค่าส่งคืน;
-
ฉันตรวจสอบคู่มือแล้ว
ตัวดำเนินการลบจะลบคุณสมบัติออกจากวัตถุหรือองค์ประกอบจากอาร์เรย์
ลบการแสดงออก
พารามิเตอร์นิพจน์คือนิพจน์ JScript ที่ถูกต้อง ซึ่งโดยปกติจะเป็นชื่อคุณสมบัติหรือองค์ประกอบอาร์เรย์
คำอธิบาย หากผลลัพธ์ของนิพจน์คือออบเจ็กต์และมีแอตทริบิวต์ที่ระบุในนิพจน์อยู่ และออบเจ็กต์ไม่อนุญาตให้ลบออก จะส่งคืนค่า false
ในกรณีอื่นๆ ทั้งหมด ให้คืนค่าเป็นจริง
รู้สึกดีที่เห็น "ลบองค์ประกอบออกจากอาร์เรย์" แต่หลังจากลองใช้ใน ff แล้ว ดูเหมือนว่าจะสามารถลบค่าขององค์ประกอบนั้นได้เท่านั้น ไม่ใช่องค์ประกอบนั้นเอง อย่างไรก็ตาม คุณสามารถลบคุณสมบัติออกจากออบเจ็กต์ได้
ฉัน googled อีกครั้งและพบบทความที่มีรายละเอียดมาก ดังนั้นฉันจะโพสต์ใหม่ที่นี่ ฉันจะไม่ลืม:
หัวข้อ: ตัวแปร Javascript และคำชี้แจงลิขสิทธิ์ของตัวดำเนินการลบ: คุณสามารถพิมพ์ซ้ำได้ตามต้องการ แต่คุณต้องระบุผู้เขียนต้นฉบับ charlee และลิงก์ต้นฉบับ http://tech.idv2.com/2008/01/09/javascript-variables-and- ลบเมื่อพิมพ์ซ้ำ -operator/ และคำสั่งนี้
เนื้อหา:
ฉันเพิ่งอ่านบทความดีๆ (ลิงก์ต้นฉบับ) ซึ่งให้การวิเคราะห์อย่างละเอียดเกี่ยวกับตัวดำเนินการลบใน Javascript นี่คือการแนะนำเนื้อหาโดยย่อ
แม้ว่าจะเป็นตัวดำเนินการลบขนาดเล็ก แต่พฤติกรรมของมันก็ซับซ้อนมาก
ตัวแปรจาวาสคริปต์
ออบเจ็กต์ถูกลบโดยตัวดำเนินการลบ เมื่อดำเนินการลบกับตัวแปร คุณลักษณะที่สามารถลบได้และคุณลักษณะที่ไม่สามารถลบได้ ตัวแปรที่สามารถลบได้ และตัวแปรที่ไม่สามารถลบได้
ค่าส่งคืนของการลบ
-------------------------------------------------- --- ----------------------------------
ตัวแปร Javascript ในความเป็นจริงใน Javascript ตัวแปร = คุณสมบัติวัตถุ เนื่องจาก Javascript จะสร้างออบเจ็กต์ Global ก่อนที่จะรันสคริปต์ ตัวแปรโกลบอลทั้งหมดเป็นคุณสมบัติของออบเจ็กต์ Global นี้ เมื่อรันฟังก์ชัน ออบเจ็กต์การเปิดใช้งานจะถูกสร้างขึ้นด้วย ตัวอย่างเช่น:
var global = 42;this.global; // 42 คุณสามารถเข้าถึง Global object ผ่านทาง this.global2 = 12;global2; // 12function foo() { var local = 36; // อย่างไรก็ตาม ไม่สามารถเปิดใช้งานได้ สามารถเข้าถึงได้โดยตรง // ดังนั้นจึงไม่สามารถเข้าถึงตัวแปรท้องถิ่นผ่าน foo.local} วัตถุที่ถูกลบโดยตัวดำเนินการลบ
นอกจากนี้ยังมีตัวดำเนินการลบในภาษา C++ ซึ่งจะลบวัตถุที่ตัวชี้ชี้ไป ตัวอย่างเช่น:
// C++class Object {public: Object *x;}Object o;ox = new Object();delete ox; // Object object ใหม่ในบรรทัดก่อนหน้าจะถูกปล่อยออกมา แต่การลบของ Javascript นั้นแตกต่างออกไป จาก C ++ วัตถุที่ ox ชี้ไปจะไม่ถูกลบ แต่แอตทริบิวต์ ox เองจะถูกลบ
// Javascriptvar o = {};ox = new Object();delete ox; // Object object ใหม่ในบรรทัดก่อนหน้ายังคงมีอยู่ ox; // undefinition, คุณสมบัติชื่อ x of o จะถูกลบออกใน Javascript จริง, หลังจากลบ ox วัตถุ Object จะถูกรวบรวมเนื่องจากสูญเสียการอ้างอิง ดังนั้นการลบ ox จึง "เทียบเท่ากับ" การลบวัตถุที่ ox ชี้ไป อย่างไรก็ตาม การกระทำนี้ไม่ใช่มาตรฐาน ECMAScript กล่าวคือ แม้ว่าการใช้งานจะสมบูรณ์ การไม่ลบวัตถุ Object ก็ไม่ละเมิดมาตรฐาน ECMAScript
"การลบแอตทริบิวต์แทนการลบวัตถุ" สามารถยืนยันได้ด้วยรหัสต่อไปนี้
var o = {};var a = { x: 10 };oa = a;delete oa; // แอตทริบิวต์ oa ถูกลบ oa; // undefineda.x; ยังคงเป็นข้อมูลอ้างอิงดังนั้นจึงไม่สามารถรีไซเคิลได้ นอกจากนี้ Delete ox ยังสามารถเขียนเป็น Delete o["x" ได้ ซึ่งทั้งสองอย่างนี้มีผลเหมือนกัน
เมื่อลบตัวแปร ตัวแปรจะเป็นคุณสมบัติของอ็อบเจ็กต์ Global หรือ Activation ด้วย ดังนั้นการดำเนินการลบบนตัวแปรจึงมีผลลัพธ์เหมือนกัน
var global = 42; Delete global; // Delete Global.globalfunction foo() { var local = 36; Delete local; // Delete Activation.local} คุณสมบัติที่สามารถลบได้และคุณสมบัติที่ไม่สามารถลบได้ ไม่สามารถลบคุณสมบัติทั้งหมดได้ ลบ. ตัวอย่างเช่น ไม่สามารถลบคุณสมบัติที่ประกาศในต้นแบบได้:
function C() { this.x = 42; }C.prototype.x = 12;var o = new C();ox; .xdelete ox;ox; // 12, ox ที่กำหนดไว้ในต้นแบบจะไม่ถูกลบ แม้ว่าการลบ ox จะถูกดำเนินการอีกครั้ง ไม่สามารถลบคุณสมบัติที่กำหนดไว้ล่วงหน้าของวัตถุได้ คุณลักษณะประเภทนี้ถือได้ว่าเป็นคุณลักษณะของ DontDelete
var re = /abc/i;delete re.ignoreCase;re.ignoreCase; // true, allowanceCase ไม่สามารถลบตัวแปรที่สามารถลบได้ และตัวแปรที่ไม่สามารถลบได้ ไม่สามารถลบได้
var x = 36;delete x;x; // 36, x ไม่ถูกลบ y = 12;delete y;y; // undefinition foo() { return 42; }delete foo;foo(); // 42 ข้อยกเว้นประการหนึ่งคือในโค้ดที่ดำเนินการผ่าน eval แม้ว่าตัวแปรที่ประกาศผ่าน var จะอยู่ในอ็อบเจ็กต์ Global เดียวกันกับตัวแปรที่ประกาศ var ปกติ แต่ก็ไม่มีแอตทริบิวต์ DontDelete และสามารถลบได้
eval("var x = 36;");x; // 42delete x;x; // unknown แต่มีข้อยกเว้น ตัวแปรที่กำหนดโดย var ในฟังก์ชันในโค้ด eval มี DontDelete และไม่สามารถลบได้ eval(" ( function() { var x = 42; Delete x; return x; })();"); // ส่งคืนค่าที่ส่งคืนเป็น 42delete
Delete เป็นตัวดำเนินการปกติและส่งคืนค่าจริงหรือเท็จ กฎคือ: เมื่อมีคุณสมบัติของออบเจ็กต์ที่ถูกลบและมี DontDelete จะส่งคืนค่าเท็จ มิฉะนั้นจะส่งกลับค่าจริง คุณลักษณะหนึ่งที่นี่คือการคืนค่า true แม้ว่าจะไม่มีแอตทริบิวต์ของวัตถุก็ตาม ดังนั้นค่าที่ส่งคืนจึงไม่เทียบเท่ากับการลบสำเร็จหรือไม่
ฟังก์ชั่น C() { this.x = 42; }C.prototype.y = 12;var o = new C();ลบ ox; // trueo.x; / ox มีอยู่และไม่มี DontDelete ให้คืนค่า truedelete oy; // trueo.y; คุณลักษณะของวัตถุและคุณลักษณะต้นแบบแตกต่างกัน ลบ o; // false// Global.o มีแอตทริบิวต์ DontDelete ดังนั้นจึงส่งคืน falsedelete undefineProperty; // true/ / 42 ไม่ใช่คุณสมบัติดังนั้นจึงส่งคืน true การใช้งานบางอย่างจะมีข้อยกเว้น (ละเมิดมาตรฐาน ECMAScript) var x = 24; Delete x++; // 25// สิ่งที่ถูกลบคือค่าส่งคืน (24) ของ x++ ไม่ใช่แอตทริบิวต์ ดังนั้นจะถูกส่งกลับจริง