2013-05-06 13 views
20

Co się stanie, jeśli w JavaScript Mam zmiennej, powiedzmy:W języku JavaScript, co się stanie, jeśli "usuniesz" właściwość, która nie istnieje?

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

a następnie usunąć właściwość, która nie istnieje, a la:

delete exampleObject.seven; 

Czy istnieje standardowy sposób postępowania która ma miejsce wszędzie (nic, komunikat o błędach, awarie skryptów itp.), czy jest to zależne od implementacji (silnik przeglądarki itp.)?

+6

Czy to takie trudne do testowania? – Joseph

+10

Nie jest dla mnie oczywiste, czy coś, co ma miejsce, zależy od środowiska lub standardu we wszystkich implementacjach języka. – thisissami

+3

świat kończy się eksplozją boskich łez –

Odpowiedz

18

Nic się nie dzieje.

Zakładając, x = {}, Type(x.y) jest nieReference Specifcation Type (nie może być „odniesienie” do obiektu, który nie istnieje). Według 11.4.1 The delete Operator ta spełnia zasadę:

  1. niech ref wynikiem oceny UnaryExpression.
  2. Jeśli Type (ref) nie jest Reference, zwróć true.
  3. ...

Takie zachowanie („brak działań”) istnieje już od dłuższego czasu - w każdym środowisku, który zachowuje się odmiennie jest niezgodna. Z 3rd Edition ECMAScript Specification:

Gdy [[Delete]] Metoda O nazywa się nazwa właściwości P, następujące kroki są podejmowane:

  1. Jeśli wy nie posiada nieruchomość na imię P, zwraca wartość true.
  2. ..
+0

Chciałbym * naprawdę polubić * opinię na temat mojego twierdzenia, że ​​Type (xy) nie powoduje Typu Specyfikacji Referencyjnej; ponowne przeczytanie specyfikacji wydaje się sugerować, że będzie to 'IsUnresolvableReference' (??); w takim przypadku dlaczego FF/Chrome nie rzucają błędu składni podczas używania ścisłego? – user2246674

+0

Twoja odpowiedź była właściwa. "IsUnresolvableReference (V). Zwraca wartość true, jeśli wartość podstawowa jest niezdefiniowana, a false w przeciwnym wypadku." - "Wartość podstawowa" to "x" w twoim przykładzie, a nie "y". –

+0

@DaggNabbit Dzięki, tak właśnie myślałem, ale w końcu otrzymuję ReferenceErrors lub TypeErrors, a nie SyntaxError; '(function() {" use strict "; delete dne.y;})();' (ReferenceError), '(function() {" use strict "; var x = undefined; delete xy;})(); '(TypeError) – user2246674

9

Jeśli parametr exampleObject jest obiektem, zwracana wartość z usunięcia to true, nawet jeśli właściwość nie istnieje.

Powiązane problemy