この記事では、「a==1&&a==2&&a==3」を true にする方法を確認するための典型的な面接の質問を紹介します。このインタビューの質問を通じて、そこに含まれる知識のポイントを学びました。ぜひ皆さんのお役に立てれば幸いです。
if (a == 1 && a == 2 && a == 3) { console.log('Win') }
コードを実行してコンソールに正常に出力する方法勝利
?
最初に質問を見たとき、私は目がくらんでしまいました。どうしてこのような矛盾した状況が起こるのでしょうか?それは、人がどのようにして子供でありながら同時に大人になることができるのかに相当します。または
#落ち着いて、手がかりを見つけてください。
a が同時に 1 2 3 に等しいとは言えません。
そして、js は単一のスレッドで実行されます。たとえ一行で書かれていても、左から右へ実行されるため、同じ時間・空間ではありません。
同じ時代ではないので、当然、人は子供になり、次に大人になり、そして老人になることができます。
質問に戻ります。この条件を true にしたい場合は、 a を 1 回取得し、同時に 1 ずつ増加させる必要があります。
最初の方法は、[判定プロセスでの暗黙的な変換]# を使用することです。 ##toString メソッド。他の記事
なぜ [] == ![] は true になるのですか? で詳しく説明しました。
const a = { _a: 0, toString: function() { return ++a._a } }
Object.prototype 上のデフォルトのメソッドであるため、このメソッドは変更するのと同じです。通常の暗黙的な変換の
toString メソッドがインターセプトされます。
プロトタイプとプロトタイプ チェーンに関する知識ポイント問題は解決できます。 コメント欄の何人かの友人は、a = true を設定することでも問題を解決できると言いました。確かに非常に誤解を招きます。実際、暗黙的な変換の優先順位が混乱します。簡単に言えば、暗黙的変換は 2 つの部分で構成されます:
変換ルールと変換をトリガーする条件。 ifパッケージ全体が
Boolean()、
== の変換ルールをトリガーし、文字列が右側の
toString()## をトリガーします #変換ルール。 この質問に戻りますが、
の右側は数値であり、JS の実行行は左から右です。したがって、このときにトリガーされるのは、Number()
ルールです。左側の true
を 1
に変換した後、両方の 型が決まります。両側は同じです
その後、当然のことながら、それ以上のルールはトリガーされなくなり、暗黙的な変換を構成しなくなります。したがって、1 == 1 && 1 == 2 && 1 == 3 は当てはまりません。
ここで、質問を単純に修正して、二重等号をに変更します。 3
の場合はどうすればよいですか?
=== が最初に型を決定し、次に値を決定することは誰もが知っています。ここの toString
は、デフォルトでオブジェクトを文字列に変換しています。toStirng
を使用すると、結果は true になりません。
Object.defineProperties(window, { _a: { value: 0, writable: true }, a: { get: function() { return ++_a } } })
オブジェクト アクセサー関連のコンテンツを含む
これが Vue の監視または計算された命令を思い出させるかどうかはわかりません。3. まとめ
暗黙的な型変換からプロトタイプとプロトタイプ チェーン、そして最後にオブジェクトのアクセス権属性まで。さらに拡張したい場合は、Vue の双方向バインディングの実装原理、クラス内での static の実装などです。
これらが、1 つの知識ポイントから他の関連する知識ポイントに拡張できるフロントエンドの知識システムを構築する必要がある理由です。
[推奨学習:
JavaScript 上級チュートリアル以上が面接の質問: 「a==1&&a==2&&a==3」を true にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。