2012-10-30 9 views
28

Widziałem różne przykłady kodu z zadeklarowanymi zmiennymi i ustawionymi na undefined i null. Takich jak:Kiedy mam zainicjować zmienne w JavaScript z wartością null lub wcale?

var a; // undefined - unintentional value, object of type 'undefined' 
var b = null; // null - deliberate non-value, object of type 'object' 

Jeśli kod do tych deklaracji przypisuje wartość do lub B, co jest powodem korzystania jeden rodzaj deklaracji nad drugim?

Odpowiedz

22

Pierwszy przykład nie przypisuje niczego do zmiennej, więc niejawnie odnosi się do wartości undefined (szczegółowe informacje można znaleźć w sekcji 10.5 in the spec). Jest powszechnie używany podczas deklarowania zmiennych do późniejszego wykorzystania. Nie ma potrzeby wyraźnego przypisywania im niczego przed koniecznością.

Drugi przykład jest jawnie przypisany null (który jest faktycznie typu null, ale z powodu dziwactwa specyfikacji JavaScript, twierdzi, że ma typ "obiekt"). Jest powszechnie używany do czyszczenia wartości już zapisanej w istniejącej zmiennej. Mogło być postrzegane jako bardziej odporne na używanie null podczas usuwania wartości, ponieważ możliwe jest nadpisanie undefined iw takiej sytuacji przypisanie wartości undefined spowodowałoby nieoczekiwane zachowanie.

Tak na marginesie, to dziwactwo null to dobry powód, by użyć bardziej solidną formę sprawdzania typu:

Object.prototype.toString.call(null); // Returns "[object Null]" 
+0

Tylko uwaga ... myślę, że ' "[object null]"' 'wynik toString() 'może mieć niektóre niezgodności przeglądarki. –

6

Właśnie widziałem ten link, który sprecyzować moje pytanie. What reason is there to use null instead of undefined in JavaScript?

JavaScript dla programistów WWW stwierdza „Definiując zmienną, która jest oznaczało, aby później trzymać przedmiot, wskazane jest, aby zainicjować zmienną null w przeciwieństwie do niczego innego. W ten sposób można jednoznacznie sprawdzić dla wartości null, aby określić, czy zmienna została wypełniona odwołaniem do obiektu w późniejszym czasie. "

+3

+1 To brzmi jak dobra praktyka do naśladowania – techfoobar

0

null to obiekt .. Kiedy coś jest niezdefiniowane, to nic nie jest ... nie jest obiektem, ani łańcuchem, ponieważ nie zostało jeszcze zdefiniowane ... oczywiście ... to po prostu właściwość bez funkcja ..

przykład:

zadeklarować zmienną var ale nigdy go ustawić.

var foo; 
alert(foo); //undefined. 

Próbujesz uzyskać dostęp do właściwości obiektu, którego nigdy nie ustawiłeś.

var foo = {}; 
alert(foo.bar); //undefined 

Próbujesz uzyskać dostęp do argumentu, który nigdy nie został podany.

function myFunction (foo) { 
    alert(foo); //undefined. 
} 
10

Nie sądzę, że istnieje jakiś lepszy sposób robienia rzeczy, ale jestem skłonny unikać nieokreślonego jak najwięcej. Może to wynika z silnego tła OOP.

Kiedy próbuję naśladować OOP z Javascriptem, generalnie zadeklarowałbym i zainicjowałbym jawnie moje zmienne na wartość null (podobnie jak języki OOP, gdy zadeklarujesz zmienną instancji bez jawnego jej inicjowania). Jeśli nie mam zamiaru ich inicjować, to po co je zadeklarować? Podczas debugowania, jeśli nie ustawiłeś wartości dla obserwowanej zmiennej, zobaczysz ją jako niezdefiniowaną, niezależnie od tego, czy ją zadeklarowałeś, czy nie ...

wolę utrzymania undefined dla specyficznych zachowań:

  • podczas wywołania metody, każdy argument, że nie zapewniają musiałby nieokreślonej wartości. Dobry sposób na opcjonalny argument, implementujący określone zachowanie, jeśli argument nie jest zdefiniowany.
  • leniwy init ... w mojej książce niezdefiniowany oznacza "nie zainicjowany: idź pobrać wartość", a null oznacza "zainicjalizowany, ale wartość była zerowa (np. Być może był błąd serwera?)"
  • tablice: myArray [myKey] === null, jeśli dla tego klucza jest wartość pusta, niezdefiniowana, jeśli dla tego klucza nigdy nie została ustawiona wartość.

Uważaj jednak, że myVar == null i myVar == undefined zwrócić tę samą wartość, czy myVar jest niezdefiniowany, null lub coś innego. Użyj ===, jeśli chcesz się dowiedzieć, czy zmienna jest niezdefiniowana.

+0

Do ostatniej linii, należy zauważyć, że nic '===' (potrójne równe) 'null' poza samym' null' (ponieważ jest to "obiekt"). –

1

Chciałbym jednoznacznie wybrać null, aby nie mieć obiekt, którego id później zostały nadpisane i tak:

var foo = {}; // empty object, has id etc. 
var foo2 = null; // good practice, // filled with an object reference at a later time 
var foo3;// undefined, I would avoid it 
console.log(typeof foo); 
console.log(typeof foo2); 
console.log(typeof foo3); 

null zapewnia również dobrą czytelność, aby zidentyfikować typ danych (Object), wyników w

object 
object 
undefined 

Źródło (Professional JavaScript dla Web deweloperów 3rd Edition):

Definiując zmienną, która ma później pomieścić obiekt, zaleca się zainicjować zmienną na wartość null, w odróżnieniu od wszystkiego, co jest inne niż . W ten sposób można jednoznacznie sprawdzić wartość null do określić, czy zmienna została wypełniona odwołania do obiektu w późniejszym czasie, tak jak w poniższym przykładzie:

if (foo2 != null){ 
    //do something with foo2 
} 

Wartość niezdefiniowana jest pochodną null, więc ECMA-262 definiuje je powierzchownie być równa co następuje:

console.log(null == undefined); // prints true 
console.log(null === undefined);// prints false 
+0

Być może mógłbyś edytować odpowiedź i dodać linki i argumenty referencyjne. Upuszczenie tutaj "Dobra praktyka" to nic innego jak opinia. –

+1

Dodałem książkę referencyjną, także "tylko książka" nie jest normą – ItsmeJulian

Powiązane problemy