2016-08-25 15 views
10

Są więc pytania na temat S.O. które odpowiadają, jak sprawdzić, czy istnieje właściwość obiektu. Example Odpowiedz to użycie Object.prototype.hasOwnProperty().Jak sprawdzić, czy właściwość istnieje w potencjalnie niezdefiniowanym obiekcie?

Jak jednak sprawdzić właściwość potencjalnie niezdefiniowanego obiektu?

Jeśli ktoś próbowałby bezpośrednio sprawdzić, czy dana właściwość istnieje na niezdefiniowanym obiekcie, byłby to błąd odniesienia.

Wydaje się, że lepiej jest sprawdzić kod bezpośrednio if (obj.prop) //dosomething - pokazuje wyraźniejsze intencje. Czy jest jakiś sposób, aby to osiągnąć? Korzystnie jest tam wbudowana metoda JavaScript do zrobienia czegoś takiego lub konwencji?

Motive: Pakiet dodaje właściwość user.session.email - ale mam sprawdzić, czy e-mail nie istnieje, a nie w sesji, choć sesja może być nieistniejący.

Aktualizacja: Wiele odpowiedzi powiedzieć użyć operatora & & do zwarcia. Jestem świadomy, że jest to możliwe rozwiązanie, ale nie jest to dokładnie to, co jest pożądane, ponieważ wygląda na to, że pracujemy nad składnią obiektu JS ARO - to znaczy, chociaż chcemy naprawdę sprawdzić właściwość obiektu, jesteś zmuszony sprawdzić, czy obiekt istnieje, aby to zrobić.

Uwaga na oznaczenie jako zamknięte Dlaczego to oznaczono jako zamknięte? Link, który zakłada, że ​​jest to duplikat, może nie dać takich samych odpowiedzi. Szukamy lepszego, bardziej semantycznego rozwiązania i oznaczenia tych zamkniętych założeń "zagnieżdżonych" === "potencjalnie niezdefiniowanych"?

+3

Nie byłby to błąd składniowy, byłby to ReferenceError. Możesz sprawdzić "obj && obj.prop". – Xufox

+2

Czy zmienna 'obj' z pewnością będzie istnieć, ale może mieć wartość' undefined'? Nawiasem mówiąc, testowanie 'if (obj.prop)' nie sprawdza czy właściwość istnieje, testuje czy właściwość istnieje * i * ma wartość truey. – nnnnnn

+0

Ah - poprawiony opis pytania, ale pytanie pozostaje nadal ważne, ponieważ zasadniczo sprawdzasz, czy istnieje zarówno obiekt, jak i własność, gdy próbuję tylko naprawdę sprawdzić, czy właściwość istnieje. – steviejay

Odpowiedz

9

Jeżeli jesteś pewien, że istnieje obiekt nadrzędny, a następnie:

if(obj && obj.key) { 
    console.log(obj.key); 
} 

Jednak ten przykład nie zdało egzaminu, jeśli obj nie istnieje.

if (obj && obj.key) { 
 
    console.log(obj.key); 
 
}

... dlatego warto sprawdzić, jeśli obiekt jest zdefiniowany podczas sprawdzania nieruchomości. Gwarantuje to, że nie otrzymasz błędów środowiska wykonawczego, jeśli zostanie spełniony warunek, a obiekt właściwości nie został ustawiony.

if(typeof obj != "undefined" && obj.key) { 
 
    console.log('you will not see this logged') 
 
}

Zauważysz, że powyższy przykład nie wyjątek.

var obj = {key: 1}; 
 

 
if(typeof obj != "undefined" && obj.key) { 
 
    console.log('we have obj! and val is : ' + obj.key) 
 
}

Jest to znacznie bardziej defensywne podejście, ale pozwala na przenoszenie. Jeśli chcesz wyodrębnić logikę do modułu w celu ponownego użycia, możesz sprawdzić, czy obiekt istnieje, lub ryzykować niechciane błędy z obszaru aplikacji, które niekoniecznie muszą Cię zainteresować.

+0

Jeśli nie ma wyraźniejszych sposobów na sprawdzenie nieruchomości, przyjmuję to jako odpowiedź (tak jak zostały przesłane przez inne osoby). – steviejay

+2

Zauważ, że 'typof obj!= "undefined" 'da błąd odniesienia, jeśli zdefiniowano' obj' za pomocą 'let' lub' const' w punkcie po sprawdzeniu 'typeof'. – nnnnnn

+4

Zauważ, że 'var a = {a: false, b: 0, c: null}' przerywa te testy, ponieważ 'aa' i' ab' oraz 'ac' wszystkie oceniają jako niepoprawne, więc' if (a && aa) {...} 'nie myśli, że jest zdefiniowany, ale tak jest. – artfulrobot

5

jeśli chcesz sprawdzić zarówno obj i prop istnieje (tak jak wspomniano w komentarzach) trzeba zrobić:

if(obj && obj.hasOwnProperty('some')) lub if(obj && obj.some)

Jak wspomniano w komentarzach będzie to wyrzucić błąd, jeśli obj jest niezdefiniowany . Lepsze porównanie byłoby byłoby:

if(typeof obj != "undefined" && obj.hasOwnProperty('some')) 
+0

Spowoduje to zgłoszenie wyjątku, jeśli obiekt nie zostanie zdefiniowany – user1167442

0

Można zrobić coś takiego:

if(user.session && 'email' in user.session) //do something... 

w przypadku masz pewność, że użytkownik jest zdefiniowany.