ใน ES3 การลบถูกนำมาใช้ใน 8.6.2.5 และ 11.4.1 ดังต่อไปนี้
มีข้อมูลบางอย่าง
1. ตัวดำเนินการลบในการใช้งานจะเรียกใช้เมธอด [[Delete]] ภายในกลไก
2. [[ลบ]] ถูกกำหนดไว้ใน 8.6.2
3. คุณลักษณะที่ถูกลบจะมีคุณลักษณะ DontDelete หากเป็นเช่นนั้น เท็จจะถูกส่งกลับโดยตรงเมื่อทำการลบ
ค้นหา "DontDelete" แล้วคุณจะพบหลายรายการต่อไปนี้ไม่สามารถลบได้
1. เปิดใช้งานวัตถุอาร์กิวเมนต์ของวัตถุ (10.1.6)
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น func() {
ลบข้อโต้แย้ง
การแจ้งเตือน (ข้อโต้แย้ง);
-
ฟังก์ชั่น(1);
2. การประกาศตัวแปร (10.2.1)
คัดลอกรหัสรหัสดังต่อไปนี้:
วาร์ ก = 10;
ลบ;
การแจ้งเตือน (ก); // 10
บทความนี้มีการกล่าวถึงในหนังสือ JS หลายเล่ม กล่าวคือ ตัวแปรที่ประกาศโดยใช้ var ไม่สามารถลบได้
3. การประกาศฟังก์ชัน
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น func() {}
ลบฟังก์ชั่น;
การแจ้งเตือน (func); // รหัส func
4. คุณลักษณะความยาวของฟังก์ชัน
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น func(a, b) {}
ลบ func.length;
การแจ้งเตือน (func.length); // 2
5. ค่าคงที่บางค่า (NaN, Infinity, ไม่ได้กำหนด)
คัดลอกรหัสรหัสดังต่อไปนี้:
ลบน่าน; // เท็จ
ลบอินฟินิตี้; // เท็จ
ลบไม่ได้กำหนด; // เท็จ
6. ต้นแบบของตัวสร้างแบบบิวท์อิน
คัดลอกรหัสรหัสดังต่อไปนี้:
ลบ Object.prototype; // false
ลบ Function.prototype; // false
ลบ Array.prototype; // false
ลบ ExpReg.prototype; // false
ลบ Date.prototype; // false
ลบ Error.prototype; // false
ลบ Number.prototype; // false
ลบ Boolean.prototype; // false
ลบ String.prototype; // false
7. ความยาวของอาร์เรย์และสตริง
คัดลอกรหัสรหัสดังต่อไปนี้:
var arr = [], str = 'สวัสดี';
ลบ arr.length; // false
ลบ str.length; // false
8. คุณสมบัติของวัตถุทางคณิตศาสตร์ (Math.E, Math.LN10, Math.LN2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2)
คัดลอกรหัสรหัสดังต่อไปนี้:
ลบ Math.E; // false
-
9. คุณสมบัติของวัตถุปกติ (แหล่งที่มา, ทั่วโลก, ละเลยกรณี, หลายบรรทัด, LastIndex)
คัดลอกรหัสรหัสดังต่อไปนี้:
var reg = /ss/;
ลบ reg.source; // false
-
ES5 นั้นแตกต่างจาก ES3 ไม่มี "DontDelete" ใน ES5 แต่มีการเพิ่ม [[Configurable]] (8.6.1) เข้าไป
หากค่าเป็นเท็จ จะไม่สามารถลบได้ เก้าจุดข้างต้นอธิบายไว้ใน ES5 ว่า [[Configurable]] เป็นเท็จ
วิธีการ Object.defineProperty ใหม่ใน ES5 สามารถแสดงการกำหนดค่าของวัตถุที่กำหนดได้ดังต่อไปนี้
คัดลอกรหัสรหัสดังต่อไปนี้:
var obj = {ชื่อ: 'จอห์น'};
Object.defineProperty (obj, "คีย์", {
กำหนดค่าได้: เท็จ,
ค่า: "คงที่"
-
ลบ obj.name; // จริง
ลบ obj.key // false
วัตถุ obj มีชื่อและรหัส ลบชื่อได้ แต่คีย์ไม่สามารถลบได้
นอกจากนี้ ในโหมดเข้มงวด ES5 ข้อยกเว้นจะถูกส่งโดยตรงเมื่อลบออบเจ็กต์ที่กำหนดค่าได้เป็นเท็จ ชอบ
คัดลอกรหัสรหัสดังต่อไปนี้:
"ใช้อย่างเข้มงวด";
ลบ Object.prototype;
ข้อผิดพลาดของคอนโซลใน FF จะเป็นดังนี้:
นอกเหนือจากวิธีการหรือคุณสมบัติบางอย่างของออบเจ็กต์ในตัวที่ไม่สามารถลบได้ ยังมีออบเจ็กต์แบบกำหนดเองที่ไม่สามารถลบได้อีกด้วย ตัวอย่างเช่น ลบไม่สามารถลบออบเจ็กต์ที่สืบทอดคุณสมบัติจากต้นแบบได้
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่นบุคคล() {}
Person.prototype.name = 'จอห์น แบ็คคัส';
var p = บุคคลใหม่ ();
ลบ p.name;
console.log(p.name); // ยังคงส่งออก John Backus
หากมีชื่อบนสิ่งนี้และต้นแบบ หลังจากลบแล้ว ต้นแบบจะปรากฏขึ้น
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่นบุคคล () {
this.name = 'จอห์น แบ็คคัส';
-
Person.prototype.name = 'จอห์น รีซิก';
var p = บุคคลใหม่ ();
console.log(p.name); // จอห์น แบคคัส
ลบ p.name;
console.log(p.name); // John Resig จากต้นแบบ
หากคุณต้องลบชื่อบนต้นแบบคุณก็ทำได้เท่านั้น
คัดลอกรหัสรหัสดังต่อไปนี้:
ลบ Person.prototype.name
สรุป:
1. คุณสมบัติและวิธีการส่วนใหญ่ของวัตถุในตัวไม่สามารถลบได้ (แม้ว่าบางส่วนสามารถลบได้ เช่น isNaN และ parseInt)
2. คุณสมบัติและวิธีการที่วัตถุสืบทอดมาจากต้นแบบไม่สามารถลบได้
เหตุผลก็ง่ายมากเช่นกัน
1. คุณสมบัติและวิธีการส่วนใหญ่ของออบเจ็กต์ในตัวไม่สามารถลบได้เพื่อปกป้อง API หลักของภาษา เมื่อลบ API เหล่านี้แล้ว จะไม่มีประโยชน์โดยทั่วไป เช่นการลบ Object.prototype
2. คุณลักษณะและวิธีการที่วัตถุสืบทอดมาจากต้นแบบไม่สามารถลบได้เพื่อปกป้องต้นแบบ มิฉะนั้น "หากวัตถุของคลาส A ลบคุณลักษณะบนต้นแบบ วัตถุทั้งหมดที่สืบทอดมาจาก A จะสูญเสียคุณลักษณะ"