web-dev-qa-db-ja.com

番号の先頭にJavascript0

数字の先頭に0が付いたjsロジックを理解したいだけです。例えば

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

誰かが、それがどのように機能するのか、なぜ最初の例では機能し、先行ゼロを無視するのかを説明できますか?

ありがとうございました

15
Gor

数値リテラルの先頭の0は、8進整数が意図であることを示します。ただしsecond桁は8または9です。その場合、先頭の0は無視されます。

8進数のリテラルは整数でなければならないため、02.5は誤りです。

この動作は2014年にFirefoxのバグとして記録されましたが、世界中に非常に多くのJavaScriptコードがあり、その多くが(おそらく不注意で)構文エラーではない09.3に依存しているため、バグは「WONTFIX」とマークされました。 "。

以下のコメントで指摘されているように、「厳密な」モードでは、8進定数は完全に許可されていません。

24
Pointy

先頭のゼロは、8進数(基数8)の数値を示します(10進数の基数10の数値ではありません)。

先頭の0xは16進数を示し、先頭の0bは2進数を示します。

したがって、数字「9」は8進表記で存在しないため、09.3はデフォルトで10進数になります。

編集(クレジットEvan Trimboli、以下):8進リテラルは整数でなければならないため、02.5は例外をスローします。

5
andydavies

この答えには遅れていますが、それでも私の側からの更新です。厳密モードでPointyが言ったように、8進定数は許可されていません。

'use strict'
if(022 == 22){
  console.log("True");
}
console.log("Failed")

例外をスローします

{
  "message": "Uncaught SyntaxError: Octal literals are not allowed in strict mode.",
  "filename": "https://stacksnippets.net/js",
  "lineno": 14,
  "colno": 4
}

2桁目を8または9として追加しても、先頭の0strict modeでは許可されません。

'use strict'
if(029 == 29){
  console.log("True");
}
console.log("Failed")

また、例外をスローします

{
  "message": "Uncaught SyntaxError: Decimals with leading zeros are not allowed in strict mode.",
  "filename": "https://stacksnippets.net/js",
  "lineno": 14,
  "colno": 4
}

また、先行ゼロは先行ゼロなしで同じ値であるため、意味がありませんでした。ただし、反対側から値を受け取る場合は注意が必要です。

0
Lokesh