まくまくJavaScriptノート
文字列と数値を変換する
2017-03-20

演算による数値と文字列の暗黙変換

JavaScript では文字列と数値の四則演算を行うと、暗黙的な型の変換が行われるようになっているため、通常は数値が必要な場所で文字列をそのまま使うことができます。 演算を行う場合は、基本的に数値に変換されて計算されるのですが、例外的に + 演算子だけは常に文字列同士の結合として扱われます。

文字列 ‘100’ と数値の演算

console.log('100' + 7);  //=> '1007' (string) ★ここだけ文字列結合
console.log('100' - 7);  //=> 93 (number)
console.log('100' * 7);  //=> 700 (number)
console.log('100' / 7);  //=> 14.285714285714286 (number)
console.log('100' % 7);  //=> 2 (number)

数値とみなせない文字列と数値を四則演算した場合は、NaN となります。 ただし、この場合も + 演算だけは文字列結合になります。

数値と数値とみなせない文字列 ‘30a’ の演算

console.log(50 + '30a');  //=> '5030a' (string) ★ここだけ文字列結合
console.log(50 - '30a');  //=> NaN (number)
console.log(50 * '30a');  //=> NaN (number)
console.log(50 / '30a');  //=> NaN (number)
console.log(50 % '30a');  //=> NaN (number)
あまり意識する必要はありませんが、NaN の型も number です(typeof(NaN) === 'number')。

文字列を数値に変換する

Number 関数を使用すると、明示的に文字列を数値に変換することができます。

var s = '123';
var n = Number(s);
console.log(typeof n);  //=> number

Number 関数は、数値とみなせない文字列が渡されると NaN を返します。 NaN は偽値として扱われるので、数値に変換できない場合に 0 をデフォルト値として使用するようにするには、下記のように || 演算子を利用できます。

var s = 'foo';
var n = Number(s) || 0;  // 数値に変換できない場合はデフォルト値の 0 とする

ただし、上記のような || を使用したショートカット記法は、デフォルト値として 0 を使用するケースでしか使用できません。 例えば、下記のようなコードは意図とは異なる動きをします。

間違った書き方

var n = Number(s) || -1;  // 数値に変換できない場合はデフォルト値の -1 とする

このように記述してしまうと、変換前の文字列が '0' だった場合にも、-1 に変換されてしまいます(正しくは 0 となって欲しい)。 このような誤変換を防ぐには、下記のように明示的に isNan 関数を使用してチェックを行うようにします。

var s = 'foo';
var n = Number(s);
if (isNaN(n)) {
    n = -1;  // 数値に変換できない場合のデフォルト値
}

数値を文字列に変換する

String 関数を使用すると、明示的に数値を文字列に変換することができます。

var n = 123;
var s = String(n);
console.log(typeof s);  //=> string

数値と文字列の + 演算結果が文字列になることを利用して、次のように記述することもできます。

var n = 123;
var s = n + '';

Number オブジェクトの toString メソッドを使用して文字列に変換することもできます。 toString 特有の機能として、基数を指定して文字列に変換する機能があります。

console.log((255).toString());    //=> '255'(10進数表記)
console.log((255).toString(2));   //=> '11111111'(2進数表記)
console.log((255).toString(8));   //=> '377'(8進数表記)
console.log((255).toString(10));  //=> '255'(10進数表記)※パラメータなしと同じ
console.log((255).toString(16));  //=> 'ff'(16進数表記)

ちなみに、toString の基数は 2~36 の範囲で指定することができます。 つまり、0~9、a~z の 36 文字を使った 36 進数にまで対応しています。

2017-03-20