2012-01-19 17 views
5

Gdybym wykonać następujący fragment w Firebug pocieszyć jakoś drukuje surprise!:Javascript: porównanie dziwne zachowanie

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

Ale dlaczego?

UPD

przykro mi, ludzie, to był żart! Jere jest pierwszym, który zauważył! Wczoraj znalazłem ZERO WIDTH SPACE na sznurku, i miał od ówczesnego pokuszenie mieć trochę zabawy =)

+0

Masz na myśli "surprize!" dobrze? – Jere

+0

@micha, pamiętaj, że '==', nie '===' – newtover

+0

Nie, jego firebug rozpoznaje błędy i naprawia je. – shift66

Odpowiedz

9

Istnieje dodatkowa, niewidoczna, postać między , twoje kwotowania.

Jeśli tego typu out, dostaniesz 'nudny', ponieważ == "0" wartość true, numer (true) evalutes do 1.

Wklej te dwa i oglądać różną moc:

0=="​" 

wyjścia fałszywe

0=="" 

wyjścia prawda

Jedyne co zmieniłem to usunięcie znaku między "".

+0

+1. Przez chwilę myślałem, że konsola jest podsłuchiwana. Miły! – cheeken

+0

Co za oszukiwanie ... – Raynos

+1

Tak, Jere ma rację. Skopiuj i wklej linię gdzieś, a następnie poruszaj strzałką klawiatury, a zauważysz jeden dodatkowy przystanek. To może być bardzo mała przestrzeń. – welldan97

8

0=="​" jest false (Bo mają charakter non-poligraficznych w ciąg), Number(false) jest 0 (zgodnie page 34 of the spec), a "niespodzianka" to 0. indeks tablicy.

+0

Zasługujesz na więcej głosów mój przyjaciel – Joe

4

ES5 11.9.3 The == operator

Jeśli Type (x) jest liczba i typ (y) jest String, zwróci wynik porównania x == ToNumber (Y).

i

MV od StringNumericLiteral ::: [pusty] jest 0.

So 0=="" powraca 0 == ToNumber("") co jest 0 == 0 co jest prawdą.

według zasad konwersji ==0=="" jest true

ES5 15.7.1.1 Number (value) wywołuje ES5 9.3 toNumbertoNumber(true) === 1

And ["suprize!", "boring"][1] powraca "boring" co jest oczywiście błędna.

Dlaczego jest poprawny?Ponieważ

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

ciąg dosłowny nie jest pusty. Masz zero width space w swoim ciągu.

Teraz, jeśli wrócimy do ES5 11.9.3 == operator widzimy

Jeśli gramatyka nie może zinterpretować String jako rozszerzenie StringNumericLiteral

środki, które

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

['surprise!', 'boring'][Number(0=="​")] powróci 'nudne' poniewaz kodzie:

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

Ale kod jest zmierzających masz niewidzialny char w Twój tekst, dlatego powraca false.

Jeśli poprawnie napiszesz kod, zwróci on wartość true, a wynik będzie zgodny z oczekiwaniami boring.

Ale jeśli skopiować i wkleić kod, zwróci false, to dlaczego masz char pomiędzy „” (można sprawdzić za pomocą klawiatury lub „” .length)

więc kod zwróci false , to będzie 0, a następnie wróć "niespodzianka!"

Jesteś oszukiwanie człowiek: P

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

"​".length //returns 1 ;) 

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

mi się znudzić, gdy prowadził ten w konsoli console.log ([ '! Surpeise', 'nudne'] [Number (0 == "")])