Perché 2 == [2] in JavaScript?


Answers

È a causa della conversione implicita del tipo di operatore == .

[2] è convertito in Numero è 2 se confrontato con un numero. Prova l'operatore unario + su [2].

> +[2]
2
Question

Recentemente ho scoperto che 2 == [2] in JavaScript. A quanto pare, questa stranezza ha un paio di conseguenze interessanti:

var a = [0, 1, 2, 3];
a[[2]] === a[2]; // this is true

Allo stesso modo, i seguenti lavori:

var a = { "abc" : 1 };
a[["abc"]] === a["abc"]; // this is also true

Ancora più strano, anche questo funziona:

[[[[[[[2]]]]]]] == 2; // this is true too! WTF?

Questi comportamenti sembrano coerenti su tutti i browser.

Qualche idea sul perché questa è una caratteristica del linguaggio?

Qui ci sono conseguenze più insane di questa "caratteristica":

[0] == false // true
if ([0]) { /* executes */ } // [0] is both true and false!

var a = [0];
a == a // true
a == !a // also true, WTF?

Questi esempi sono stati trovati da jimbojw http://jimbojw.com fama così come walkingeyerobot .




Per il caso == , questo è il motivo per cui Doug Crockford consiglia di utilizzare sempre === . Non esegue alcuna conversione implicita del tipo.

Per gli esempi con === , la conversione del tipo implicito viene eseguita prima che venga chiamato l'operatore di uguaglianza.




Una matrice di un oggetto può essere considerata come l'oggetto stesso.

Ciò è dovuto alla digitazione anatra. Poiché "2" == 2 == [2] e possibilmente di più.




Stai comparando 2 oggetti in ogni caso. Non usare ==, se stai pensando al confronto, stai pensando === e non ==. == può spesso dare effetti folle. Cerca le parti buone nella lingua :)