2015-05-22 11 views
15

Perché è in JavaScript che i seguenti risultati in falso:Perché in JavaScript fa 10 === 010 risultato falso

10 === 000000010 (false) 

Ma questo implica che vero:

010 === 000000010 (true) 

In tutti i casi la sinistra e la destra sono entrambe le 10, dovrebbero essere tutte vere o no?

+2

'1 == 01' e' 1 === 01' sono entrambi vero nel mio browser (Chrome) – Phil

+1

Ho provato a console firefox, ma 1 == 01 (vero) 1 === 01 (vero) – andyf

+4

Sei sicuro di non aver effettivamente provato '10 == 010'? – Barmar

risposta

23

numeri che iniziano con JavaScript leader 0 s seguita da una delle cifre sono octal (base 8) piuttosto che in decimale (base 10).

Si può vedere questo in un esempio come questo:

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

Nota che se c'è un 8 o 9 cifre, non è un numero ottale valida e, quindi, sarà interpretato come un numero decimale:

89 === 089 // true 

Nota che letterali ottale non funzionano in modalità rigorosa:

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

Questo è descritto nella sezione B.1.1 of the JavaScript specification come comportamento non normativo per la compatibilità con le versioni precedenti di ECMAScript. Un numero intero ottale letterale è definito come segue:

OctalIntegerLiteral :: 
    0 OctalDigit 
    OctalIntegerLiteral OctalDigit 

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

"se c'è un 8 o 9 cifre, sarà ... interpretato come un numero decimale" Javascript dovrebbe farlo, non lo farebbe. – Random832

8

Il tuo esempio corrente in sospeso, numeri con prefisso 0 che contengono solo le cifre 0-7 vengono interpretati come octal. Un esempio migliore sarebbe

123 ==// nope 

perché 0123 in base 10 è 83.


Per portarlo in linea con il vostro esempio aggiornato

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

Basta snellire, il primo argomento di parseInt dovrebbe essere una stringa, potrebbe influenzare il risultato. – K3N

+1

@ K3N Da docs ~ * "Il valore da analizzare Se la stringa non è una stringa, viene convertita in una. Gli spazi bianchi iniziali nella stringa vengono ignorati." *. Penso che sia sicuro ed è stato principalmente solo per mostrare OP quello che ogni valore è in base10 – Phil

+2

@Phil prova a correre sicuro, li lancia, ma se hai fornito quei numeri come stringa il risultato sarebbe diverso (es.'parseInt (" 000000010 ", 10) // = 10' solo sayin – K3N

Problemi correlati