LoginSignup
11
11

More than 5 years have passed since last update.

あなたはJavaScriptで「'6000' - ('40' + '10') * '50'」の答えが分かります??

Last updated at Posted at 2015-12-10

競技プログラミングで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たのしいですね。

関数の作成は、また次回にしようと思います。

参考:

www.ajaxtower.jp

11
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11