2013-05-06 36 views
20

gì sẽ xảy ra trong JavaScript nếu tôi có một biến, nói:Trong JavaScript, điều gì sẽ xảy ra nếu "xóa" một thuộc tính không tồn tại?

var exampleObject = {one:'foo',two:'bar'}; 

và sau đó tôi xóa một tài sản đó không tồn tại, a la:

delete exampleObject.seven; 

Có một khóa học tiêu chuẩn của hành động diễn ra ở khắp mọi nơi (không có gì, thông báo lỗi, sự cố tập lệnh, v.v.) hoặc điều này phụ thuộc vào một số loại triển khai (công cụ trình duyệt, v.v.)?

+6

Là nó mà khó để kiểm tra? – Joseph

+10

Nó không rõ ràng đối với tôi hay không một cái gì đó diễn ra phụ thuộc vào môi trường hoặc một tiêu chuẩn trên tất cả các triển khai của ngôn ngữ. – thisissami

+3

thế giới kết thúc trong một vụ nổ nước mắt của thần –

Trả lời

18

Không có gì xảy ra.

Giả sử, x = {}, Type(x.y)không một Reference Specifcation Type (không thể có một "tài liệu tham khảo" tới tài sản đó không tồn tại). Theo 11.4.1 The delete Operator, điều này đáp ứng các quy tắc:

  1. Hãy ref là kết quả của việc đánh giá UnaryExpression.
  2. Nếu loại (ref) không tham chiếu, hãy trả về true.
  3. ...

Hành vi này ("không hành động") đã tồn tại trong một thời gian dài - bất kỳ môi trường mà ứng xử khác nhau là không tuân thủ. Từ 3rd Edition ECMAScript Specification:

Khi [[Xóa]] phương pháp O được gọi với tên thuộc tính P, các bước sau đây được thực hiện:

  1. Nếu O không có một tài sản với tên P, trả về true.
  2. ..
+0

Tôi sẽ * thực sự thích * phản hồi về xác nhận của tôi rằng Type (xy) không dẫn đến Loại Đặc tả Tham chiếu; đọc lại đặc điểm kỹ thuật dường như ngụ ý rằng nó sẽ là 'IsUnresolvableReference' (??); trong trường hợp nào, tại sao FF/Chrome không sử dụng SyntaxError khi sử dụng nghiêm ngặt? – user2246674

+0

Câu trả lời của bạn là đúng. "IsUnresolvableReference (V). Trả về true nếu giá trị cơ sở là undefined và false nếu không." - "Giá trị cơ bản" sẽ là 'x' trong ví dụ của bạn, không phải' y'. –

+0

@DaggNabbit Cảm ơn, đó là những gì tôi nghĩ, nhưng sau đó tôi kết thúc với một trong hai ReferenceErrors hoặc TypeErrors và không phải là một SyntaxError; '(function() {" sử dụng nghiêm ngặt "; xóa dne.y;})();' (ReferenceError), '(function() {" sử dụng nghiêm ngặt "; var x = undefined; delete xy;})(); '(TypeError) – user2246674

9

Nếu exampleObject là một đối tượng, giá trị trả lại từ xóa là đúng, ngay cả khi thuộc tính không tồn tại.

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