2013-06-14 29 views
5

Programowałem JavaScript na chwilę i nadal nie jestem całkiem pewien, czy jestem zbyt leniwy, czy nie. mam dużo:Jak upewnić się, że zmienna jest obiektem?

if(typeof(something) === 'undefined'){ 
    // .. 
} 

Jednak czasami to po prostu staje się zbyt rozwlekły. Na przykład, teraz robię:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success') || {}; 

To dlatego, że w kolejnych liniach leczenia redirectURLs ja jako obiekt, choć nie może być określona na wszystkich (funkcja może również zwrócić undefined).

Czy istnieje cheats "najlepsza praktyka"? Czy to, co napisałem powyżej, jest zbyt leniwe? To tylko, że alternatywą jest uciążliwy:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success'); 
if(typeof(redirectURLs) === 'undefined'){ 
    redirectURLs = {} 
} 

Zdaję sobie sprawę, że skrót jest mniej wytrzymałe, ale potem znowu, ludzie będą musieli ustawić tę wartość, czy nie.

Pomysły?

Merc.

+1

staram się dodać 'NS.isDefined (test_var [default_if_not_defined])' funkcja pomocnika –

Odpowiedz

0

Kiedy używasz "skrót", który jest równoważna następującej:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success'); 
if (!redirectURLs) redirectURLs = {}; 

Specyfikacja (ECMA-262) stwierdza, że ​​logiczne lub operator (||) sprawdza czy pierwsze wyrażenie (w tym przypadku wywołanie funkcji) wymusza na true lub nie - jeśli wymusza na true, zwraca pierwsze wyrażenie, w przeciwnym razie zwraca drugie.

Stwierdza również, co wymusza na true i false (§9.2 - pamiętać, że nie jest to podane verbatim):

fałsz:

  • Numery +0, -0, i NaN
  • pusty ciąg ("")
  • false
  • null
  • undefined

Prawda: wszystko inne (w tym rzeczy jak new Boolean(false))

Tak więc, jeśli nie przeszkadza pozwalając większość numerów, sznurki lub wartość true poprzez, wtedy logiczny OR "skrót" byłby OK. Należy pamiętać, że „gadatliwy” kod może pęknąć redirectURLs jest zerowy:

var redirectURLs = null; 
if (typeof redirectURLs === 'undefined') { 
    redirectURLs = {}; 
} 
redirectURLs.test = '1'; // TypeError: Cannot set property 'test' of null 
0

Jeśli zawsze chcesz zajmować się obiektami z zewnętrznego interfejsu API (zakładam, że nie masz kontroli nad biblioteką hotplate), możesz po prostu zawinąć każde wywołanie funkcji do rzutowania na obiekt.

function getHotplateUri(uri){ 
    // Probably good to validate the URI format 
    var redirectURLs = hotplate.get(uri); 
    if(typeof(redirectURLs) === 'undefined'){ 
     redirectURLs = {} 
    } 
    return redirectURLs 
} 
+0

Owijka sugestia jest ok, ale poza tym Nie zgadzam się z tym kodem, jest bardzo śmierdzący. Dlaczego miałbyś sugerować walidację 'uri'? Dlaczego "hotplate" nie jest zależnością? – Halcyon

+0

Dlaczego warto zweryfikować identyfikator URI: aby szybko zawieść dla wszystkich użytkowników opakowania. Dlaczego gorąca płytka nie jest zależnością: zgodzili się, tak powinno być. – Sparko

0

Z typeof, która jest operatorem (nie ma potrzeby nawiasach) Sprawdź na istnienia zmiennej. Operator zwarcia || zakłada, że ​​zmienna już istnieje (została zadeklarowana) i sprawdza, czy jego wartość jest falsy (niezdefiniowana, pusta, pusta, zero ...).

W związku z tym, w twoim przypadku użycie numeru typeof jest zbędne, ponieważ testujesz zwróconą wartość metody obiektu hotplate, która już istnieje. Jak powiedział:

... funkcja może również zwrócić undefined

"undefined" jest typem, podczas undefined jest predefiniowaną wartość (typu "undefined"). Zostaje przypisana do zmiennych, gdy są one podnoszone do momentu przypisania. Jeśli nie ma przyporządkowania, zmienna jest zadeklarowana, ale ma wartość undefined. Również funkcje zwracające nic nie zwracają undefined.

Więc typeof undefined === 'undefined' // true

+0

Więc kod skrótu jest w rzeczywistości 100% OK ... – Merc

+0

W twoim przypadku powiedziałbym tak. – elclanrs

+0

Czy istnieje przyjemny "akceptowany" dokument, który wyjaśnia, kiedy można użyć skrótu, dlaczego itd.? – Merc

Powiązane problemy