【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
コメント