Analyse der Fragen am Stand hh.ru auf # HolyJS18

Wir haben versucht, etwas Interessantes und Ungewöhnliches für Sie zu tun. Ich hoffe wirklich, dass es uns gelingt. Wir wollten Sie nicht unbeantwortet lassen und keine Erklärung dafür. Lass es uns richtig machen.


Zunächst möchte ich Sie daran erinnern, wie der Wettbewerb abgehalten wurde. Es gab 4 Runden mit 15 Fragen zu JS, eine Runde mit 15 Fragen zu React außerhalb des Wettbewerbs und ein Finale mit 10 Fragen.


Bild


Unter dem Schnitt - die Analyse der Aufgaben der ersten 4 Runden.


Dies ist der zweite Teil unserer Analyse.
Reagieren Sie hier auf Fragen


Wie haben wir das alle gemacht? Wir haben beschlossen, dass wir ungefähr 80-90 Fragen generieren müssen, damit ein Bestand zur Auswahl steht. Danach haben wir alles in Themen unterteilt:


  • Browser-Ereignisse
  • verschiedene APIs (Array, Set, defineProperty usw.),
  • Aufmerksamkeit
  • arbeite mit Bruchzahlen
  • Heben
  • Ereignisschleife
  • Typkonvertierung
  • Art
  • logisch (mit logischem UND und ODER)

Danach wurden die Fragen auf 4 Runden verteilt. Wir haben versucht, alle Touren in ihrer Komplexität gleich zu gestalten. Dazu haben wir mehrere Besuche durchgeführt, um diese Tests zu bestehen und festzustellen, wo die Fragen einfacher sind, wo es schwieriger ist, und die ausstehenden Fragen durch geeignetere ersetzt. Und wir haben in jeder Runde ungefähr die gleiche Anzahl von Fragen zu einem bestimmten Thema gestellt. Als Ergebnis stellte sich heraus, dass es bei verschiedenen Touren ähnliche, aber nicht dieselben Fragen gab.


Aus diesem Grund scheint es nicht sehr bequem zu sein, Touren zu sortieren, da es viele doppelte Erklärungen geben wird. Ich schlage vor, sie nach Themen zu betrachten. Beginnen wir mit dem einfachsten.


Fragen zur Aufmerksamkeit:


Was wird in der Konsole angezeigt?


console.log(0,1 + 0,2); a) 0.30000000000000004 b) 0.3 c) 2 d) 0 1 2 

Antwort + Analyse

d) 0 1 2
Hier steht zwischen den Zahlen und nicht . Wenn Sie die Frage wie folgt formatieren:
console.log(0, 1 + 0, 2); alles wird klar


Was wird in der Konsole angezeigt?


 (() => { 'use strict'; a = null + undefined; console.log(a); })(); a) 0 b) NaN c) null d)  

Antwort + Analyse

d) Fehler
a wird nicht als Variable erstellt (keine Variablendeklaration), hier gibt es einen impliziten Zuweisungsausdruck this.a der sehr oft nicht das ist, was Sie erwarten, weil Ein globales Variablenfenster.a wird im strengen Modus erstellt, dies ist verboten.


Was wird in der Konsole angezeigt?


 let foo = function bar() { return 123; }; console.log( typeof bar() ); a) 'function' b) 'number' c) 'undefined' d)  

Antwort + Analyse

d) Fehler
Dies ist ein Funktionsausdruck (Ausdruck) - der Name der Funktion ist in diesem Fall lokal für die Funktion. Um eine Funktion aufzurufen, müssen Sie foo und nicht bar aufrufen. Wenn es eine Erklärung wäre, wäre die Antwort number .


Fragen zum Arbeiten mit Bruchzahlen:


Was wird in der Konsole angezeigt?


 console.log(0.1 ** 2); a) 0.2 b) 0.01 c) 0.010000000000000002 d) NaN 

Die Antwort

c) 0,010000000000000002


Was wird in der Konsole angezeigt?


 console.log(0.1 + 0.2); a) 0.30000000000000004 b) 0.3 c) 2 d) NaN 

Antwort + Analyse

