2011-08-25 17 views
6

Chúng tôi có một số câu hỏi ở đây thảo luận xóa theo cách trừu tượng hơn, nhưng tôi đang tìm các ví dụ thực tế khi sử dụng delete, so với thực hiện một số việc như đặt thuộc tính thành rỗng hoặc không xác định.Một số trường hợp sử dụng khi nào `xoá` đã rất hữu ích trong JavaScript?

The delete operator deletes a property of an object.

gì một trường hợp vướng mắc gặp ở đâu đó, rằng delete là giải pháp tốt nhất, so với cái gì khác?

Trả lời

2
Object.defineProperty(Object.prototype, "Incognito", { 
    get: function() { return 42; }, 
    set: function() { }, 
    configurable: true 
}); 

console.log(({}).Incognito); // 42 
({}).Incognito = null; 
console.log(({}).Incognito); // 42 

// I DO NOT WANT INCOGNITO 
delete Object.prototype.Incognito 
console.log(({}).Incognito); // undefined 

Bất kỳ tài sản trong đó có một setter rỗng (Bởi vì một người nào đó nghĩ rằng là một ý tưởng tốt) cần phải bị xóa nếu bạn muốn thoát khỏi nó.

var hash = { 
    "FALSE": undefined, 
    "TRUE": null 
} 

console.log("TRUE" in hash); // true 
console.log("FALSE" in hash); // true 
delete hash.FALSE; 
console.log("FALSE" in hash); // false 

Toán tử in trả về true cho bất kỳ thuộc tính nào không có giá trị. Nếu bạn muốn trả lại false, bạn cần phải delete thuộc tính.

Trong cả hai trường hợp này thiết lập nó để null hoặc undefined không làm gì (Bởi vì nó có thể có được một setter mà không làm gì, hoặc đó là cách các nhà điều hành in hoạt động)

+0

Tôi không nhận được nó. Whats có điểm gì? Các câu hỏi đã được quan tâm về logic ứng dụng (như xa như tôi đã nhận nó). Vì vậy, câu hỏi vẫn còn mở, lợi ích của việc sử dụng 'xóa' và không chỉ' null'ing biến/tài sản. – jAndy

+1

@jAndy xin lỗi điểm là vô hiệu hóa nó không hoạt động. Tôi đã làm cho nó rõ ràng hơn một chút. – Raynos

+0

uhhh, đã đến khá muộn vào câu trả lời. Phiên bản đầu tiên (chỉ là '.defineProperty') không có ý nghĩa gì nhiều. – jAndy

4

Khi sử dụng một đối tượng như một hashmap, bạn có thể lặp đối với tài sản của đối tượng sử dụng:

for (var key in obj) { 
    // ... 
} 

Nếu một số thuộc tính của đối tượng đã được thiết lập để null, phím của họ sẽ được bao gồm ở đó. Bằng cách sử dụng delete, bạn có thể xóa khóa hoàn toàn.

1

Đặt thuộc tính của đối tượng thành null hoặc undefined vẫn sẽ rời khỏi thuộc tính là có thể đếm được - nếu bạn định thực hiện for..in đối tượng ở bất kỳ giai đoạn nào. muốn thay vào đó là delete.Ví dụ, nếu bạn có một hàm tạo lấy đối số như một đối tượng, nó kế thừa từ một hàm tạo khác, nó thực hiện tương tự và sự hiện diện của một thuộc tính là quan trọng khi gọi hàm tạo mẹ (ví dụ, trong ví dụ dưới đây, ParentWidgets sử dụng đối số của nó với một for..in để tạo thuộc tính HTML), bạn sẽ muốn sử dụng delete để loại bỏ các thuộc tính mà không liên quan đến phụ huynh:

function ChildWidget(kwargs) { 
    kwargs = extend({ 
    childSpecific1: null, childSpecific2: 42 
    }, kwargs || {}) 
    this.childSpecific1 = kwargs.childSpecific1 
    this.childSpecific2 = kwargs.childSpecific2 
    delete kwargs.childSpecific1 
    delete kwargs.childSpecific2 
    ParentWidget.call(this, kwargs) 
} 
inherits(ChildWidget, ParentWidget) 
0

Nhà điều hành delete là hữu ích trong việc thiết lập lại hoặc phương pháp rõ ràng để loại bỏ đối tượng dữ liệu theo nghĩa đen được liên kết với các biểu mẫu:

delete formmap["forms"] 

Nó cũng hữu ích cho việc xóa đối tượng gắn liền với nhà nước:

/* lights... */ 
if (node["alpha"+i].active) 
    { 
    // camera, action 
    node["beta"+i] = chi; 
    } 
else 
    { 
    /* cut! */ 
    delete node["beta"+i]; 
    node["omega"].state = false; 
    } 

Bên cạnh đó, nó hữu ích như một cách viết tắt cho nội tuyến thuộc tính đối tượng không bắt buộc:

var foo = {"bar": [], "drink": [], "tab": [] } 

// happy hour 
this.bar && (foo["bar"]).push(this.bar) || delete foo.bar; 
// open a tab 
this.drink && (foo["drink"]).push(this.drink) || delete foo.drink; 
// cheers 
this.tab && (foo["tab"]).push(this.tab) || delete foo.tab; 

Cuối cùng, nó hữu ích như một cách phân biệt giữa các loại bằng cách sử dụng quyền ghi có thể ghi thuộc tính loại cá thể cụ thể dưới dạng thử nghiệm litmus:

// Function 
!!foo.prototype === true && delete foo.length === false && delete foo[-1] === true 

// Object, Number, Infinity, or Boolean (probably Object) 
!!foo.prototype === false && delete foo.length === true && delete foo[-1] === true 

// Array 
!!foo.prototype === false && delete foo.length === false && delete foo[-1] === true 

// String 
!!foo.prototype === false && delete foo.length === false && delete foo[-1] === false 

// RegExp 
delete foo.source === false 

Tài liệu tham khảo

Các vấn đề liên quan