JavaScript(a==1&a==2&a==3)はtrueかもしれませんか?

1357 ワード

コメント:この問題はいい面接問題だと思いますか?
JavaScriptの中(a==1&a==2&a==3)はtrueですか?
この問題は海外の求職者が最近大手科学技術会社を面接する時に出会った問題です.
彼は「不可能」と答えましたが、面接の方は「nothing is impossible」と言ってからはなくなりました.
実際の仕事ではこのようなコードを書く人はいないかもしれませんが、問題の主はやはり諦められず、二週間も考え抜いて、ついにStock Overflowで解答を求めることにしました.
まず自分で考えてみてもいいです.



ここで最高の答えをあげます.
tostring(またはvalueOf)メソッドをカスタマイズし、呼び出しごとに戻り値を変更して判定条件を満たす.
const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

==を使用する場合、二つのパラメータのタイプが異なると、JSはその中の一つのタイプを他のタイプと同じに変換することを試みる.ここで左のオブジェクト、右の数字の場合、まずvalueOfを呼び出してオブジェクトを数字に変換します.失敗したらtostringを呼び出します.
実は、他にもたくさんの実現があります.興味があるのはリンクをクリックしてみてください.
例えば、これが好きです.
with({
  get a() {
    return Math.floor(Math.random()*4);
  }
}){
  for(var i=0;i<1000;i++){
    if (a == 1 && a == 2 && a == 3){
      console.log("after "+(i+1)+" trials, it becomes true finally!!!");
      break;
    }
  }
}

この問題はやはりJavascriptの基本的な理解を得られます.純粋に遊ぶためではありません.一つは、一つの対象に対してvalueOf/toStringの呼び出し問題があります.第二に、JSの変数の背後には常に一つのfunctionがあります.
問題:Can(a==1&a==2&a==3)ever evaluate to true?reddit討論:Javascript:Can(a==1&a==2&a==3)ever evaluate to true?r/programming旧文書の紹介:2017 JavaScript調査報告の概要