Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

Delete Operator ใน JavaScript คืออะไร

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 ยังคงอยู่)