➕
JavaScriptの'1'+2の挙動をECMAScriptから読み解く
はじめに
JavaScriptの文字列と数字を結合すると文字列になりますが、今回はこれをECMAScriptから簡単に読み解いていきます。
簡易実験
まずはnodeで加算の動きを確認してみます。
> '1' + 2 // "12"(どちらかが String → 連結)
'12'
> 1 + '2' // "12"
'12'
> '1' + 2n // "12"(BigInt も ToString される)
'12'
> 1n + '2' // "12"
'12'
> 1n + 2 // TypeError(数値演算に進み、型混在で例外)
Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
> 'a' + Symbol() // TypeError(ToString(Symbol) が例外)
Uncaught TypeError: Cannot convert a Symbol value to a string
> new Date() + 1 // 文字列連結されやすい(Date は string ヒント扱い)
'Sat Nov 08 2025 19:29:21 GMT+0900 (日本標準時)1'
ECMAScriptから確認
加算について、ECMAScriptからどういう仕様になっているのかを簡単に確認します。
確認したURLは下記です。
の「If lPrim ...」の部分は「どちらかのオペランドが文字列型である場合」と訳すことができ、文字列かつ演算子の「+」が登場した際にはこの条件に当てはまります。
そこから「lStr と rStr の文字列連結を返す。」という条件に当てはまり、結果として文字列を返す挙動になります。
V8(Google/Chrome・Node.js)から確認
簡単に図示
今回確認した場所のフロー図です。
簡単な調査(参考)
バイトコードでADD命令が入ると考え、下記に辿り着きました。
呼ばれている関数は下記です。
また、下記が呼ばれています。
Builtinsは下記に定義があります。
連結自体は下記です。
まとめ
今回は、JavaScriptの加算を少し深掘りしてみました。
学習の補助になると幸いです。
参考
- ECMAScript
- V8 JavaScript Engine
Discussion