JavaScriptové perličky: [] není []!
Nálepky:
Na serveru WTFJS upozornil @remi na jednu zajímavost ohledně vytváření neinicializovaných proměnných v JavaScriptu.
var a = new Number; a == 0 // true var a = new String; a == "" // true var a = new Object; a == {} // false var a = new Array; a == [] // false
Pokud implicitně nezadáme hodnotu pro číslo, je dosazena nula (0), pro řetězec prázdný řetězec („“). Poněkud matoucí to může být při použití zápisu JSON:
var a = {}; a == {} // false var a = []; a == [] // false
A bude platit toto:
var a = []
a == null // true?
var a = {}
a == null // true?
Ne.
Stačí si uvědomit, že [] je jenom zkrácený zápis pro new Array() a {} je zkrácený zápis pro new Object() a bude vše jasné.
To ale není o neinicializovaných proměnných – ve všech těch příkladech inicializované jsou. :) Je to o vnímání {} jako atomické hodnoty, namísto instance třídy. Jakmile by to bylo zapsáno ekvivalentním new Object() == new Object(), už by to každého trklo. Jinak bych nepovažoval za smrtelný hřích používat neinicializované proměnné – pokud daný jazyk, resp. implementace, jasně zaručuje, jaké jsou výchozí hodnoty pro každý typ.
Nič proti, ale čísla a reťazce sú v JS atomické hodnoty, pri porovnaní == sa porovnávajú ich hodnoty.
Oproti tomu objekt aj pole je inštanciou triedy objektu / pola, a teda sa pri použití == porovná rovnosť referencie na inštanciu. Nechápem, čo je na tom zarážajúce, takto by to predsa aj malo byť.
Pri každom použití [] alebo {} sa zo zjavných príčin vytvára nové pole / objekt.
Snáď ešte zmienim NaN == NaN – tiež false.