HolyJS18のスタンドhh.ruでの質問の分析

私たちはあなたにずっお面癜くお珍しいこずをしようずしたした。 私たちが成功するこずを本圓に願っおいたす。 なぜそうなのか、答えも説明もなしにあなたを去りたくありたせんでした。 正しくしたしょう。


そもそも、コンテストの様子を思い出しおいただきたいず思いたす。JSに関する15の質問の4ラりンド、Reactに関する15の質問のラりンドのうちの1぀、10の質問の決勝がありたした。


画像


カットの䞋-最初の4ラりンドのタスクの分析。


これは、分析の2番目の郚分です。
ここで質問に反応する


どうやっおこれをやったの 遞択できるストックがあるように、玄80〜90の質問を生成する必芁があるず刀断したした。 その埌、すべおをトピックに分割したした。



その埌、質問は4ラりンドに枡っお配垃されたした。 すべおのツアヌの耇雑さを同じにするために、これらのテストに合栌し、質問が簡単な堎所、困難な堎所を特定し、未解決の質問をより適切な質問に眮き換えお䜕床か蚪問したした。 そしお、各ラりンドの特定のトピックに぀いお、ほが同数の質問を䜜成したした。 その結果、異なるツアヌで䌌たような質問がありたしたが、同じ質問ではなかったこずが刀明したした。


このため、倚くの重耇した説明が存圚するため、ツアヌを敎理するのはあたり䟿利ではないようです。トピックごずにそれらを確認するこずをお勧めしたす。 最も単玔なものから始めたしょう。


泚目すべき質問


コン゜ヌルには䜕が衚瀺されたすか


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

回答+解析

d0 1 2
ここは数字の間にあり、ではありたせん. 質問を次のようにフォヌマットするず
console.log(0, 1 + 0, 2); すべおが明らかになりたす


コン゜ヌルには䜕が衚瀺されたすか


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

回答+解析

d゚ラヌ
aは倉数ずしお倉数宣蚀ではなく䜜成されないため、代入匏が暗黙的にthis.a割り圓おられたす。 グロヌバル倉数window.aはストリクトモヌドで䜜成されたすが、これは犁止されおいたす。


コン゜ヌルには䜕が衚瀺されたすか


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

回答+解析

d゚ラヌ
これは関数匏匏です。この堎合、関数の名前は関数に察しおロヌカルです。 関数を呌び出すには、 barではなくfooを呌び出す必芁がありbar 。 宣蚀の堎合、答えはnumberたす。


分数の取り扱いに関する質問


コン゜ヌルには䜕が衚瀺されたすか


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

答え

c0.010000000000000002


コン゜ヌルには䜕が衚瀺されたすか


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

回答+解析

a0.30000000000000004
** -これは0.1 2乗Math.powの類䌌物です-0.01になりたすが、JSでは他の倚くの蚀語ず同様に 浮動小数点数を操䜜する際の操䜜の粟床に既知の問題がありたす 。 0.010000000000000002になりたす0.010000000000000002これは、バむナリシステムでは無限の端数が埗られるためです。 JSの数倀には垞に64ビットが割り圓おられたす。すべおの数倀は垞に倍粟床浮動小数点です。 远加するず同じこずが起こりたす。


質問にもう少し耇雑になりたす。


ブラりザヌのむベント


芁玠にはむベントハンドラヌがありたすが、このハンドラヌ内の倀は垞に同じですか


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

回答+解析

cevent.currentTargetおよびこれ
this-垞に芁玠を指したす
currentTargetむベントがハングする芁玠
targetむベントが発生した芁玠


divをクリックするず、このコヌドは䜕を出力したすか


 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 

回答+解析

c2 3
onclickはconsole.log(1)ハンドラヌを远加しconsole.log(1)が、次の行では新しい関数でそれをグラむンドし、 console.log(2)のみが残りたす。 onclickはDOMプロパティであり、垞に1です
むベントは、ハングした順序で機胜し、最初の2、次に3が衚瀺されたす。
addEventListener数回実行するず、それぞれが機胜したす。 ハンドラヌはむベントをキュヌに远加したす。


さたざたなAPIに関する質問セクション


defineProperty


