私は次のようなものを作りました:
Number.prototype.foo = function () {
//code
}
// Octal number!
(013).foo();
しかし、これをfoo関数の内部で調べると、値として11が得られます...何が問題なのですか?
私は次のようなものを作りました:
Number.prototype.foo = function () {
//code
}
// Octal number!
(013).foo();
しかし、これをfoo関数の内部で調べると、値として11が得られます...何が問題なのですか?
何が起こると思っていましたか?
Javascript は、ゼロで始まるすべての整数を 8 進数 [*] として扱うため、実際の値013
は11
(10 進数) です。このNumber
クラスは値のみを扱い、最初に 8 進定数を渡したことがわかりません。
[*] 数字 8 または 9 を含む整数には例外があります。これらは 8 進数では正しくないため、パーサーは先行ゼロが存在する場合でもそれらを暗黙的に 10 進数として扱います。
8 進数は、数値として解釈されると 10 進数と変わりません。
013
とまったく同じ11
です。JavaScript は、それが数値であることを認識すると、それは単なる数値であり、「8 進数」または「10 進数」を記憶していません。
簡単に 8 進表現に戻すことができるので、これは実際には問題ではありません。
var dec = 11;
alert(dec.toString(8)); // returns "13"
数値は 10 進数形式で返されますが、その数値演算は私の知る限り違いはありません。また、JavaScript に提供されたすべての8 進数は、この方法で即座に「変換」されることにも注意してください。
alert(013); // returns 11