JavaScript の興味深い質問: a を使用すると、結果が表示されます

 質問:

        var a = ? ;
        if (a == 1 && a == 2 && a == 3) {
            console.log('小样儿!')
        }

a が何と等しい場合、if 条件が確立され、出力されますか?

初めてこの問題を見たときは、判定条件によってaの値がどんどん蓄積されていくので、頭の回転が速くなり、演算によってどのようなデータが変化し続けるのか、と戸惑いました。いくら考えてもそのようなデータは思いつきませんでしたので、賢い方法を使わなければなりませんでした。

 答え:

方法 1: オブジェクト型変換を使用する

        var a = {
            num: 1,
            toString: function () {
                return a.num++
            }
        };
        a.join = a.shift
        if (a == 1 && a == 2 && a == 3) {
            console.log('小样儿!')
        }

説明する:

a == 1 && a == 2 && a == 3 は短絡論理 AND 演算子で、左側の条件が true の場合にのみ判断が右側に継続され、それ以外の場合は条件全体が false になります。 。したがって、右判定を続けるにはaの最初の値が1でなければなりませんが、aの値や型変換後の値は勝手に大きくなることがわかります Javascriptで異なる型の値を比較する場合、型変換ルールに従って同じ型に変換して比較します。たとえば、オブジェクト型と数値型を比較す​​る場合、オブジェクト型は数値型に変換されます。変換中に、Object.valueOf() メソッドと Object.toString() メソッドを呼び出して、対応する数値基本型を取得しようとします。上記のコードでは、論理変換では最初に Object.valueOf() メソッドが呼び出され、オブジェクトが返された場合は、ヘッダーの toString() メソッドが呼び出されます。各比較では、オーバーライドされたオブジェクト メソッド toString() が実行されます。このメソッドは、最初に属性 num の値を返し、次にそれをインクリメントします。a==1 が実行されると、オブジェクト a は toString() メソッドを呼び出し、属性 num 値を 1 として返します。このとき、a==1 が確立され、その後 a.num がインクリメントされ、以下同様に==2 と a== 3 が成立し、当然結果が出力されます。

方法 2: 配列値と型変換を使用する

        var a = [1, 2, 3, 4];
        a.join = a.shift
        if (a == 1 && a == 2 && a == 3) {
            console.log('小样儿!')
        }

説明する:

JavaScript では、ほとんどすべてのオブジェクトは Object 型のインスタンスであり、それらObject.prototypeからプロパティを継承するため、Array もオブジェクトの継承クラスです。Object の valueOf() メソッドと toString() メソッドを継承し、toString() をオーバーライドします。方法。

a.join = a.shift という文は、配列が toString() メソッドを呼び出すために join() メソッドを間接的に呼び出すとき、shift() メソッドが join() メソッドを置き換えることを意味します。これは、次の値を変更するのと同じです。配列への最初の要素を削除し、最初の要素を返します。したがって、a==1 を判定する場合、実際には元の配列から最初の要素が削除され、最初の要素の値が判定のために返されるため、元の配列は [2,3,4] となり、その場合は a=2 となります。新しい配列 [2,3,4] から最初の要素を削除し、最初の要素を返して判定し、次に a==3 を判定するのと同じです。このように毎回各判定条件が成立し、結果が出力されます。

おすすめ

転載: blog.csdn.net/Celester_best/article/details/125436556