先日、
非推奨だった bool 型に対するインクリメント演算子を削除 - cpprefjp C++日本語リファレンス
という記事を読みまして、そこで紹介されていたバッドコードをなんとなくjavascriptで試してみました。
b = false;
function f(b){
return b;
}
f(b++);
そしたら0
が返ってきまして。
MDNに
オペランドの後に演算子を置く(例:x++)後置記法で使った場合、加算する前の値を返します。
算術演算子 - JavaScript | MDN
とあったもんですから、えー、型キャストしちゃうのなんで? と思ってES6の解説を見ましたら、
- Let lhs be the result of evaluating LeftHandSideExpression.
- Let oldValue be ToNumber(GetValue(lhs)).
- ReturnIfAbrupt(oldValue).
- Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.7.5).
- Let status be PutValue(lhs, newValue).
- ReturnIfAbrupt(status).
- Return oldValue.
ECMAScript 2015 Language Specification – ECMA-262 6th Edition
とのこと。「数値型に返還したものをoldValue
に入れ、oldValue
に1足したものをnewValue
に入れて、oldValue
を返し、newValue
を変数に入れる」ということらしいです。
なので、「加算する前の値」というより、「加算する前の数値化した値」を返すってことですね
そういうわけで、後置インクリメントは数値キャストに使えますね。
b='0x100';
b+++44; // 300
LeftHandSideExpression
に対してしか書けないのでリテラルに対して使えず、かつ変数とかの内容を破壊してしまうので、使いたい場面が全く思いつかない、というのがちょっと残念ですが。
初めてのQiita記事を書きましたが、こんな感じでいいんですかねー?