【JavaScript】単項 + 演算子で数値にする
問題
文字列を数値にするには?(「"5"」を「5」にするなど)

答え
「単項 + 演算子」が簡単。
見慣れないと奇妙だけど、一般に高速で、記述もコンパクト。
+"5" → 5
+"-123" → -123
+"abc" → NaN
+"12ab" → NaN
+"123 abc" → NaN
+"-123.456" → -123.456
+"" → 0
+true → 1
+false → 0
+undefined → NaN
+null → 0
+[] → 0 ([]→""と評価された後に+""しているので0になる)
+[8] → 8
+[8,9] → NaN
+{} → NaN
+{"valueOf":function(){return 123;}} → 123
+{"toString":function(){return "-987";}} → -987
もうちょっと詳しく
仕様は以下のとおり。
11.4.6 Unary + Operator (単項 + 演算子)
The unary + operator converts its operand to Number type.(単項+演算子は被演算子をNumber型にする)
The production UnaryExpression : + UnaryExpression is evaluated as follows:(次のように評価される)
- 1. Evaluate UnaryExpression.(UnaryExpression を評価。)
- 2. Call GetValue(Result(1)).(GetValue(Result(1)) を呼出す。)
- 3. Call ToNumber(Result(2)).(ToNumber(Result(2)) を呼出す。)
- 4. Return Result(3).(Result(3) を返す。)
上記の過程を経て、必ず数値型になるので、undefinedや{}などはNaNになる。
parseIntとは結果が違う。
valueOfやtoStringがあるとなぜ結果が変わるのかは、仕様のToNumberのあたりを追いかけていくと書いてある。
参考
Standard ECMA-262 5.1 Edition だけど 11.4.6 Unary + Operator