2015-05-22 4 views
15

Warum ist es in JavaScript, dass die folgenden Ergebnisse in false:Warum in JavaScript tut 10 === 010 Ergebnis in falschen

10 === 000000010 (false) 

Aber dies führt zu wahr:

010 === 000000010 (true) 

In allen Fällen links und rechts sind beide 10, sie sollten alle ergeben, sollten sie nicht?

+2

'1 == 01 'und 01' '1 === beide wahr ist in meinem Browser (Chrom) – Phil

+1

I in der folgenden Konsole versucht, aber 1 == 01 (true) 1 === 01 (true) – andyf

+4

Sind Sie sicher, dass Sie nicht wirklich '10 == 010' probiert haben? – Barmar

Antwort

23

JavaScript Zahlen mit führenden 0 s durch eine der Ziffern sind octal (base 8) anstatt in dezimal (Basis 10) beginnt, gefolgt.

Sie können dies wie folgt in einem Beispiel sehen:

10 === 010 // false 
8 === 010 // true 

Beachten Sie, dass, wenn es eine 8 oder 9 Ziffer ist, es keine gültige Oktalzahl und wird somit als Dezimalzahl interpretiert werden:

89 === 089 // true 

Beachten Sie, dass oktal Literale funktionieren nicht im strikten Modus:

(function(){ "use strict"; return 010 === 10; })() 
// SyntaxError: Octal literals are not allowed in strict mode. 

Dies wird in Abschnitt B.1.1 of the JavaScript specification als nicht normatives Verhalten für die Kompatibilität mit älteren Versionen von ECMAScript beschrieben. Eine oktale Ganzzahlliteral ist wie folgt definiert:

OctalIntegerLiteral :: 
    0 OctalDigit 
    OctalIntegerLiteral OctalDigit 

OctalDigit :: one of 
    0 1 2 3 4 5 6 7 
+2

"Wenn es eine 8- oder 9-stellige Zahl gibt, wird sie ... als Dezimalzahl interpretiert." Javascript _ würde das tun, nicht wahr? – Random832

8

Ihr aktuelles Beispiel, das mit einer 0, die nur die Ziffern 0-7 enthält, vorangestellt wird, wird als octal interpretiert. Ein besseres Beispiel wäre

123 ==// nope 

sein, weil 0123 in der Basis 10 83 ist.


es zu bringen inline mit der aktualisierten Beispiel

parseInt(10, 10) // 10 
parseInt(000000010, 10) // 8 
parseInt(010, 10) // 8 
+1

Nur nitpicking, sollte der erste arg to parseInt eine Zeichenfolge sein, könnte es das Ergebnis beeinflussen. – K3N

+1

@ K3N Aus der Dokumentation ~ * "Der zu analysierende Wert. Wenn die Zeichenfolge keine Zeichenfolge ist, wird sie in eine Zeichenfolge konvertiert. Führende Leerzeichen in der Zeichenfolge werden ignoriert." *. Ich denke, es ist sicher und war vor allem OP einfach zu zeigen, was jeder Wert in Base ist – Phil

+2

@Phil versuchen, sicher zu laufen, es wirft sie, aber wenn Sie diese Zahlen als String zur Verfügung gestellt würde das Ergebnis anders sein (dh.'parseInt (" 000000010 ", 10) // = 10' einfach sayin – K3N

Verwandte Themen