Heim  >  Artikel  >  Web-Frontend  >  schwach! Interviewfrage console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) gibt was aus

schwach! Interviewfrage console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) gibt was aus

藏色散人
藏色散人nach vorne
2023-04-12 15:29:22916Durchsuche
Dieser Artikel vermittelt Ihnen relevantes Wissen über das Frontend. Er teilt Ihnen hauptsächlich eine Interviewfrage zu console.log mit. Ich hoffe, dass er für alle hilfreich ist.

Vorwort

Interviewfragen console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) Was ist die Ausgabe? Ich bin während des Interviews auf diese Interviewfrage gestoßen, in der es um Typkonvertierung, implizite Typkonvertierung, Operatoren usw. ging. Es ist nicht so, dass ich nicht weiß, wie ich sie beantworten soll Ich lese gerade die Frage. Es handelt sich jedoch tatsächlich um eine Interviewfrage, also versuchen Sie, sie zu lösen.

schwach! Interviewfrage console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) gibt was aus

Wissen erforderlich, um dieses Problem zu lösen

  • "+": unary + führt die gleiche Konvertierung durch wie die Verwendung von Number()
  • Wenn das +-Zeichen die Addition zweier Zahlen ist, ist einer der Operanden ein Objekt oder ein value oder Boolean, rufen Sie ihre toString-Methode auf, um sie in einen String zu konvertieren
  • „!“: Kein Operator, diese Operation gibt immer einen Booleschen Wert zurück
  • „!!“: erzwungene Konvertierung in einen Booleschen Wert

