Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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

競技プログラミングで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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
11
Help us understand the problem. What are the problem?