Gor
Gor

Reputation: 2908

Javascript 0 in beginning of number

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

Answers (3)

Lokesh Pandey
Lokesh Pandey

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

Pointy
Pointy

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

andydavies
andydavies

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

Related Questions