SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【JavaScript】単項 + 演算子で数値にする

問題

文字列を数値にするには?(「”5″」を「5」にするなど)

plus

答え

「単項 + 演算子」が簡単。

見慣れないと奇妙だけど、一般に高速で、記述もコンパクト。

+"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

関連するメモ

コメント