Reputation: 2908
I just want to understand js logic with 0-s in beginning of number. For example
var x = 09.3
// here x == 9.3
// other example
09.3 == 9.3
// returns true
// but check this one
var x = 02.5
// Uncaught SyntaxError: Unexpected number
// or this one
02.5 == 2.5
// same error here
Can anyone explain, how it works, why in first example it works, and ignores leading zeros, but in second example it gives me a SyntaxError
Thank you
Upvotes: 26
Views: 22212
Reputation: 1789
It's late for this answer but still an update from my side. As said by Pointy in strict mode octal constant are not allowed.
'use strict'
if(022 == 22){
console.log("True");
}
console.log("Failed")
throws an exception
{
"message": "Uncaught SyntaxError: Octal literals are not allowed in strict mode.",
"filename": "https://stacksnippets.net/js",
"lineno": 14,
"colno": 4
}
Even if we add the second digit as 8
or 9
still the leading 0
are not allowed in strict mode
'use strict'
if(029 == 29){
console.log("True");
}
console.log("Failed")
It also throws an exception
{
"message": "Uncaught SyntaxError: Decimals with leading zeros are not allowed in strict mode.",
"filename": "https://stacksnippets.net/js",
"lineno": 14,
"colno": 4
}
Also it didn't make any sense because the leading zeros are the same values without leading zeros. But it needs to be take care when receiving the values from other side.
Upvotes: 0
Reputation: 413702
Leading 0
on a numerical literal indicates that an octal integer is the intention, unless the second digit is 8
or 9
. In that case, the leading 0
is ignored.
Because octal numeric literals must be integers, 02.5
is erroneous.
This behavior was logged as a bug in Firefox in 2014, but because there's so much JavaScript code in the world and so much of it (probably inadvertently) relies on 09.3
not being a syntax error, the bug was marked "WONTFIX".
As pointed out in a comment below, in "strict" mode octal constants are disallowed entirely.
Upvotes: 36
Reputation: 3293
A leading zero indicates an octal (base 8) number (as opposed to a decimal - base 10 - number).
A leading 0x indicates a hexadecimal number, and a leading 0b a binary number.
Therefore 09.3 defaults to decimal because the digit '9' doesn't exist in octal notation.
Edit (credit Evan Trimboli, below): 02.5 throws an exception because octal literals must be integers.
Upvotes: 6