2013-06-27 16 views
8

coffeescript okazuje user?.id doJak stworzyć egzystencjalnego operatora stylu w języku JavaScript w JavaScript?

if (typeof user !== "undefined" && user !== null) { 
    user.id; 
} 

Czy to możliwe, aby utworzyć funkcję JavaScript exists że zrobi coś podobnego? tj

exists(user).id 

spowodowałoby albo user.id lub null

Byłoby łatwiej, gdyby funkcja przyjmuje inny parametr, tj exists(user, 'id'), ale to nie będzie wyglądać tak miły.

+0

Na ten musiałby pobierające ogólnego zastosowania ('definegetter (o, function (własności) {...})', które są, jeśli dobrze pamiętam correclty, nie jest częścią specyfikacji jest obsługa JavaScript. – Zeta

+0

@Zeta Nie tak naprawdę, ponieważ dostęp do nieistniejącej własności obiektu zwraca 'undefined' zamiast niepowodzenia, co powinno być wystarczająco dobre – millimoose

+3

Najbliższe, o których mogę myśleć to:' function exists (obj) {if (obj) return obj; return {}; } ', ale to nie poradzi sobie z niezdefiniowanymi zmiennymi, JavaScript nie jest w ten sposób rozszerzalny syntaktycznie – millimoose

Odpowiedz

5

Nie, nie można wykonać takiej funkcji. Problemem jest to, że:

any_function(undeclared_variable) 

będzie produkować ReferenceError jeśli undeclared_variable nie został ogłoszony w dowolnym miejscu. Na przykład, jeśli uruchomić ten sam kod stoiska:

function f() { } 
f(pancakes); 

dostaniesz się ReferenceError ponieważ pancakes nie został ogłoszony w dowolnym miejscu. Demo: http://jsfiddle.net/ambiguous/wSZaL/

Jednak typeof operator można wykorzystać na coś, co nie została zadeklarowana więc:

console.log(typeof pancakes); 

po prostu zalogować się undefined w konsoli. Demo: http://jsfiddle.net/ambiguous/et2Nv/

Jeśli nie przeszkadza możliwe ReferenceErrors wtedy masz już niezbędną funkcję w swoim pytaniu:

function exists(obj, key) { 
    if (typeof obj !== "undefined" && obj !== null) 
     return obj[key]; 
    return null; // Maybe you'd want undefined instead 
} 

lub, ponieważ nie ma potrzeby, aby móc korzystać z typeof zmiennych niezadeklarowanych tutaj można uprościć do:

function exists(obj, key) { 
    if(obj != null) 
     return obj[key]; 
    return null; 
} 

Uwaga zmiana do !=, undefined == null jest prawdą mimo undefined === null nie jest.

3

Bardzo stare pytanie, ale zmusiło mnie do myślenia o tym rozwiązaniu.

exists = (obj) => obj || {} 
exists(nullableObject).propName; 
Powiązane problemy