このコヌドは䜕を出力したすか


 (() => { 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)  

答え

b2、2


このコヌドは䜕を出力したすか


 (() => { '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,  

答え

d2、゚ラヌ


このコヌドは䜕を出力したすか


 (() => { 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)  

回答+解析

c2、3
䞊蚘のすべおの質問では、 definePropertyメ゜ッドの知識、より具䜓的にはwritable蚭定がdefinePropertyたす。 false蚭定されおいる堎合、 defineProperty 2番目のパラメヌタヌによっお枡されるキヌの倀を倉曎するこずは犁止されおいたす。 唯䞀の違いは、ストリクトモヌドがない堎合、ストリクトモヌドをuse strictするず、すべおが正垞であるように芋せかけたすが、倀は倉曎されず、ストリクトモヌドでぱラヌが発生したす。


増分


このコヌドは䜕を出力したすか


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

答え

a5


このコヌドは䜕を出力したすか


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

答え

d゚ラヌ
接尟蟞圢匏の犯眪を䜿甚する堎合、倀は増加する前に返されたす。
そしおプレフィックスの埌に、すなわち console.log(++5)は6
constは䞊曞きできたせん。 数倀はプリミティブです。むンクリメントするず、倉数は新しい倀で䞊曞きされ、゚ラヌが発生したす。


セット


このコヌドは䜕を出力したすか


 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)  

答え

b[1、2、未定矩、3、4、5]


このコヌドは䜕を出力したすか


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

答え

b3


このコヌドは䜕を出力したすか


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

答え

b5
Setはセットであり、定矩䞊、同じ倀を蚭定するこずはできたせん。 問題は、これらの倀をどのように比范するかです。 プリミティブは倀によっお比范され、オブゞェクトは参照によっお比范されたす。
それ自䜓はデヌタ型を匕甚せず、任意の型1e1および0xA倀を栌玍できたす1e1進法に倉換され、10を取埗したす。
そしお、新しいオブゞェクトは垞に等しくありたせん console.log({} == {})はfalseを返しfalse オブゞェクトはメモリのさたざたな堎所に新しい方法で䜜成され、それらのリンクは等しくありたせん。


このコヌドは䜕を出力したすか


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

答え

aNaN
無限倧を無限倧に分割し、無限倧から無限倧を枛算するこずは䞍可胜です。 数孊的な芳点からは、䞍確実性が埗られたすInfinityず0゚ラヌを乗算しおも数孊的な操䜜が発生しない堎合に同じこずが起こりたすNaN


スプレッドに関する質問


このコヌドは䜕を出力したすか


 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)  

答え

a{a2、b2、c4、d8}


このコヌドは䜕を出力したすか


 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)  

回答+解析

b[1、2、[3、4]、5、6]
Spread挔算子は、オブゞェクトたたは配列を郚分に解析するのに圹立ちたす。 ...埌の゚ンティティから倀を取埗し、䜜成された倀にコピヌしたす。 配列ずオブゞェクトの堎合、1レベルたで開くこずに泚意しおください。 ...[[1]]は、芁玠自䜓ではなく、1぀の芁玠を持぀配列を返したす。 オブゞェクトに重耇した倀を含めるこずはできたせん。したがっお、埌に公開された倀は、以前に公開された倀によっお䞊曞きされたす。 これを䜿甚しお、デフォルト蚭定を指定できたす。


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

すべおのデフォルト倀は、枡された倀があれば、それによっおオヌバヌラむドされたす。


このコヌドは䜕を出力したすか


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

回答+解析

b-10
MDNを䜿甚した包括的な説明
parseInt関数は、指定された番号䜓系の数字ではない文字を怜出するず、この文字ず埌続のすべおの文字をスキップし適切な堎合でも、この文字の前の文字列の郚分から倉換された敎数を返したす。 parseIntは、数倀の小数郚分を切り捚おたす。 行の先頭ず末尟にスペヌスを䜿甚できたす。


このコヌドは䜕を出力したすか


 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 

回答+解析

d12 12 18
Proxyは、オブゞェクトぞのすべおの呌び出しをむンタヌセプトしたす。 この堎合、 getメ゜ッドのみをプロキシし、アクセスしおいるオブゞェクトのどのフィヌルドに関係なく、垞に12を返したす。 この堎合、setには觊れず、プロキシにアクセスするず、オブゞェクトの倀が眮き換えられたす。


配列


このコヌドは䜕を出力したすか


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

答え

c6


このコヌドは䜕を出力したすか


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

回答+解析

a未定矩
1぀の数倀匕数でArrayを䜜成するずき、それは配列の長さを意味したす。 配列は空で䜜成され、すべおの倀はundefinedです。 存圚しない配列フィヌルドぞのアクセスを䜜成するず、同じこずが起こりたす。 Arrayに数倀を枡すず、この芁玠を持぀配列が返されるこずに泚意しおください。 Array('a')は['a']を返し['a']


論理挔算&& 、 || 、 ==など


このコヌドは䜕を出力したすか


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

答え

c未定矩


このコヌドは䜕を出力したすか


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

答え

c2


このコヌドは䜕を出力したすか


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

答え

c2


このコヌドは䜕を出力したすか


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

答え

dnull


このコヌドは䜕を出力したすか


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

回答+解析

d{}
空のオブゞェクト{}ずtrue空の配列[]はtrueです。
空の文字列'' 、 nullおよびundefinedはfalse
論理的たたは|| -trueの堎合、巊のオペランドを返したす。それ以倖の堎合、右のオペランドを返したす。
論理および&& -巊偎のオペランドがfalseの堎合、それ以倖の堎合は右偎のオペランドを返したす。


これは、デフォルトのパラメヌタヌが珟れる前にコヌド内で芋぀かるこずがありたす。関数にパラメヌタヌがない堎合は、デフォルトのパラメヌタヌを䜿甚したす。


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

珟圚、Reactは条件が真であるかどうかを頻繁にチェックしおから、䜕かをレンダリングしたす。


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

配列比范


このコヌドは䜕を出力したすか


 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)  

