Delete Operator ใช้ลบ Property ออกจาก Object ไม่ใช่ลบตัวแปรหรือ Array Element
ตัวอย่างจากบทความ (มี Bug)
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var cricketer = {
name: "Amit",
rank: 1,
points: 400
};
delete cricketer.rank; // ลบ property rank
document.getElementById("demo").innerHTML =
cricketer.name + " has " + cricketer.rank + " rank.";
</script>
</body>
</html>
⚠️ ผลลัพธ์: "Amit has undefined rank." - เพราะ rank ถูกลบแล้ว ควรเช็คก่อนแสดง
ไวยากรณ์
delete object.property delete object['property'] delete object[expression]
สิ่งที่ Delete ทำได้
1. ลบ Property จาก Object
const user = { name: 'John', age: 30, email: 'john@example.com' };
delete user.age;
console.log(user); // { name: 'John', email: 'john@example.com' }
console.log('age' in user); // false
2. ลบ Property ด้วย Bracket Notation
const key = 'email'; delete user[key];
3. คืนค่า Boolean
const obj = { a: 1 };
delete obj.a; // true (สำเร็จ)
delete obj.a; // true (ลบซ้ำก็ true - ไม่ error)
delete obj.b; // true (property ไม่มีอยู่ก็ true)
สิ่งที่ Delete ทำไม่ได้
1. ลบ Variable (Variable Declaration)
var x = 10; delete x; // false (strict mode: SyntaxError) // ไม่สามารถลบตัวแปรที่ประกาศด้วย var/let/const
2. ลบ Function Declaration
function foo() {}
delete foo; // false
3. ลบ Array Element (ทำได้แต่ไม่แนะนำ)
const arr = [1, 2, 3, 4]; delete arr[1]; // true console.log(arr); // [1, empty, 3, 4] - ช่องว่าง (sparse array) console.log(arr.length); // 4 (length ไม่เปลี่ยน!) // ใช้ splice แทน arr.splice(1, 1); // [1, 3, 4] length = 3
4. Non-configurable Properties
const obj = {};
Object.defineProperty(obj, 'fixed', {
value: 1,
configurable: false
});
delete obj.fixed; // false (strict mode: TypeError)
Strict Mode
'use strict';
var x = 1;
delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.
const obj = { a: 1 };
delete obj.a; // OK - property deletion allowed
Best Practice
- ใช้
deleteเฉพาะกับ Object Properties - Array ใช้
splice(),filter(),pop(),shift() - Variable ใช้
let/constและปล่อยให้ GC จัดการ (set = null) - ตรวจสอบด้วย
'prop' in objหรือobj.hasOwnProperty('prop')หลังลบ
Performance Note
delete ทำให้ Object กลายเป็น Dictionary Mode (ช้ากว่า Fast Properties) หากลบบ่อย ควรพิจารณา Map หรือ obj.prop = undefined แทน (แต่ property ยังคงอยู่)