a) 0,30000000000000004
** - Dies ist ein Analogon zu Math.pow im Quadrat 0.1 - es sollte sich als 0.01 herausstellen, aber in JS (wie in vielen anderen Sprachen) gibt es ein bekanntes Problem mit der Genauigkeit von Operationen beim Arbeiten mit Gleitkommazahlen . Es wird 0.010000000000000002 Dies liegt an der Tatsache, dass im binären System ein unendlicher Bruch erhalten wird, weil Für eine Zahl in JS werden immer genau 64 Bit zugewiesen - alle Zahlen sind immer Gleitkommazahlen mit doppelter Genauigkeit. Das gleiche passiert, wenn es hinzugefügt wird.


Wir wenden uns den Fragen etwas komplizierter zu.


Ereignisse im Browser:


Das Element enthält einen Ereignishandler. Welche Werte in diesem Handler sind immer gleich?


 elem.onclick = function(event) { } a) event.target  event.currentTarget b) event.target  this c) event.currentTarget  this d)     

Antwort + Analyse

c) event.currentTarget und dies
this - zeigt immer auf ein Element
currentTarget - das Element, an dem das Ereignis hängt
target - das Element, bei dem das Ereignis aufgetreten ist


Was wird dieser Code ausgeben, wenn Sie auf ein div klicken?


 div.onclick = function() { console.log(1) }; div.onclick = function() { console.log(2) }; div.addEventListener('click', function() { console.log(3) }); a) 1 b) 1 3 c) 2 3 d) 3 

Antwort + Analyse

c) 2 3
onclick fügt den console.log(1) , aber in der nächsten Zeile mahlen wir ihn mit einer neuen Funktion und es bleibt nur console.log(2) übrig. onclick ist eine DOM-Eigenschaft, es ist immer eine
Ereignisse funktionieren in der Reihenfolge, in der sie aufgehängt sind. Zuerst werden 2, dann 3 angezeigt.
Wenn wir addEventListener mehrmals addEventListener würden, würde jeder von ihnen funktionieren, weil Handler fügen der Warteschlange Ereignisse hinzu.


Fragenbereich zu verschiedenen APIs


defineProperty:


Was wird dieser Code ausgeben?


 (() => { const obj = { key: 1 }; Object.defineProperty(obj, 'key', { enumerable: false, configurable: false, writable: false, value: 2 }); console.log(obj.key); obj.key = 3; console.log(obj.key); })(); a) 1, 2 b) 2, 2 c) 2, 3 d)  

Die Antwort

b) 2, 2


Was wird dieser Code ausgeben?


 (() => { 'use strict'; const obj = { key: 1 }; Object.defineProperty(obj, 'key', { enumerable: false, configurable: false, writable: false, value: 2 }); console.log(obj.key); obj.key = 3; console.log(obj.key); })(); a) 1, 2 b) 2, 2 c) 2, 3 d) 2,  

Die Antwort

d) 2, Fehler


Was wird dieser Code ausgeben?


 (() => { const obj = { key: 1 }; Object.defineProperty(obj, 'key', { enumerable: false, configurable: false, writable: true, value: 2 }); console.log(obj.key); obj.key = 3; console.log(obj.key); })(); a) 1, 2 b) 2, 2 c) 2, 3 d)  

Antwort + Analyse

c) 2, 3
In allen oben genannten Fragen wird die Kenntnis der defineProperty Methode und insbesondere der writable Einstellungen defineProperty . Wenn der Wert auf false ist, dürfen die Werte des Schlüssels, der vom zweiten Parameter in defineProperty . Der einzige Unterschied besteht darin, dass use strict Engine ohne strengen Modus - use strict verwenden - vorgibt, dass alles in Ordnung ist, aber den Wert nicht ändert und im strengen Modus ein Fehler auftritt.


Inkrement:


Was wird dieser Code ausgeben?


 let x = 5; console.log(x++); a) 5 b) 6 c) '5++' d)  

Die Antwort

a) 5


Was wird dieser Code ausgeben?


 const a = 5; console.log(a++); a) 5 b) 6 c) '5++' d)  

Die Antwort