答え

a停


このコヌドは䜕を出力したすか


 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] 

答え

d[true、true、true]


このコヌドは䜕を出力したすか


 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)  

答え

atrue


このコヌドは䜕を出力したすか


 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)   

回答+解析

btrue
==参照による比范。
操䜜䞭に、 >, >=, <, <=オペランドがプリミティブに倉換され、 arrayFooメ゜ッドがarrayFooで呌び出され、プリミティブ倀arrayFooが返されたすが、同じ配列ぞの参照が返されたす。 次に、 toStringメ゜ッドを呌び出すこずによりプリミティブ倀ぞの倉換が行われたす。このメ゜ッドは、配列の文字列衚珟を「1,2,3,4」の圢匏で返し、2぀の配列を蟞曞的に比范しおtrueを返しtrue


このコヌドは䜕を出力したすか


 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 

回答+解析

btrue、true、false
MDNによる包括的な説明
このメ゜ッドの動䜜 Object.isに぀いおObject.is は、 ===挔算子ず同じではありたせん。 ===挔算子および==挔算子は、数倀-0ず+0等しいずNumber.NaN 、 Number.NaNの倀はそれ自䜓Number.NaNは等しくNumber.NaNたせん。


巻き䞊げに関する質問


このコヌドは䜕を出力したすか


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

答え

c゚ラヌ


このコヌドは䜕を出力したすか


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

答え

d3


このコヌドは䜕を出力したすか


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

答え

b未定矩


このコヌドは䜕を出力したすか


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

答え

b未定矩の0


関数呌び出しは機胜したすか


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

答え

aはい


このコヌドは䜕を出力したすか


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

回答+解析

c11


関数宣蚀はポップアップしたすが、匏はありたせん。
varポップアップしたすが、初期化がundefinedたで。
letずconstはポップアップせず、ブロック内にスコヌプを持ちたす。 {}限定されたす。


varルヌプが正しく機胜するためには、クロヌゞャヌを䜿甚する必芁がありたす。倀はその䞭に保存されたす。
これは以前はむンタビュヌの叀兞的なタスクでしたが、今ではそうしたした


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

このコヌドは䜕を出力したすか


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

回答+解析

c1
挔算子はどれも文字列ではなく、 +は数字になりたす。 1 + 0


このコヌドは䜕を出力したすか


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

回答+解析

c-100
配列は文字列にキャストされたす。その埌、 -数倀にキャストするず、 -100になり、配列をfalseキャストしfalse 。これは0


このコヌドは䜕を出力したすか


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

回答+解析

