データ型の自動変換
ご存知の通り、JavaScriptの文字列は 引用符で囲む必要があります。文字列のすべての 文字が数字である場合もあります:
let a = '123';
この場合、変数aも文字列ですが、
いくつかのニュアンスがあります。
そのニュアンスは次の通りです:数字の文字列に対して 何らかの数学演算を実行すると、その演算は 実際に数字であるかのように実行されます:
alert('2' * '3'); // 6 を出力
この場合、JavaScriptは、文字列に対しては 不正だが、数字に対しては正しい演算を 実行しようとしていることを認識します。
JavaScriptはまた、実際には文字列が 引用符で囲まれた数字であることも認識します。そのためJavaScriptは これらの文字列を自動的に数字に変換し、 対応する数学演算を実行します。
これは、文字列が数字のみで構成されている場合に機能します。
そこに少なくとも一文字でも文字が含まれている場合
- JavaScriptはその演算を不正と見なし、
結果を値NaNにします:
alert('2' * '3s'); // NaN を出力
さらに、自動変換は、 演算が数学的に正しくても、文字列に対して 許容されない場合にも発生します。
例えば、文字列は(数字と異なり)乗算、除算、減算ができません。 そのため、このようなすべての演算では 数字を含む文字列が自動的に数値に変換されます。
しかし、文字列は、数字と同様に、演算子+を使って
加算することができます。これは、
加算の場合、自動変換が行われないことを意味します:
let a = '1' + '2';
alert(a); // '12' を出力 - 文字列の結合が発生
一方の項が数字で、もう一方が 文字列の場合、常に文字列が優先されます:
let a = 1 + '2';
alert(a); // '12' を出力
このような場合、JavaScriptは逆に、数字を自動的に 文字列に変換し、文字列の結合を実行します。
ただし、項が2つ以上ある場合にはニュアンスがあります: この場合、特定の型への変換は演算の実行順序に依存します。
次の例では、最初に2と3が
数字として加算され、その結果が文字列'1'に
文字列'5'として加えられ、
最終的に文字列'15'となります:
let a = '1' + (2 + 3);
alert(a); // '15' を出力
括弧を外すと、すべてが左から右に加算されます。
つまり、最初に文字列'1'に
数字2が加えられ、結果として
文字列'12'が得られます。次に、この
文字列に数字3が加えられ、結果として
文字列'123'が得られます:
let a = '1' + 2 + 3;
alert(a); // '123' を出力
しかし、次の例では数字2と
3が先頭にあるため、最初に
数字として加算され、結果として
数字5が得られます。その後、この数字に
文字列'1'が加えられ、最終的に文字列'51'が得られます:
let a = 2 + 3 + '1';
alert(a); // '51' を出力
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5' + '2';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5' + 2;
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = 5 + '2';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = 5 + 2;
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5' * '2';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5' - '2';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5' / '2';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5' % '2';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5s' * '2';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5s' + '2';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = (-'5') + (-'2');
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5' * 1 + '2' * 1;
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '5' * '1' + '2' * '1';
alert(a);
コードを実行せずに、何が画面に 出力されるか決定してください:
let a = '' + 3 + 1;
alert(a);