um dieses Problem zu lösen Problem ([] [[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]

Zuerst müssen wir die Ausführungsreihenfolge klären

Führen Sie zuerst ([][[]] + []) aus, führen Sie zuerst den darin enthaltenen [][[]] aus und berechnen Sie dann [ ][[]], es führt tatsächlich den Wert mit Schlüssel [] im leeren Array [] aus([][[]] + []),先执行里面的[][[]],在计算 [][[]]时,其实就是执行[]空数组里面key为[]的值

  1. 首先,JavaScript 引擎解析空数组 []。空数组没有任何元素。
  2. 接下来,引擎尝试使用 [] 作为属性名来访问空数组的属性。在这种情况下,由于 [] 本身是一个数组,JavaScript 引擎会尝试将其转换为字符串。由于 [] 为空数组,转换成字符串后结果为一个空字符串 ""
  3. 最后,引擎会尝试访问空数组中名为 "" 的属性。由于这个属性并不存在于空数组中,所以结果为 undefined

所以,执行 [][[]] 的结果是 undefined

那么([][[]] + [])接下去执行就是(undefined + []) 将会执行隐式类型转换,将undefined转换为字符串"undefined",将[]转为“”,然后将两个字符串拼接在一起。因此,结果是"undefined"

其次执行[+!![]],!![]空数组转布尔值为true,一元操作服+会转为数值,+true就是将true转换为数字1。得到的结果就是[1]。于是我们就可以得到([][[]] + [])[+!![]]undefined[1]这个的结果就是字符串'n'

接下来就是执行([]+{})[+!![]+ + !![]] 这一部分,再将这部分的结果和上面的结果相加

  1. 先执行([]+{}),  计算[]+{}。这将触发隐式类型转换,将空对象转换为字符串"[object Object]",然后将两个字符串拼接在一起。因此,结果是'[object Object]'

  2. 再执行[+!![]+ + !![]], +!![]前面有解析过得到的是1,所以这一部分执行过后得到的是数值1相加1+1,得到的结果是[2]

  3. 那么这两部分合起来就是'[object Object]'[2],就是字符串的第三个值b

最后将前面部分得到的结果 'n' 和后面部分得到的结果 'b' 相加,得到最后的结果'nb'

总结:这个题目一时解决不了的话,可能有以下几个原因,第一个就是不太清楚执行顺序,其次就是不太理解[][[]]这个,实际上就是获取空数组key为[]的值,又因为数组的key为字符串,所以会将[]转为''

    Zuerst analysiert die JavaScript-Engine das leere Array []. Ein leeres Array enthält keine Elemente.

    Als nächstes versucht die Engine, auf die Eigenschaften des leeren Arrays zuzugreifen, indem sie [] als Eigenschaftsnamen verwendet. Da [] in diesem Fall selbst ein Array ist, versucht die JavaScript-Engine, es in einen String umzuwandeln. Da [] ein leeres Array ist, ist das Ergebnis nach der Konvertierung in einen String ein leerer String "".
    Abschließend versucht die Engine, auf die Eigenschaft mit dem Namen "" im leeren Array zuzugreifen. Da diese Eigenschaft im leeren Array nicht vorhanden ist, ist das Ergebnis undefiniert.

Das Ergebnis der Ausführung von [][[]] ist also undefiniert. 🎜🎜Dann ist die nächste Ausführung von ([][[]] + []) (undefiniert + []), die eine implizite Typkonvertierung durchführt und konvertiert Konvertieren Sie undefiniert in die Zeichenfolge „undefiniert“, konvertieren Sie [] in „“ und verketten Sie dann die beiden Zeichenfolgen miteinander. Daher ist das Ergebnis "undefiniert"🎜🎜🎜Dann führen Sie [+!![]] aus, das leere Array !![] wird in einen booleschen Wert von true konvertiert und Der unäre Operationsdienst + wird in einen numerischen Wert konvertiert, +true bedeutet, true in die Zahl 1 umzuwandeln. Das Ergebnis ist [1]. Wir können also ([][[]] + [])[+!![]] als undefiniert[1] erhalten. Das Ergebnis ist die Zeichenfolge 'n'🎜🎜🎜Der nächste Schritt besteht darin, ([]+{})[+!![]+ + !![]] auszuführen und dann Hinzufügen die Ergebnisse dieses Teils zu den obigen Ergebnissen🎜
    🎜🎜Führen Sie zuerst ([]+{}) aus und berechnen Sie []+{}. Dadurch wird eine implizite Typkonvertierung ausgelöst, bei der das leere Objekt in die Zeichenfolge "[object Object]" konvertiert und die beiden Zeichenfolgen dann miteinander verkettet werden. Daher ist das Ergebnis '[object Object]'. 🎜🎜🎜🎜Führen Sie [+!![]+ + !![]] erneut aus. +!![] wurde zuvor analysiert und hat 1 erhalten, sodass der nach der Ausführung dieses Teils erhaltene Wert a ist numerischer Wert Die Addition von 1 zu 1+1 ergibt [2]. 🎜🎜🎜🎜Dann sind die beiden Teile zusammen '[object Object]'[2], was der dritte Wert b der Zeichenfolge ist🎜🎜
🎜Schließlich wird der vorherige Teil erhalten Das Ergebnis 'n' wird zum im folgenden Teil erhaltenen Ergebnis 'b' addiert, um das Endergebnis 'nb'🎜🎜Zusammenfassung zu erhalten : Wenn diese Frage im Moment nicht gelöst werden kann, kann dies mehrere Gründe haben. Der erste ist, dass die Ausführungsreihenfolge nicht klar ist, und der zweite ist, dass der [][[]] nicht klar ist Tatsächlich geht es darum, den leeren Array-Schlüssel als Wert von [] zu erhalten, und da der Schlüssel des Arrays eine Zeichenfolge ist, wird [] in konvertiert '', daher kann es nicht gefunden werden. Rückgabe undefiniert. Kennen Sie diese Interviewfrage jetzt? 🎜🎜Empfohlenes Lernen: „🎜Web-Frontend-Entwicklungsvideo-Tutorial🎜“🎜🎜🎜

Das obige ist der detaillierte Inhalt vonschwach! Interviewfrage console.log(([][[]] + [])[+!![]]+([]+{})[+!![]+ + !![]]) gibt was aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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