d) Fehler
Bei Verwendung der Postfix-Form der Inkriminierung wird der Wert vor der Erhöhung zurückgegeben.
Und mit dem Präfix nach, d.h. console.log(++5) würde 6 drucken
const kann nicht überschrieben werden; Zahl ist ein Grundelement. Wenn es inkrementiert wird, wird die Variable mit dem neuen Wert überschrieben und es tritt ein Fehler auf.


Set:


Was wird dieser Code ausgeben?


 const a = [...new Set([1, 1, 2, , 3, , 4, 5, 5])]; console.log(a); a) [1, 1, 2, , 3, , 4, 5, 5] b) [1, 2, undefined, 3, 4, 5] c) [1, 1, 2, undefined, 3, undefined, 4, 5, 5] d)  

Die Antwort

b) [1, 2, undefiniert, 3, 4, 5]


Was wird dieser Code ausgeben?


 let set = new Set([10, '10', new Number(10), 1e1, 0xA]); console.log(set.size); a) 5 b) 3 c) 2 d) 1 

Die Antwort

b) 3


Was wird dieser Code ausgeben?


 let obj = {}; let set = new Set([obj, obj, {}, {}, {...{}}, {...obj}]); console.log(set.size); a) 6 b) 5 c) 2 d) 1 

Die Antwort

b) 5
Set ist ein Set, das per Definition keine identischen Werte enthalten kann. Die Frage ist, wie diese Werte verglichen werden. Grundelemente werden nach Wert und Objekte nach Referenz verglichen.
Es selbst zitiert keine Datentypen und kann Werte aller Typen 1e1 und 0xA - wird in ein Dezimalsystem konvertiert und erhält 10 .
Und neue Objekte sind immer nicht gleich: console.log({} == {}) gibt seitdem false Objekte werden an verschiedenen Orten des Gedächtnisses auf neue Weise erstellt und ihre Verknüpfungen sind nicht gleich.


Was wird dieser Code ausgeben?


 console.log(Infinity / Infinity); a) NaN b) 1 c) Error d) Infinity 

Die Antwort

a) NaN
Es ist unmöglich, Unendlichkeit in Unendlichkeit zu teilen und Unendlichkeit von Unendlichkeit zu subtrahieren, da Aus mathematischer Sicht wird Unsicherheit erhalten, dasselbe passiert, wenn Infinity multipliziert wird und 0 Fehler keine mathematischen Operationen verursachen - es wird NaN


Fragen zur Verbreitung:


Was wird dieser Code ausgeben?


 const a = { ...{ a: 1, b: 2, c: 3 }, ...{ a: 2, c: 4, d: 8 } }; console.log(a); a) { a: 2, b: 2, c: 4, d: 8 } c) { a: 1, b: 2, c: 3, d: 8 } c) { a: 1, b: 2, c: 3, a: 2, c: 4, d: 8 } d)  

Die Antwort

a) {a: 2, b: 2, c: 4, d: 8}


Was wird dieser Code ausgeben?


 const a = [...[1, 2], ...[[3, 4]], ...[5, 6]]; console.log(a); a) [1, 2, 3, 4, 5, 6] b) [1, 2, [3, 4], 5, 6] c) [[1, 2], [[3, 4]], 5, 6] e)  

Antwort + Analyse

b) [1, 2, [3, 4], 5, 6]
Spread Operator dient zum Parsen eines Objekts oder Arrays in Teile. Es nimmt Werte von der Entität nach ... und kopiert sie in die erstellte. Es ist erwähnenswert, dass für ein Array und ein Objekt eine Ebene geöffnet wird, d. H. ...[[1]] gibt ein Array mit einem Element zurück, nicht das Element selbst. Es können keine doppelten Werte in Objekten vorhanden sein. Daher werden die nachfolgend angegebenen Werte von den zuvor angegebenen Werten überschrieben. Hiermit können Standardeinstellungen festgelegt werden.


 const fn = (actualProps) => ({ ...defaultProps, ...actualProps }) 

Alle Standardwerte werden gegebenenfalls durch die übergebenen Werte überschrieben.


Was wird dieser Code ausgeben?


 console.log(parseInt(' -10,3   ')); a) -10,3 b) -10 c) TypeError d) NaN 

Antwort + Analyse

