誰かが何であるかを私に説明することができLeftFirst
ブールフラグ?読み取り時にECMAScript仕様については、[リレーショナル演算子](https://tc39.es/ecma262/#sec-relational-operators「はECMAScriptにおけるリレーショナル演算子の定義」)と抽象関係の比較私はのような何か見つけLeftFirst
いずれかのブールフラグをとなりtrue
またはfalse
私はそれを使用することが何であるかを知っている、それはそこに誰かが明確に何がの目的である私を説明することができます何のためにしていないLeftFirst
多くのIをクリアブールフラグと、それが明細書中で使用され、なぜ彼らが与えた説明ではありませんそれを使用することが何であるかを知りたいleftFirst
、それが使われている理由をブールフラグと?
あなたが述べたように、それはへの入力の一つだ抽象リレーショナル比較アルゴリズム。その唯一の目的は、比較アルゴリズムは、最初たToPrimitiveに左の1(渡されたオペランドを決定することですleftFirst = true)か右(上の1 leftFirst = false)を。その理由は、抽象リレーショナル比較が常にないことで<
比較したが、評価する際、それにも使われている>
表現を(逆のオペランドで)。取り扱うときに>
、それが右のオペランド最初にたToPrimitiveを使用するように指示する必要があります。
あなたはそれがアルゴリズムの最初のステップで使用見ることができます:
- 場合LeftFirstフラグが真、その後、
- してみましょうPXは可能?たToPrimitive(X、ヒント番号)。
- してみましょうPyは可能?たToPrimitive(Y、ヒント番号)。
- そうでなければ、
注:評価の順序は、右の評価に委ね維持するために逆にする必要があります。
- してみましょうPyは可能?たToPrimitive(Y、ヒント番号)。
- してみましょうPXは可能?たToPrimitive(X、ヒント番号)。
また、説明に:
フラグは、潜在的に目に見える副作用を有する操作が時に実行される順序を制御するために使用されるX及びYを。ECMAScript指定が式の右側の評価に委ねので、それは必要です。
あなたが見れば例えば、および操作、操作が行います。<
>
<
- してみましょうrは抽象関係の比較を行った結果もLVAL <rvalにします。
これは、デフォルト値の使用leftFirstで、true
。だから、lval
前たToPrimitiveを通過しますrval
。
しかし、>
操作が行われます。
- ましょうrは抽象関係の比較を行った結果であるrvalに < LVALとLeftFirstが等しい偽。
それがないことに注意してくださいrval < lval
、ではありませんlval > rval
。しかし、それは使用していますleftFirst = false
それは重要なことですので、右がオペランド本当の操作であるため、左側のオペランドの前たToPrimitiveを通過することがlval > rval
、そのlval
最初のたToPrimitiveを通過しなければなりません。
コメントでは、言いました:
ありがとうございました私があれば理由を知るようになった
<
演算子はLeftFirst true
、なぜ<=
もないLeftFirst true
、なぜならば>
、オペレータはある演算子もありませんLeftFirst false
>=
LeftFirst false
それは間違いなく少し混乱です。ことを理由<
と<=
一致していない(と>
と>=
一致していないが)ということです<=
/ >=
抽象関係の比較(ARC)の結果反転演算子。そう:
lval < rval
行います。let r = ARC(lval < rval, leftFirst = true); return r === undefined ? false : r; // Returns what ARC returned (but // turns `undefined` into `false`)
lval <= rval
しlet r = ARC(rval < lval, leftFirst = false); return r === undefined ? true : !r; // Returns the *inverse* of what ARC // returned (and turns `undefined` // into `true`)
lval > rval
行います。let r = ARC(rval < lval, leftFirst = false); return r === undefined ? false : r; // Returns what ARC returned (but // turns `undefined` into `false`)
lval >= rval
行います。let r = ARC(lval < rval, leftFirst = true); return r === undefined ? true : !r; // Returns the *inverse* of what ARC // returned (and turns `undefined` // into `true`)
最後のノートでは、のは、このことを考えてみましょう:
const obj = {
get lval() {
console.log("obj.lval was evaluated");
return {
valueOf() {
console.log("lval was passed through ToPrimitive");
return 42;
}
};
},
get rval() {
console.log("obj.rval was evaluated");
return {
valueOf() {
console.log("rval was passed through ToPrimitive");
return 24;
}
};
}
};
console.log("Using >");
const result1 = obj.lval > obj.rval;
// "obj.lval was evaluated"
// "obj.rval was evaluated"
// "lval was passed through ToPrimitive"
// "rval was passed through ToPrimitive"
console.log(result1);
// true
console.log("Using <");
const result2 = obj.lval < obj.rval;
// "obj.lval was evaluated"
// "obj.rval was evaluated"
// "lval was passed through ToPrimitive"
// "rval was passed through ToPrimitive"
console.log(result2);
// false
.as-console-wrapper {
max-height: 100% !important;
}
あなたはそれから見出力は次のとおりです。
> obj.lval使用obj.rvalがLVALがたToPrimitive rvalに通した評価した評価を行った使い方たToPrimitive真を通過させましたここのためにその出力を作成するために、何が起こるかです>
:
obj.lval > obj.rval
式が評価されます>
オペレータのアルゴリズムが実行されます。- これは、評価さ
lval = obj.lval
せる(ステップ1&2)、"obj.lval was evaluated"
出力 - これは、評価さ
rval = obj.rval
せる(ステップ3および4)、"obj.rval was evaluated"
出力 - これは、ARC(ステップ5)を呼び出します:
ARC(obj.rval < obj.lval, leftFirst = false)
- ARCはrecieves
obj.rval
としてx
とobj.lval
としてy
- ARCはleftFirst =を見ている
false
ので、それはありません。py = ToPrimitive(y)
せる(ステップ2.B)、"lval was passed through ToPrimitive"
出力px = ToPrimitive(x)
せる(ステップ2.C)、"rval was passed through ToPrimitive"
出力
- ARCリターン
false
- ARCはrecieves
- これは、評価さ
>
オペレータは、ARCの戻り値とリターンを反転しますtrue
ここのために、後続の出力を作成するために、何が起こるかです<
:
obj.lval < obj.rval
式が評価されます<
オペレータのアルゴリズムが実行されます。- これは、評価さ
lval = obj.lval
せる(ステップ1&2)、"obj.lval was evaluated"
出力 - これは、評価さ
rval = obj.rval
せる(ステップ3および4)、"obj.rval was evaluated"
出力 - これは、ARC(ステップ5)を呼び出します
ARC(obj.lval < obj.rval)
(trueにleftFirstデフォルト)- ARCはrecieves
obj.lval
としてx
とobj.rval
としてy
- ARCはleftFirst =を見ている
true
ので、それはありません。px = ToPrimitive(x)
せる(ステップ1.A)、"lval was passed through ToPrimitive"
出力py = ToPrimitive(y)
せる(ステップ1.B)、"rval was passed through ToPrimitive"
出力
- ARCリターン
false
- ARCはrecieves
- これは、評価さ
<
オペレータは、ARCの戻り値を返します。false