2012-01-19 33 views
5

Se eseguo il seguente frammento di Firebug console viene stampato in qualche modo surprise!:Javascript: strano comportamento confronto

['surprise!', 'boring'][Number(0=="​")] 

Ma perché?

UPD

Mi dispiace, la gente, che era uno scherzo! Jere è il primo a notare! Ieri ho trovato un ZERO WIDTH SPACE in una stringa, e aveva da allora la tentazione di divertirsi un po '=)

+0

Intendi "surprize!" destra? – Jere

+0

@micha, mente il '==', non il '===' – newtover

+0

No, il suo firebug riconosce gli errori e li risolve. – shift66

risposta

9

C'è un carattere extra, non visibile, tra le virgolette.

Se si digita questo fuori, si otterrà 'noioso', perché 0 == "" restituisce true, numero (vero) evalutes a 1.

incollare questi due e guardare l'output differenti:

0=="​" 

uscite falsi

0=="" 

uscite vero

L'unica cosa che ho modificato è l'eliminazione del carattere tra "".

+0

+1. Per un momento, ho pensato che la console fosse stata intercettata. Bello! – cheeken

+0

Che barare ... – Raynos

+1

Sì, Jere ha ragione. Copia e incolla la linea da qualche parte, quindi muovi con la freccia della tastiera e noterai un punto in più. Potrebbe essere uno spazio molto piccolo – welldan97

8

0=="​" è false (perché si ha un carattere non stampabile nella stringa), Number(false) è 0 (come da page 34 of the spec) e "sorpresa" è il 0 ° indice dell'array.

+0

Ti meriti più voti amico mio – Joe

4

ES5 11.9.3 The == operator

Se Type (x) è il numero e tipo (y) è String, restituire il risultato del confronto x == ToNumber (y).

e

La MV di StringNumericLiteral ::: [vuoto] è 0.

Così 0=="" rendimenti 0 == ToNumber("") che è 0 == 0 che è vero.

Con le regole di conversione ==0=="" è true

ES5 15.7.1.1 Number (value) invoca ES5 9.3 toNumbertoNumber(true) === 1

E ["suprize!", "boring"][1] rendimenti "boring" che è chiaramente errata.

Perché è corretto?Perché

"​".charCodeAt(0) === 8203

tuo stringa letterale non è la stringa vuota. Hai un zero width space nella tua stringa.

Ora, se torniamo a ES5 11.9.3 == operator vediamo

Se la grammatica non può interpretare la stringa come un ampliamento della StringNumericLiteral

Il che significa

  • 0==""
  • 0==NaN
  • false
  • toNumber(false) === 0
  • Number(0=="") === 0
  • ["suprize!", "boring"][0] === "suprize!"
1

['surprise!', 'boring'][Number(0=="​")] tornerà 'noioso' siccome il codice:

Number(0=="​") //returns true 

Ma il codice è spettacolo diverso, si ha un carattere invisibile il tuo testo, ecco perché restituisce false.

Se si scrive correttamente il codice, verrà restituito true e il risultato sarà boring come previsto.

Ma se copia ed incolla il codice, torneranno falsa, che è il motivo per cui si dispone di un carattere tra "" (è possibile controllare tramite tastiera o "" .length)

modo che il codice restituirà FALSE , che sarà 0 quindi restituire 'sorpresa!' uomo

Stai imbrogliando: P

['surprise!', 'boring'][Number(0=="​")] 

"​".length //returns 1 ;) 

"​" != "" // OH GOD THIS IS TRUE :P 
0

ottengo noioso quando correva questo in console console.log ([ '! surpeise', 'noioso'] [Numero (0 == "")])