ES規範解読の自増操作符
2087 ワード
ES規範解読の自増操作符
原文:https://github.com/kuitos/kuitos.github.io/issues/24何ヶ月前に、何の原因が分かりませんでしたか?同僚とjsの中で操作符(i++)を増やす問題を討論しました.今は原因と結果を整理して、世間に伝えますか?
事件の起源はこのようなコードです.
操作数をインクリメンタル計算しますが、インクリメンタル計算されていない値を返します.
しかし、本では、先に増分計算をしてから戻る前の値を教えてくれませんでした.それとも戻る前の値を返してから増分計算をしますか?このような疑問に対して、私達はecmascriptに助けを求めて公式の説明を提供するしかないです.
Postfix Increment Operator(後自増操作符)
The production PostfixExpressition:Left HandSideExpressition[no Line Terminator here]+is evaluated as follows: Everaluate LeftHandSideExprestion. Call GetValue(Result(1). Call ToNumber(Result(2). Add the value 1 to Result(3)、using the same rules as for the+operator(see 11.6.3). Call PutValue(Result(1)、Result(4)). Return Return Result(3). esの上のアルゴリズムの説明から、私達は明らかに分かることができて、後でオペレータを増加するのは先に増賦してから、その後増加前の値から帰って、このような1つの順序です.ここまではまだ計算しきれない. それとも実行エンジンは適切な最適化が可能です.一歩だけ操作します. この点をどうやって確認したいですか?松波さんはObject.observeを使って解決策を示しました.(この方法はES 7の提案中の新アプリですが、chromeは早く実現しました)
ちなみに、手ブレが気になります.自動操作は非原子的な操作です.非スレッドの安全です.マルチスレッド環境では変数を共用してブースト操作をすると問題があります.
原文:https://github.com/kuitos/kuitos.github.io/issues/24何ヶ月前に、何の原因が分かりませんでしたか?同僚とjsの中で操作符(i++)を増やす問題を討論しました.今は原因と結果を整理して、世間に伝えますか?
事件の起源はこのようなコードです.
var i = 0;
i = i++;
console.log(i);
さあ、答えは何ですか?結果は0
という形になりました.みなさんはあまり疑問がないかもしれません.var i = 0;
var a = i++;
console.log(a); // 0
そうです.これは私達が初めて操作子を増やす古典的な例です.この結果に対してまだ疑問があります.自覚してください.遠隔的に考えると、その年にオペレータを増やすコツを学んだのは大体i++ ,++i
です.var i =0;
i = i;
i = i + 1;
残念な結果はこのようにサイの本の上の説明によってではなくて、後の増量(post increment)の操作符の特徴はそうです.操作数をインクリメンタル計算しますが、インクリメンタル計算されていない値を返します.
しかし、本では、先に増分計算をしてから戻る前の値を教えてくれませんでした.それとも戻る前の値を返してから増分計算をしますか?このような疑問に対して、私達はecmascriptに助けを求めて公式の説明を提供するしかないです.
Postfix Increment Operator(後自増操作符)
The production PostfixExpressition:Left HandSideExpressition[no Line Terminator here]+is evaluated as follows:
i=i++
このような操作が最後のiですか?それとも元の値ですか?つまりこのコードは実際の意味がありません.jsエンジンは性に対して最適化することができますか?不要な自己増加演算を避けることができますか?(IDEを使ったら、IDEはあなたに無駄なコードを提示します.つまり、私達はどうやって確認しますか?実行エンジンは必ず二段階の操作をしました.i = i + 1;
return iBeforeIncrease=0;i = iBeforeIncrease;
i = iBeforeIncrease;
var obj = {i:0};
Object.observe(obj, function(changes){
console.log(changes);
});
obj.i = obj.i++;
コードをchromeに入れて走ると、変化が二回トリガされました.つまり、iは二回の修正操作をしました.また、firefoxでも似たようなappi、Object.prototype.watchを提供しています.興味がある人はこの方式を試して検証してみてください.ちなみに、手ブレが気になります.自動操作は非原子的な操作です.非スレッドの安全です.マルチスレッド環境では変数を共用してブースト操作をすると問題があります.