競技プログラミングで3分ほどハマった。検証が楽しくてさらに10分ほどハマった。
'6000' - ('40' + '10') * '50' の結果です。
パット見で分かりますか??? ' ' は文字列を表します。
ふつうに数値として計算したら、3500ですよね。
ところが答えは -194500です。これがJavaScriptの罠であり魅力です。
文字列と数値の変換
例えば、以下の算術はうまくいきます。
'60' - '10' => 50
'6' * '4' => 24
'100' / '4' => 25
マイナス、かける、割るという演算子は、数値の演算だからです。データ型が文字列でも、数値型へと自動変換してくれます。
プラス演算子
ところが、プラス演算子は別です。これは数値の演算以外にも、文字列の結合もします。
'10' + '5' => '105'
おっと!これはビックリですね。
どちらか片方が数値でも、文字列結合になります。
'10' + 5 => '105'
10 + '5' => '105'
両方が数値のとき初めて、数値加算が行われました。
10 + 5 => 15
冒頭の演算は、まず最初に文字列結合が行われていたんですね。。。
'6000' - ('40' + '10') * '50'
カッコ内がまず' 4010 'となっていたようです。
'6000' - '4010' * '50' => -194500
応用
では、以下はそれぞれどうなるでしょうか。
'hello' + 10 + 5
10 + 'hello' + 5
10 + 5 + 'hello'
結果はそれぞれ、'hello105', '10hello5', '15hello'となります。
+ 演算子は左から実行されるので、最後のケースのみ、数値どうしの加算が行われます。
逆に言うと、他の2つは10 + 'hello'の時点で文字列結合が行われ、その後の + 5も文字列結合となります。
このようにすると、数値演算が行われます。
'hello' + (10 + 5) => 'hello15'
最終的には文字列になってしまいますが。。。
対策
とは言え、'10' + '5' ならば数値同士の加算がしたいと分かります。
では、以下の場合はどうでしょうか。
a + b
a, bには何が入るかわかりません。ただ、何が来たとしても、まずは数値加算を優先したいとします。(プラス演算子は文字列を優遇します。きっと文系ですね)
そんな時、 自分で関数を書けば良いのです。JavaScriptたのしいですね。
関数の作成は、また次回にしようと思います。
次回:
参考: