誰かが、彼らはECMAScript仕様で定義されている「LeftFirst」ブールフラグであるものを私に説明できます

ケビン:

誰かが何であるかを私に説明することができLeftFirstブールフラグ?読み取り時にECMAScript仕様については、[リレーショナル演算子](https://tc39.es/ecma262/#sec-relational-operators「はECMAScriptにおけるリレーショナル演算子の定義」)と抽象関係の比較私はのような何か見つけLeftFirstいずれかのブールフラグをとなりtrueまたはfalse私はそれを使用することが何であるかを知っている、それはそこに誰かが明確に何がの目的である私を説明することができます何のためにしていないLeftFirst多くのIをクリアブールフラグと、それが明細書中で使用され、なぜ彼らが与えた説明ではありませんそれを使用することが何であるかを知りたいleftFirst、それが使われている理由をブールフラグと?

TJクラウダー:

あなたが述べたように、それはへの入力の一つだ抽象リレーショナル比較アルゴリズムその唯一の目的は、比較アルゴリズムは、最初たToPrimitiveに左の1(渡されたオペランドを決定することですleftFirst = true)か右(上の1 leftFirst = false)を。その理由は、抽象リレーショナル比較が常にないことで<比較したが、評価する際、それにも使われている>表現を(逆のオペランドで)。取り扱うときに>、それが右のオペランド最初にたToPrimitiveを使用するように指示する必要があります。

あなたはそれがアルゴリズムの最初のステップで使用見ることができます:

  1. 場合LeftFirstフラグが、その後、
    • してみましょうPXは可能?たToPrimitive(X、ヒント番号)。
    • してみましょうPyは可能?たToPrimitive(Y、ヒント番号)。
  2. そうでなければ、
    注:評価の順序は、右の評価に委ね維持するために逆にする必要があります。
    • してみましょうPyは可能?たToPrimitive(Y、ヒント番号)。
    • してみましょうPXは可能?たToPrimitive(X、ヒント番号)。

また、説明に:

フラグは、潜在的に目に見える副作用を有する操作が時に実行される順序を制御するために使用されるX及びYをECMAScript指定が式の右側の評価に委ねので、それは必要です。

あなたが見れば例えば、および操作操作が行います。<>&lt;

  1. してみましょうrは抽象関係の比較を行った結果もLVAL <rvalにします

これは、デフォルト値の使用leftFirstで、trueだから、lval前たToPrimitiveを通過しますrval

しかし、>操作が行われます。

  1. ましょうrは抽象関係の比較を行った結果であるrvalに < LVALLeftFirstが等しい

それがないことに注意してください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真を通過させました

ここのためにその出力を作成するために、何が起こるかです>

  1. obj.lval > obj.rval式が評価されます
  2. > オペレータのアルゴリズムが実行されます。
    1. これは、評価さlval = obj.lvalせる(ステップ1&2)、"obj.lval was evaluated"出力
    2. これは、評価さrval = obj.rvalせる(ステップ3および4)、"obj.rval was evaluated"出力
    3. これは、ARC(ステップ5)を呼び出します: ARC(obj.rval < obj.lval, leftFirst = false)
      1. ARCはrecieves obj.rvalとしてxobj.lvalとしてy
      2. ARCはleftFirst =を見ているfalseので、それはありません。
        • py = ToPrimitive(y)せる(ステップ2.B)、"lval was passed through ToPrimitive"出力
        • px = ToPrimitive(x)せる(ステップ2.C)、"rval was passed through ToPrimitive"出力
      3. ARCリターン false
  3. >オペレータは、ARCの戻り値とリターンを反転しますtrue

ここのために、後続の出力を作成するために、何が起こるかです<

  1. obj.lval < obj.rval式が評価されます
  2. < オペレータのアルゴリズムが実行されます。
    1. これは、評価さlval = obj.lvalせる(ステップ1&2)、"obj.lval was evaluated"出力
    2. これは、評価さrval = obj.rvalせる(ステップ3および4)、"obj.rval was evaluated"出力
    3. これは、ARC(ステップ5)を呼び出しますARC(obj.lval < obj.rval)(trueにleftFirstデフォルト)
      1. ARCはrecieves obj.lvalとしてxobj.rvalとしてy
      2. ARCはleftFirst =を見ているtrueので、それはありません。
        • px = ToPrimitive(x)せる(ステップ1.A)、"lval was passed through ToPrimitive"出力
        • py = ToPrimitive(y)せる(ステップ1.B)、"rval was passed through ToPrimitive"出力
      3. ARCリターン false
  3. <オペレータは、ARCの戻り値を返します。false

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=347262&siteId=1