2012-06-07 13 views
5

Ten mówi false, czyli "" jest liczbą:Co to jest "" w JavaScript naprawdę?

alert(isNaN("")); 

Ten mówi NaN, co oznacza, że ​​"" nie jest liczbą i nie mogą być zamienione:

alert(parseFloat("")); 

Spodziewałem drugi kod do przekonwertowania "" na 0 od "" jest numerem podczas testu w IsNaN, ale myliłem się! Czy szaleję, czy po prostu coś przeoczyłem?

+6

'" "' jest ciągiem znaków. –

+0

Hmm, co jest interesujące. "" będzie jednak pustym łańcuchem. Zasadniczo właśnie udowodniłeś, że NanaN nie używa tego samego kodu, który parseFloat robi –

+0

@isbadawi Dzięki, zredagowałem moje pytanie, dzięki czemu zrozumiesz, co naprawdę chcę osiągnąć. – dpp

Odpowiedz

3

parseFloat próbuje zanalizować numer z ciągiem gdzie jako isNaNconverts the argument to number przed sprawdzeniem go:

Number("") //0 http://ecma-international.org/ecma-262/5.1/#sec-9.3.1 
parseFloat("") //NaN http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.3 

Najwyraźniej jest „zepsuty” lub „dziwne”, więc od specyfikacji:

niezawodny sposób na kod ECMAScript w celu sprawdzenia, czy wartość X jest NaN to wyrażenie X! == X. Wynik będzie prawdziwy wtedy i tylko wtedy, gdy X jest NaN.

0 !== 0 // false 
NaN !== NaN //true 

function isExactlyNaN(x) { 
    return x !== x; 
} 
+0

Notatka boczna dla potwierdzenia zachowania: 'isNaN (" NaN ")' zwraca 'true'. – leppie

+2

@leppie Czyli 'isNaN (" pepperoni ")' :) – Paulpro

+0

@ PaulP.R.O .: Zdecydowanie IEEE 794; p – leppie

1

isNaN Konwertuje na typ Numer i sprawdza, czy wartość jest numerem specjalnym NaN.

Pusty łańcuch konwertowane na liczby jest 0 (+"" === 0), a ponieważ nie jest NaN0 widać false.

parseFloat jest jednak bardziej skomplikowany niż zwykła konwersja do typu liczbowego i zwraca NaN dla pustego ciągu (parseFloat("") === NaN).

0

JavaScript interpretuje pusty łańcuch jako 0, która nie testu isNaN. Jeśli parseFloat spróbuje przeanalizować liczbę w pustym ciągu, który zawodzi i zwraca wartość NaN ..

+0

Czy to JavaScript interpretuje go jako funkcję 0 lub isNaN? Coz czy to JavaScript, to dlaczego parseFloat nie uważa "" za 0? – dpp

1

Nie jest to NaN to nie to samo, co liczba. To oznacza, że ​​nie jesteś wyjątkową wartością NaN.

Albo wszystko, co można przekształcić na NaN według arcane zasad konwersji języka JS.

+0

Co oznacza "NaN"? Nie numer, prawda? Usunięcie "Nie-a" sprawia, że ​​jest to liczba: D przynajmniej w mojej percepcji. – dpp

+1

@dpp 'NaN' jest również liczbą:' typeof NaN === "number" ' – Paulpro

+0

' NaN' jest specjalną wartością liczbową. Być może lepiej byłoby myśleć o tym jako o "liczbie" reprezentującej wynik operacji takich jak 0/0 lub Infinity/Infinity " – Domenic

0

Aby zrozumieć zachowanie tego, ważne jest zrozumienie semantyki.

isNaN sprawdza, czy wartość nie może być zmuszanydo numeru, jeśli nazywając ją na wartość zwraca false, wówczas oznacza to, że Number(value) powróci prawidłowy numer.

parseFloatanalizuje numer z ciągiem, jeśli ciąg nie rozpocznie się z dowolną liczbą wówczas zwraca NaN, ponieważ został znaleziony żaden numer do analizowania.

Programiści mają tendencję do nadużywania parseInt i parseFloat dla przymusu, kiedy w większości przypadków powinni używać Number, co jest bardziej ścisłe i nie jest mylące.