In diesem Artikel stellen wir Ihnen eine klassische Interviewfrage vor, um herauszufinden, wie Sie „a==1&&a==2&&a==3“ wahr machen können. Durch diese Interviewfrage habe ich die darin enthaltenen Wissenspunkte erfahren und hoffe, dass sie für alle hilfreich sein werden!
if (a == 1 && a == 2 && a == 3) { console.log('Win') }
Wie erstelle ich den Code, wenn er Win
auf der Konsole ausführt? geblendet. Wie konnte eine so widersprüchliche Situation entstehen, als ob eine Person gleichzeitig ein Kind, ein Erwachsener und eine ältere Person sein könnte? .php.cn/upload/article/000/000/024/1c5120dd3dddfbf15b8c0e4a9e660147-0.png" Loading="lazy"/>Win
?
看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢?
冷静下来,发现一些端倪。
它没说让a同时等于1 2 3。
而且js是单线程运行的。 即使它们写在了一行,那也是从左到右执行的. 所以它们从时空上面就不是同一时期的东西。
既然不是同一时期的东西,那么一个人当然可以是可以成为小孩子,之后成为过成年人,然后变成老年人了。
回到题目,那么我想要让这个条件成立,就需要获取一次a的同时,让它自增1。
第一种方法,利用判断过程中的[隐式转换]的toString
方法。在我的另外一篇为什么[] == ![]结果为true?中详细阐述过。
const a = { _a: 0, toString: function() { return ++a._a } }
运行一次,就给_a加1,然后返回.
因为toString是Object.prototype
上面默认的方法,所以这个办法相当于把正常的隐式转换中toString
方法给拦截了。
涉及原型和原型链的知识点
问题是可以解决了。
评论区的有掘友说让 a = true 也可以解决的。确实很有误导性。其实是混淆了隐式转化的优先级。简单来说,隐式转化是由两部分组成:转化的规则 + 触发转化的条件。if
包着的里面整体触发了Boolean()
的转化规则,==
又字符串在右侧触发toString()
的转化规则。
回到这题,==
的右边是数字,JS运行线路是从左到右的。所以,这个时候触发的是Number()
的规则,把左侧的true
转化为1
之后,两边类型一致之后,那自然不会再触发什么规则了,此时已经不构成隐式转化。所以说1 == 1 && 1 == 2 && 1 == 3
是不成立的。
现在记住了,也比面试过程中的时候再来记好
现在将题目简单修改一下,将双等变成三个等怎么办?
大家都知道===
的话是先判断类型,再判断值。这里的toString
已经默认把对象转化为字符串了.使用toStirng
Zurück zum theme Wenn ich möchte, dass diese Bedingung wahr ist, muss ich ein Once erhalten und es um 1 erhöhen lassen.
2.1 toString
Die erste Methode besteht darin, [versteckt] im Beurteilungsprozess zu verwenden.toString
Konvertierungsmethode]. In meinem anderen Artikel Warum[ ] = = ![] Das Ergebnis ist wahr? im Detail erklärt.
Object.defineProperties(window, { _a: { value: 0, writable: true }, a: { get: function() { return ++_a } } })
Führen Sie es einmal aus, addieren Sie _a um 1 und kehren Sie dann zurück.Da toString die Standardmethode über Object.prototype
ist, entspricht diese Methode der normalen impliziten Konvertierung toString-Methode wird abgefangen.
if
löst die Konvertierungsregel von Boolean()
als Ganzes aus, und die Zeichenfolge löst toString(() auf der rechten Seite von <code>== aus
)s Konvertierungsregeln. 🎜🎜Zurück zu dieser Frage: Die rechte Seite von ==
ist eine Zahl und die JS-Lauflinie verläuft von links nach rechts. Daher wird zu diesem Zeitpunkt die Regel von Number()
ausgelöst. Nach der Konvertierung von true
in 1
werden die Typen von Beide Seiten sind gleich🎜, dann werden natürlich keine Regeln mehr ausgelöst und es handelt sich nicht mehr um eine implizite Konvertierung. Also ist 1 == 1 && 1 == 2 && 1 == 3
nicht wahr. 🎜🎜🎜Jetzt, wo ich es auswendig gelernt habe, ist es besser, als es während des Interviews auswendig zu lernen🎜🎜🎜Jetzt modifiziere ich einfach die Frage und ändere sie von doppelt auf dreifach usw. Was soll ich tun? 🎜🎜Jeder weiß, dass ===
zuerst den Typ und dann den Wert bestimmt. Der toString
hier hat das Objekt standardmäßig in einen String umgewandelt. Wenn Sie toStirng
verwenden, ist das Ergebnis nicht wahr Datenabfangmethode:🎜rrreee🎜Beinhaltet Inhalte im Zusammenhang mit Objektzugriff🎜🎜🎜Ich frage mich, ob es Sie an die Uhr oder berechnete Anweisungen in Vue erinnert? 🎜🎜🎜🎜3. Zusammenfassung🎜🎜🎜Ob Sie diese Interviewfrage bewältigen können, hat keine Bedeutung. Es ist jedoch sehr interessant, die in dieser Interviewfrage enthaltenen Wissenspunkte zu verstehen. 🎜🎜Von impliziten Typkonvertierungen über Prototypen und Prototypketten bis hin zu den Zugriffsrechteeigenschaften von Objekten. Wenn Sie das Implementierungsprinzip der bidirektionalen Bindung von Vue, die Implementierung von Static in der Klasse usw. weiter erweitern möchten. 🎜🎜Aus diesem Grund wird gesagt, dass es notwendig ist, ein Front-End-Wissenssystem aufzubauen, das sich von einem Wissenspunkt auf andere verwandte Wissenspunkte erstrecken kann. 🎜🎜【Empfohlenes Lernen: 🎜Javascript-Tutorial für Fortgeschrittene🎜】🎜Das obige ist der detaillierte Inhalt vonInterviewfrage: Wie macht man „a==1&&a==2&&a==3' wahr?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!