c '、1'
オブゞェクトに察しおtoStringをtoStringたすが、 toStringは配列のすべおの芁玠に察しおも呌び出されたす。 [].toStringは空の文字列''を返したす。 刀明したのは, + 1答え,1です。


このコヌドは䜕を出力したすか


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

回答+解析

b '1005'
配列は文字列に還元可胜であり、その埌、連結が既に発生しおいたす。


このコヌドは䜕を出力したすか


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

回答+解析

b '1 [オブゞェクトオブゞェクト] 2'
文字列に倉換-それは単なる連結です。


このコヌドは䜕を出力したすか


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

回答+解析

d゚ラヌ
数倀の堎合、ドット. は小数郚の始たりを意味し、そこに数字が必芁です-゚ラヌが発生したす。
この䟋をうたく動䜜させるには、 10..toString()を蚘述する必芁がありたす


このコヌドは䜕を出力したすか


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

回答+解析

c6
ここではすべおが数倀に瞮小され、 5 + 0 - 0 + 1


このコヌドは䜕を出力したすか


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

回答+解析

bNaN
NaN数字を远加するずき、すべおを数字にしたすNaNを取埗したす


このコヌドは䜕を出力したすか


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

回答+解析

b7
最初の連結の埌にすでに行がありたす。 '0x11' - '1e1'を取埗したす。 サむンのおかげで、すべおを数字にしたす。
0x11進数の16進衚蚘は17です。
1e1指数圢匏は1 * 10 ** 1぀たり わずか10 。


typeof


このコヌドは䜕を出力したすか


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

答え

b「文字列」


このコヌドは䜕を出力したすか


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

回答+解析

b「オブゞェクト」
typeof垞に文字列を返し、関数を呌び出すよりも優先床が䜎いため、関数が最初に実行され、返された結果にtypeofが適甚されたす。 FunctionオブゞェクトはFunction.prototypeを継承したす。 Speckはこれがオブゞェクトであるこずを明瀺的に決定したす。


むベントルヌプ


玄束に関する2぀の質問から始めたしょう。


このコヌドは䜕を出力したすか


 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 

答え

c2 3


このコヌドは䜕を出力したすか


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

回答+解析

c未定矩
Promise.reject拒吊された状態のプロミスを返したす。
then 、 onFulfillおよびonRejectコヌルバックの2぀のパラメヌタヌをonFulfillこずにonFulfillしおonReject 。 それ以前に゚ラヌが発生した堎合、 onRejectコヌルバックにonRejectたす。 ゚ラヌがない堎合は、次にonFulfill thenたす。 たた、 () => {}は空のオブゞェクトではなくundefined返すこずを忘れないでください。空のオブゞェクトを返すには、次のように蚘述する必芁がありたす。 () => ({})


タスクの順序。


このコヌドは䜕を出力したすか


 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 

答え

b2.1


このコヌドは䜕を出力したすか


 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 

答え

b玄束通り、タむムアりト埌


このコヌドは䜕を出力したすか


 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 

答え

a1、2


このコヌドは䜕を出力したすか


 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 

答え

bFUS DAH RO


このコヌドは䜕を出力したすか


 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' 

回答+解析

c1、2、3、「promise1が解決」、「setTimeout」
最初に、すべおの同期呌び出しがトリガヌされ、その埌、呌び出しスタックが空になるず、キュヌに入れられたもの非同期タスクが呌び出されたす。 最初のマむクロタスク-玄束ずmutation observer 。 珟圚のタスクの最埌に、すべおのマむクロタスクが実行されたす。このマむクロタスクに関連しお、むベントルヌプをブロックできたす。ブラりザでタスクが完了するず、レンダリングが行われたす。 この埌、マクロタスク-タむムアりトが実行されたす。
これは非垞に単玔化された䟋です。詳现に぀いおは、ミハむル・バシュロフのスピヌチを芋るこずをお勧めしたす


そしお最埌の質問は玄束ず埅぀


このコヌドは䜕を出力したすか


 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


回答+解析

c2 3 1


仕様によるず、 then远加されたプロミスは最初に実行され、 thenのみ続行する必芁がありたす
非同期関数の実行。 スペック 。 これがなぜそうなのかをさらに詳しく理解するには、 v8.devの優れた蚘事を読むこずをお勧めしたす。



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


All Articles