2012-08-27 38 views
10

Theo this MDN page, các delete từ khóaÝ nghĩa thực sự của giá trị trả về của `xóa` là gì?

Returns sai chỉ khi tài sản tồn tại và không thể bị xóa. Nó trả về đúng trong tất cả các trường hợp khác.

Tuy nhiên, tôi thấy trường hợp delete lợi nhuận true, bất chấp tài sản không bị xóa:

delete Window 
delete alert 
delete dir 
delete console 
delete 2 
delete null 
delete {}.x 
... 

Trong thực tế, hầu như tất cả các thuộc tính của window trở lại đúng với delete, như có thể thấy bằng cách chạy tập lệnh sau trong about:blank:

for(a in window) { if(delete window[a]) { console.log(a); } } 

Tuy nhiên, hầu hết các thuộc tính của window do không thực sự bị xóa. Ý nghĩa thực sự của giá trị trả về của delete là gì? Tại sao nó trả lại true cho các thuộc tính mà nó không xóa?

(Lưu ý:. Tôi sẽ quan tâm đến tài liệu tham khảo để mã Chromium giải thích hành vi của delete)

+0

Dòng đó xuất ra khá nhiều tên cho tôi, và sau đó vô hiệu hóa jQuery vì vậy tôi không thể nói như vậy. Dường như nó hoạt động như dự định. –

+0

Bạn đã thử các ví dụ như 'xóa Cửa sổ', v.v ...? – Randomblue

Trả lời

8

Cửa sổ là host object, một ngữ nghĩa có ngữ nghĩa được xác định bởi môi trường máy chủ, ví dụ: Trình duyệt. delete khi áp dụng cho các thuộc tính của đối tượng lưu trữ phức tạp hơn khi áp dụng cho đối tượng gốc.

Đối tượng lưu trữ có thể hỗ trợ các đặc tính bên trong này với bất kỳ hành vi phụ thuộc thực hiện nào miễn là nó phù hợp với giới hạn đối tượng lưu trữ cụ thể được nêu trong tài liệu này.

Section 11.4.1 - The delete operator nói

If IsUnresolvableReference(ref) then, 
    If IsStrictReference(ref) is true, throw a SyntaxError exception. 
    Else, return true. 

vì thế khi một đối tượng máy chủ không hỗ trợ xóa hoặc sửa đổi của một tài sản, sau đó nó sẽ trả về một tham chiếu không thể giải quyết hoặc một tài liệu tham khảo mà giả vờ bị xóa. Hoặc cách tiếp cận gây ra true để được trả lại ở chế độ không nghiêm ngặt.

1

Cho rằng bạn đang hành động trên các đối tượng ở mức độ thấp trong chương trình của bạn, các thuộc tính trong thực tế có thể bị xóa và sau đó ngay lập tức được thêm lại, mặc dù tôi không biết bạn có thể kiểm tra hành vi này như thế nào.

1

Trên trang MDN đó, nó chỉ định cú pháp, không bao gồm delete object làm bộ ví dụ đầu tiên của bạn sử dụng. Nó chỉ định cú pháp delete object[property] làm ví dụ thứ hai của bạn. Tuy nhiên, những gì xảy ra với các đối tượng DOM (host) không được chỉ định. Xem this article for more information.

0

Về cơ bản, các trình duyệt đang bảo vệ môi trường thời gian chạy của trình duyệt, trong thử nghiệm của bạn.

Ngày xửa ngày xưa, có thể không có được như vậy, nhưng như xa như kiểm tra đi, đây là giống như hỏi tại sao Windows không cho phép bạn mở các lệnh shell và chạy:

> cd/
> deltree *.* 

nữa.

Bởi vì thực sự không có lý do gì để có thể thực hiện một điều như vậy, khi bạn đang mong đợi môi trường tiếp tục chạy, sau đó và không gỡ bỏ toàn bộ trình duyệt của bạn, bạn hiện đang chạy hoặc bất kỳ lỗi thú vị nào khác có thể xảy ra khi bạn yêu cầu chương trình xóa chính nó trong thời gian thực, trong khi nó hiện có quyền truy cập cấp thấp vào thiết bị GPU/soundcard/đầu vào của bạn.

Xóa sẽ trả về lỗi trong trường hợp bạn cố xóa một biến. Về mặt tính chất toàn cầu, trình duyệt cần hoạt động, hầu hết chúng được định nghĩa như một thuộc tính (ví dụ: window.location) nhưng được thực hiện ở mức thấp (ví dụ: bạn không có quyền truy cập). Về mặt lý thuyết, chúng là những vật thể có thể bị xóa. Nhưng chúng được bảo vệ, vì vậy bạn không thể, nhưng điều đó sẽ không thay đổi câu lệnh return của delete, bởi vì điều đó sẽ thay đổi hành vi mong đợi của delete.

Vì vậy:

function() { 
    var obj = { prop : true }; 
    delete obj; /* fail */ 
    delete object.prop; /* succeed */ 
} 
2

Việc thực hiện javascript được sử dụng bởi các trình duyệt luôn luôn là uốn các quy tắc. Một phần của javascript DOM API thậm chí không thể có trong javascript thuần túy, ví dụ dom innerHTML = "something" kích hoạt một sự kiện. Điều này đã được sửa trong EcmaScript5, nhưng bạn không thể dựa vào Mô hình đối tượng trình duyệt là javascript hợp lệ 100%. AFAIK, miễn là bạn không đặt chân vào DOM và BOM, bạn có thể dựa hoàn toàn vào tiêu chuẩn ecmascript.

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