b) -10
Vollständige Beschreibung mit MDN :
Wenn die Funktion parseInt auf ein Zeichen stößt, das im angegebenen Zahlensystem keine Zahl ist, überspringt sie dieses und alle nachfolgenden Zeichen (auch wenn sie geeignet sind) und gibt eine Ganzzahl zurück, die aus dem Teil der Zeichenfolge vor diesem Zeichen konvertiert wurde. parseInt schneidet den Bruchteil einer Zahl ab. Leerzeichen am Anfang und Ende einer Zeile sind zulässig.


Was wird dieser Code ausgeben?


 const t = { a: 6, b: 7 }; const p = new Proxy(t, { get() { return 12; }, }); console.log(pa); pa = 18; console.log(pa); console.log(ta); a)  b) 12 18 18 c) 12 18 6 d) 12 12 18 e) 6 18 6 

Antwort + Analyse

d) 12 12 18
Proxy fängt alle Aufrufe des Objekts ab. In diesem Fall vertreten wir nur die get Methode und geben immer 12 unabhängig davon, auf welches Feld des Objekts wir zugreifen. In diesem Fall berühren wir set nicht und beim Zugriff auf den Proxy wird der Wert im Objekt ersetzt.


Arrays:


Was wird dieser Code ausgeben?


 let arr = []; arr[1] = 1; arr[5] = 10; console.log(arr.length); a) 1 b) 5 c) 6 d) 10 

Die Antwort

c) 6


Was wird dieser Code ausgeben?


 let arr = new Array(3); console.log(arr[1]); a) undefined b) 1 c) 3 d)  

Antwort + Analyse

a) undefiniert
Wenn wir ein Array mit einem numerischen Argument erstellen, bedeutet dies die Länge des Arrays. Ein Array wird leer erstellt, alle Werte sind undefined . Das gleiche passiert, wenn Sie Zugriff auf ein nicht vorhandenes Array-Feld erstellen. Es ist erwähnenswert, dass, wenn Sie eine Zahl an Array , ein Array mit diesem Element zurückgegeben wird, d. H. Array('a') gibt ['a']


logische Operationen && , || , == usw.:


Was wird dieser Code ausgeben?


 console.log([] && 'foo' && undefined && true && false); a) [] b) 'foo' c) undefined d) true 

Die Antwort

c) undefiniert


Was wird dieser Code ausgeben?


 console.log(0 || 1 && 2 || 3); a) 0 b) 1 c) 2 d) 3 

Die Antwort

c) 2


Was wird dieser Code ausgeben?


 console.log(0 || '' || 2 || undefined || true || false); a) 0 b) false c) 2 d) true 

Die Antwort

c) 2


Was wird dieser Code ausgeben?


 console.log(2 && '1' && null && undefined && true && false); a) 2 b) false c) undefined d) null 

Die Antwort

d) null


Was wird dieser Code ausgeben?


 console.log([] && {} || null && 100 || ''); a) true b) 100 c) '' d) {} 

Antwort + Analyse

d) {}
Ein leeres Array [] ist true ebenso wie ein leeres Objekt {} .
Die leere Zeichenfolge '' , null und undefined ist false
Logisch oder || - gibt den linken Operanden zurück, falls true, andernfalls den rechten Operanden.
Logisch und && - gibt den linken Operanden zurück, wenn er falsch ist, andernfalls den rechten Operanden.


Dies kann manchmal im Code gefunden werden, bevor die Standardparameter angezeigt werden. Sie haben oft so geschrieben - wenn die Funktion keine Parameter enthält, nehmen wir die Standardparameter:


 function f(userParams) { var params = userParams || defaultParams; } 

Jetzt prüft React oft, ob die Bedingung erfüllt ist, dann rendern wir etwas:


 { isDivVisible && <div>bla-bla</div> } 

Array-Vergleich:


Was wird dieser Code ausgeben?


 const arrayFoo = [1, 2, 3, 4]; const arrayBaz = [1, 2, 3, 4]; console.log(arrayFoo == arrayBaz && arrayFoo == arrayBaz); a) false b) true c) undefined d)  

Die Antwort

a) falsch


