Alternatywa dla mnóstwa typeof
odpowiedzi;
Zmienne globalne zadeklarowane za pomocą var varname = value;
instrukcji w zakresie globalnym
mogą być dostępne jako właściwości obiektu okna.
Jako taka hasOwnProperty()
metoda, która
zwraca wartość logiczną wskazującą, czy obiekt ma określoną właściwość jako swoją własność (w przeciwieństwie do dziedziczenia)
można użyć do ustalenia, czy
a var
nazwy „varname” zostało zadeklarowane globalnie, tj. jest własnością window
.
// Globally established, therefore, properties of window
var foo = "whatever", // string
bar = false, // bool
baz; // undefined
// window.qux does not exist
console.log( [
window.hasOwnProperty( "foo" ), // true
window.hasOwnProperty( "bar" ), // true
window.hasOwnProperty( "baz" ), // true
window.hasOwnProperty( "qux" ) // false
] );
Wspaniałe hasOwnProperty()
jest to, że nazywając go, nie używamy zmiennej, która może być jeszcze niezadeklarowana - co oczywiście stanowi połowę problemu.
Chociaż nie zawsze jest to idealne lub idealne rozwiązanie, w pewnych okolicznościach jest to po prostu praca!
Notatki
Powyższe jest prawdziwe w przypadku używania var
do definiowania zmiennej , w przeciwieństwie do let
:
deklaruje zmienną lokalną o zasięgu bloku, opcjonalnie inicjując ją do wartości.
różni się od var
słowa kluczowego, które definiuje zmienną globalnie lub lokalnie dla całej funkcji, niezależnie od zasięgu bloku.
Na najwyższym poziomie programów i funkcji, let
w przeciwieństwie do tego var
, nie tworzy właściwości na obiekcie globalnym.
Dla kompletności: const
stałe z definicji nie są w rzeczywistości zmienne (chociaż ich treść może być); bardziej odpowiednio:
Stałe globalne nie stają się właściwościami obiektu okna, w przeciwieństwie do var
zmiennych. Wymagany jest inicjator stałej; to znaczy, musisz podać jego wartość w tej samej instrukcji, w której jest zadeklarowana.
Wartość stałej nie może się zmienić poprzez zmianę przypisania i nie można jej ponownie zadeklarować.
Deklaracja const tworzy odwołanie do wartości tylko do odczytu. Nie oznacza to, że wartość, którą posiada, jest niezmienna, po prostu nie można przypisać identyfikatora zmiennej.
Ponieważ let
zmienne lub const
stałe nigdy nie są właściwościami żadnego obiektu, który odziedziczył hasOwnProperty()
metodę, nie można go użyć do sprawdzenia ich istnienia.
W odniesieniu do dostępności i wykorzystania hasOwnProperty()
:
Każdy obiekt pochodzący od Object dziedziczy hasOwnProperty()
metodę. [...] w przeciwieństwie do in
operatora, ta metoda nie sprawdza łańcucha prototypów obiektu.
foo
jest zadeklarowany, albotypeof foo === 'undefined'
albotypeof foo === typeof undefined