Heim  >  Artikel  >  Web-Frontend  >  Interviewfrage: Wie macht man „a==1&&a==2&&a==3“ wahr?

Interviewfrage: Wie macht man „a==1&&a==2&&a==3“ wahr?

青灯夜游
青灯夜游nach vorne
2023-03-13 20:06:481577Durchsuche

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!

Interviewfrage: Wie macht man „a==1&&a==2&&a==3“ wahr?

1. Problemanalyse

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?

看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢?

Interviewfrage: Wie macht man „a==1&&a==2&&a==3“ wahr?

冷静下来,发现一些端倪。

它没说让a同时等于1 2 3。

而且js是单线程运行的。 即使它们写在了一行,那也是从左到右执行的. 所以它们从时空上面就不是同一时期的东西。

既然不是同一时期的东西,那么一个人当然可以是可以成为小孩子,之后成为过成年人,然后变成老年人了。

Interviewfrage: Wie macht man „a==1&&a==2&&a==3“ wahr?

回到题目,那么我想要让这个条件成立,就需要获取一次a的同时,让它自增1。

二、解决办法

2.1 toString

第一种方法,利用判断过程中的[隐式转换]的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

Beruhige dich und finde ein paar Hinweise.

Es heißt nicht, dass a gleichzeitig gleich 1 2 3 sein soll.

Und js läuft in einem einzelnen Thread. Auch wenn sie in einer Zeile geschrieben sind, werden sie von links nach rechts ausgeführt. Sie stammen also nicht aus derselben Zeit- und Raumperiode.

Da sie nicht aus derselben Zeit stammen, kann eine Person natürlich ein Kind, dann ein Erwachsener und dann eine ältere Person werden.

Interviewfrage: Wie macht man „a==1&&a==2&&a==3“ wahr?

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.

Zweite Lösung

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.

🎜🎜Wissenspunkte zu Prototypen und Prototypenketten🎜🎜🎜Das Problem kann gelöst werden. 🎜🎜Einige Freunde im Kommentarbereich sagten, dass das Setzen von a = true das Problem auch lösen kann. Wirklich sehr irreführend. Tatsächlich verwirrt es die Priorität der impliziten Konvertierung. Einfach ausgedrückt besteht die implizite Konvertierung aus zwei Teilen: 🎜Konvertierungsregeln + Bedingungen, die die Konvertierung auslösen🎜. Das Paket 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen