LoginSignup
7
1

More than 5 years have passed since last update.

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

Posted at

 先日、
 
非推奨だった 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記事を書きましたが、こんな感じでいいんですかねー?

7
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1