Was wird dieser Code ausgeben?


 console.log([null, 0, -0].map(x => 0 <= x)); a) [false, true, false] b) [false, true, true] c) [false, false, false] d) [true, true, true] 

Die Antwort

d) [wahr, wahr, wahr]


Was wird dieser Code ausgeben?


 const arrayFoo = [1, 2, 3, 4]; const arrayBaz = [1, 2, 3, 4]; console.log(arrayFoo >= arrayBaz && arrayFoo <= arrayBaz); a) true b) false c) undefined d)  

Die Antwort

a) wahr


Was wird dieser Code ausgeben?


 const foo = [1, 2, 3, 4]; const baz = '1,2,3,4'; console.log(foo >= baz && foo <= baz); a) false b) true c) undefined d)   

Antwort + Analyse

b) wahr
Wenn == anhand der Referenz vergleichen.
Während der Operation >, >=, <, <= Operanden in Grundelemente konvertiert, und die valueOf-Methode wird für arrayFoo aufgerufen. arrayFoo sollte den arrayFoo , gibt jedoch einen Verweis auf dasselbe Array zurück. Als nächstes erfolgt eine Konvertierung in einen primitiven Wert durch Aufrufen der toString Methode, die wiederum eine Zeichenfolgendarstellung des Arrays in Form von "1,2,3,4" zurückgibt, zwei Arrays lexikografisch vergleicht und true


Was wird dieser Code ausgeben?


 console.log(+0 == -0); console.log(+0 === -0); console.log(Object.is(+0, -0)); a) true, false, false b) true, true, false c) false, true, true d) false, false. false 

Antwort + Analyse

b) wahr, wahr, falsch
Umfassende Erklärung mit MDN :
Das Verhalten dieser Methode (über Object.is ) ist nicht dasselbe wie der Operator === . Der Operator === (sowie der Operator == ) betrachtet die numerischen Werte -0 und +0 gleich, und der Wert Number.NaN nicht gleich sich selbst.


Fragen zum Heben:


Was wird dieser Code ausgeben?


 console.log(str); const str = 'HeadHunter'; a) 'HeadHunter' b) undefined c)  

Die Antwort

c) Fehler


Was wird dieser Code ausgeben?


 var arrayFunction = []; for (let i = 0; i <= 10; i++) { arrayFunction.push(() => i); } console.log(arrayFunction[3]()); a) 4 b) 0 c) 11 d) 3 

Die Antwort

d) 3


Was wird dieser Code ausgeben?


 console.log(str); var str = 'HeadHunter'; a) 'HeadHunter' b) undefined c) null c)   

Die Antwort

b) undefiniert


Was wird dieser Code ausgeben?


 console.log(foo); var foo; foo = foo ? 1 : 0; console.log(foo); a)  b) undefined 0 c) '' 1 d) 0 0 

Die Antwort

b) undefiniert 0


Funktioniert ein Funktionsaufruf?


 getCompanyName(); function getCompanyName() { return 'HeadHunter'; } a)  b) ,     . c)  

Die Antwort

a) ja


Was wird dieser Code ausgeben?


 var arrayFunction = []; for (var i = 0; i <= 10; i++) { arrayFunction.push(() => i); } console.log(arrayFunction[3]()); a) 4 b) 0 c) 11 d) 3 

Antwort + Analyse

c) 11


Funktionsdeklarationen werden angezeigt, aber kein Ausdruck.
var angezeigt, aber bis die Initialisierung undefined .
let und const nicht angezeigt und haben einen Gültigkeitsbereich in einem Block, d. h. beschränkt auf {} .


Damit die Schleife mit var korrekt funktioniert var Sie einen Abschluss verwenden. Der Wert wird darin gespeichert.
(Früher war dies eine klassische Aufgabe für Interviews, aber jetzt haben wir es gelassen)


 var arrayFunction = []; for (var i = 0; i <= 10; i++) { (function(i) { arrayFunction.push(() => i); })(i); } console.log(arrayFunction[3]()); 

Was wird dieser Code ausgeben?


 console.log(true + false); a) true b) false c) 1 d) 0 

Antwort + Analyse

c) 1
Keiner der Operatoren ist eine Zeichenfolge, + führt zu einer Zahl. Es stellt sich heraus, 1 + 0


