JavaScript

javascriptの後置インクリメントが「加算する前の値」を返さない件

 先日、
 
非推奨だった bool 型に対するインクリメント演算子を削除 - cpprefjp C++日本語リファレンス
 
 という記事を読みまして、そこで紹介されていたバッドコードをなんとなくjavascriptで試してみました。

b = false;
function f(b){
  return b;
}
f(b++);

 そしたら0が返ってきまして。
 MDNに

オペランドの後に演算子を置く(例:x++)後置記法で使った場合、加算する前の値を返します。
算術演算子 - JavaScript | MDN

 とあったもんですから、えー、型キャストしちゃうのなんで? と思ってES6の解説を見ましたら、

  1. Let lhs be the result of evaluating LeftHandSideExpression.
  2. Let oldValue be ToNumber(GetValue(lhs)).
  3. ReturnIfAbrupt(oldValue).
  4. Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.7.5).
  5. Let status be PutValue(lhs, newValue).
  6. ReturnIfAbrupt(status).
  7. Return oldValue.

ECMAScript 2015 Language Specification – ECMA-262 6th Edition

 とのこと。「数値型に返還したものをoldValueに入れ、oldValueに1足したものをnewValueに入れて、oldValueを返し、newValueを変数に入れる」ということらしいです。
 なので、「加算する前の値」というより、「加算する前の数値化した値」を返すってことですね

 そういうわけで、後置インクリメントは数値キャストに使えますね。

b='0x100';
b+++44; // 300

 LeftHandSideExpressionに対してしか書けないのでリテラルに対して使えず、かつ変数とかの内容を破壊してしまうので、使いたい場面が全く思いつかない、というのがちょっと残念ですが。
 
 


初めてのQiita記事を書きましたが、こんな感じでいいんですかねー?