Was wird dieser Code ausgeben?


 console.log([] - 100 + ![]); a) false b) '-100' c) -100 d) NaN 

Antwort + Analyse

c) -100
Das Array wird in eine Zeichenfolge umgewandelt. Danach wird - -100 in eine Zahl umgewandelt, es stellt sich heraus, dass -100 , dann wird das Array in false , und dies ist 0


Was wird dieser Code ausgeben?


 console.log([[], []] + 1); a) 1 b) '1' c) ',1' d) NaN 

Antwort + Analyse

c) ', 1'
Wir toString für das Objekt auf, während toString auch für alle Elemente des Arrays aufgerufen wird. [].toString gibt eine leere Zeichenfolge '' . Es stellt sich heraus , + 1 - die Antwort ,1 .


Was wird dieser Code ausgeben?


 console.log([] + 100 + 5); a) 105 b) '1005' c) 1005 d) NaN 

Antwort + Analyse

b) "1005"
Das Array kann auf eine Zeichenfolge reduziert werden, und dann tritt bereits eine Verkettung auf.


Was wird dieser Code ausgeben?


 console.log(1 + { a: 3 } + '2'); a) 6 b) '1[object Object]2' c) 3 d) NaN 

Antwort + Analyse

b) '1 [Objekt Objekt] 2'
In eine Zeichenfolge konvertieren - es ist nur eine Verkettung.


Was wird dieser Code ausgeben?


 console.log(10.toString() + 10 + 0x1); a) '10101' b) 21 c) '10100x1' d)  

Antwort + Analyse

d) Fehler
Für die Anzahl der Punkte . bedeutet der Beginn des Bruchteils, wir erwarten dort eine Zahl - es wird ein Fehler auftreten.
Damit dieses Beispiel funktioniert, müssen Sie 10..toString() schreiben.


Was wird dieser Code ausgeben?


 console.log(5 + false - null + true); a) '0true' b) NaN c) 6 d)   

Antwort + Analyse

c) 6
Hier wird alles auf eine Zahl reduziert, es stellt sich heraus, 5 + 0 - 0 + 1


Was wird dieser Code ausgeben?


 console.log(true + NaN + false); a) true b) NaN c) false d) 1 

Antwort + Analyse

b) NaN
Wir reduzieren alles auf eine Zahl, wenn wir Zahlen mit NaN hinzufügen - wir bekommen NaN


Was wird dieser Code ausgeben?


 console.log('0x1' + '1' - '1e1'); a) 17 b) 7 c) '0x111e1' d) NaN 

Antwort + Analyse

b) 7
Es gibt bereits Zeilen nach der ersten Verkettung, wir erhalten: '0x11' - '1e1' . Wegen des Zeichens - wir bringen alles auf eine Nummer.
0x11 - Die Hexadezimalzahl in Dezimalzahl ist 17 .
1e1 - die Exponentialform ist dieselbe wie 1 * 10 ** 1 - d.h. nur 10 .


Art:


Was wird dieser Code ausgeben?


 let foo = () => { return null; }; console.log( typeof typeof foo ); a) 'function' b) 'string' c) 'null' d)  

Die Antwort

b) "Zeichenfolge"


Was wird dieser Code ausgeben?


 typeof function() {}.prototype; a) 'function' b) 'object' c) 'undefined' d)  

Antwort + Analyse

b) "Objekt"
typeof immer einen String zurück, hat eine niedrigere Priorität als der Aufruf der Funktion, daher wird die Funktion zuerst ausgeführt und typeof wird auf das zurückgegebene Ergebnis angewendet. Funktionsobjekte erben von Function.prototype. Speck stellt ausdrücklich fest, dass dies ein Objekt ist.


Ereignisschleife:


Beginnen wir mit 2 Fragen zu Versprechungen.


Was wird dieser Code ausgeben?


 Promise.reject() .then(() => console.log(1), () => console.log(2)) .then(() => console.log(3), () => console.log(4)); a) 1 4 b) 1 3 c) 2 3 d) 2 4 

Die Antwort

c) 2 3


Was wird dieser Code ausgeben?


 Promise.reject('foo') .then(() => Promise.resolve('bar'), () => {}) .then((a) => {console.log(a)}) a) foo b) bar c) undefined d)  

Antwort + Analyse

c) undefiniert
Promise.reject - Promise.reject ein Versprechen in einem abgelehnten Zustand zurück.
Es sollte beachtet werden, dass then 2 Parameter verwendet werden, onFulfill und onReject Rückrufe. Wenn then vorher ein Fehler auftritt, gelangen wir zum Rückruf onReject . Wenn es keinen Fehler gibt, kommen wir onFulfill nächstes zu onFulfill . Und vergessen Sie nicht, dass () => {} kein leeres, sondern undefined Objekt zurückgibt. Um ein leeres Objekt zurückzugeben, müssen Sie wie folgt schreiben: () => ({})


die Reihenfolge der Aufgaben.


Was wird dieser Code ausgeben?


 async function get1() { return 1; } function get2() { return 2; } (async () => { console.log(await get1()); })(); console.log(get2()); a) 1,2 b) 2,1 c) 1 d) 2 

Die Antwort

b) 2.1


Was wird dieser Code ausgeben?


 setTimeout(() => {console.log('in timeout')}); Promise.resolve() .then(() => {console.log('in promise')}); console.log('after'); a) in timeout, in promise, after b) after, in promise, in timeout c) after, in timeout, in promise d) in timeout, after, in promise 

Die Antwort

b) nach, in Versprechen, in Timeout


Was wird dieser Code ausgeben?


 let __promise = new Promise((res, rej) => { setTimeout(res, 1000); }); async function test(i) { await __promise; console.log(i); } test(1); test(2); a) 1, 2 b) 2, 1 c) 1 d) 2 

Die Antwort

a) 1, 2


Was wird dieser Code ausgeben?


 console.log('FUS'); setTimeout(() => {console.log('RO')}) Promise.resolve('DAH!').then(x => console.log(x)); a FUS RO DAH! b) FUS DAH! RO c) RO FUS DAH! d) DAH! RO FUS 

Die Antwort

b) FUS DAH! RO


Was wird dieser Code ausgeben?


 console.log(1); setTimeout(() => console.log('setTimeout'), 0); console.log(2); Promise.resolve().then(() => console.log('promise1 resolved')); console.log(3); a) 1, 2, 3, 'setTimeout', 'promise1 resolved' b) 1, 'setTimeout', 2, 'promise1 resolved', 3 c) 1, 2, 3, 'promise1 resolved', 'setTimeout' d) 1, 2, 'promise1 resolved', 3, 'setTimeout' 

Antwort + Analyse

c) 1, 2, 3, 'Versprechen1 gelöst', 'SetTimeout'
Zunächst werden alle synchronen Aufrufe ausgelöst. Wenn der Aufrufstapel leer ist, wird das aufgerufen, was sich in der Warteschlange befindet (asynchrone Aufgaben). Erstens Mikrotask - Versprechen und mutation observer . Am Ende der aktuellen Aufgabe werden alle Mikrotask ausgeführt. In Verbindung mit dieser Mikrotask können Sie die Ereignisschleife blockieren. Nach Abschluss der Aufgabe rendert der Browser. Danach werden Makroaufgaben - Timeouts ausgeführt.
Dies ist ein sehr vereinfachtes Beispiel. Im Detail würde ich Ihnen raten, die Rede von Michail Baschurow zu sehen


Und die letzte Frage verspricht vs warten


Was wird dieser Code ausgeben?


 const p = Promise.resolve(); (async () => { await p; console.log('1'); })(); p.then(() => console.log('2')) .then(() => console.log('3')); 

a) 1 2 3
b) 2 1 3
c) 2 3 1
d) 3 2 1


Antwort + Analyse

c) 2 3 1


Gemäß der Spezifikation müssen die dann hinzugefügten Versprechen zuerst ausgeführt werden und erst danach müssen sie fortgesetzt werden
Ausführung einer asynchronen Funktion. Speck . Für ein detaillierteres Verständnis, warum dies so ist, empfehle ich Ihnen, einen ausgezeichneten Artikel auf v8.dev zu lesen

Source: https://habr.com/ru/post/de431698/


All Articles