@@ -1333,3 +1333,381 @@ setInterval(() => console.log("Hi"), 1000);
1333
1333
1334
1334
</p >
1335
1335
</details >
1336
+
1337
+ ###### 44. 何が出力されるでしょうか?
1338
+
1339
+ ``` javascript
1340
+ function * generator (i ) {
1341
+ yield i;
1342
+ yield i * 2 ;
1343
+ }
1344
+
1345
+ const gen = generator (10 );
1346
+
1347
+ console .log (gen .next ().value );
1348
+ console .log (gen .next ().value );
1349
+ ```
1350
+
1351
+ - A: ` [0, 10], [10, 20] `
1352
+ - B: ` 20, 20 `
1353
+ - C: ` 10, 20 `
1354
+ - D: ` 0, 10 and 10, 20 `
1355
+
1356
+ <details ><summary ><b >答え</b ></summary >
1357
+ <p >
1358
+
1359
+ #### 答え: C
1360
+
1361
+ 通常の関数は、呼び出し後に途中で停止することはできません。ただし、ジェネレータ関数は途中で"停止"し、後で停止した場所から続行することができます。
1362
+
1363
+ ジェネレータ関数が` yield ` キーワードを見つけるたびに、その関数はその後に指定された値を返します。その場合のジェネレータ関数は、値を"返す"わけではないことに注意してください。値を生み出しています。
1364
+
1365
+ まず、` i ` に` 10 ` を指定してジェネレータ関数を初期化します。次に` next() ` メソッドを使用してジェネレータ関数を呼び出します。
1366
+
1367
+ 最初にジェネレータ関数を呼び出すと、` i ` は` 10 ` になり、最初の` yield ` キーワードに遭遇します。そこから` i ` の値が得られます。ジェネレータは"一時停止"され、` 10 ` がログ出力されます。
1368
+
1369
+ それから、` next() ` メソッドを使って関数を再度呼び出します。依然として` i ` は` 10 ` のまま、以前に停止したところから継続し始めます。
1370
+
1371
+ それから次の` yield ` キーワードに遭遇し、そこから` i * 2 ` の値が得られます。` i ` は` 10 ` のままなので、` 10 * 2 ` 、つまり` 20 ` を返します。なので、` 10、20 ` が返る事になります。
1372
+
1373
+ </p >
1374
+ </details >
1375
+
1376
+ ---
1377
+
1378
+ ###### 45. これは何を返しますか?
1379
+
1380
+ ``` javascript
1381
+ const firstPromise = new Promise ((res , rej ) => {
1382
+ setTimeout (res, 500 , " one" );
1383
+ });
1384
+
1385
+ const secondPromise = new Promise ((res , rej ) => {
1386
+ setTimeout (res, 100 , " two" );
1387
+ });
1388
+
1389
+ Promise .race ([firstPromise, secondPromise]).then (res => console .log (res));
1390
+ ```
1391
+
1392
+ - A: ` "one" `
1393
+ - B: ` "two" `
1394
+ - C: ` "two" "one" `
1395
+ - D: ` "one" "two" `
1396
+
1397
+ <details ><summary ><b >答え</b ></summary >
1398
+ <p >
1399
+
1400
+ #### 答え: B
1401
+
1402
+ 複数のプロミスを` Promise.race ` メソッドに渡した時、"resolves/rejects"は、"最初"のプロミスの"resolves/rejects"を行います。
1403
+
1404
+ ` setTimeout ` メソッドには、タイマーを渡します: 最初のプロミスには500ms(` firstPromise ` )、2番目のプロミスには100ms(` secondPromise ` )。
1405
+
1406
+ これは、` secondPromise ` が最初に` 'two' ` の値で解決されることを意味します。` res ` は` 'two' ` の値を保持するようになり、ログ出力されます。
1407
+
1408
+ </p >
1409
+ </details >
1410
+
1411
+ ---
1412
+
1413
+ ###### 46. 何が出力されるでしょうか?
1414
+
1415
+ ``` javascript
1416
+ let person = { name: " Lydia" };
1417
+ const members = [person];
1418
+ person = null ;
1419
+
1420
+ console .log (members);
1421
+ ```
1422
+
1423
+ - A: ` null `
1424
+ - B: ` [null] `
1425
+ - C: ` [{}] `
1426
+ - D: ` [{ name: "Lydia" }] `
1427
+
1428
+ <details ><summary ><b >答え</b ></summary >
1429
+ <p >
1430
+
1431
+ #### 答え: D
1432
+
1433
+ まず、` name ` プロパティを持つオブジェクトの値を使って、変数` person ` を宣言します。
1434
+
1435
+ <img src =" https://i.imgur.com/TML1MbS.png " width =" 200 " >
1436
+
1437
+ それから、` members ` という変数を宣言します。その配列の最初の要素に、変数` person ` の値を代入します。オブジェクトは、互いをイコールで設定すると、「参照」によって相互作用します。
1438
+
1439
+ ある変数から別の変数への"参照"を代入すると、その参照の"コピー"が作成されます。 (それらは、"同じ参照"を持っていないことに注意してください!)
1440
+
1441
+ <img src =" https://i.imgur.com/FSG5K3F.png " width =" 300 " >
1442
+
1443
+ そして、変数` person ` を` null ` に設定します。
1444
+
1445
+ <img src =" https://i.imgur.com/sYjcsMT.png " width =" 300 " >
1446
+
1447
+ その要素はオブジェクトへの異なる(コピーされた)参照を持っているので、` person ` 変数の値を変更するだけで配列の最初の要素は変更されません。 ` members ` の最初の要素はまだ元のオブジェクトへの参照を保持しています。
1448
+
1449
+ ` members ` 配列をログ出力したとき、最初の要素はまだオブジェクトの値を保持しているので、それがログ出力されます。
1450
+
1451
+ </p >
1452
+ </details >
1453
+
1454
+ ---
1455
+
1456
+ ###### 47. 何が出力されるでしょうか?
1457
+
1458
+ ``` javascript
1459
+ const person = {
1460
+ name: " Lydia" ,
1461
+ age: 21
1462
+ };
1463
+
1464
+ for (const item in person) {
1465
+ console .log (item);
1466
+ }
1467
+ ```
1468
+
1469
+ - A: ` { name: "Lydia" }, { age: 21 } `
1470
+ - B: ` "name", "age" `
1471
+ - C: ` "Lydia", 21 `
1472
+ - D: ` ["name", "Lydia"], ["age", 21] `
1473
+
1474
+ <details ><summary ><b >答え</b ></summary >
1475
+ <p >
1476
+
1477
+ #### 答え: B
1478
+
1479
+ この場合、` for-in ` ループを使うと、オブジェクトキーである` name ` と` age ` の繰り返し処理できます。内部的には、オブジェクトキーは文字列です(シンボルではない場合)。
1480
+
1481
+ すべてのループで、` item ` の値は反復している現在のキーに設定されます。まず、` item ` は` name ` が代入され、ログに出力されます。その後、` item ` は` age ` が代入され、ログに出力されます。
1482
+
1483
+ </p >
1484
+ </details >
1485
+
1486
+ ---
1487
+
1488
+ ###### 48. 何が出力されるでしょうか?
1489
+
1490
+ ``` javascript
1491
+ console .log (3 + 4 + " 5" );
1492
+ ```
1493
+
1494
+ - A: ` "345" `
1495
+ - B: ` "75" `
1496
+ - C: ` 12 `
1497
+ - D: ` "12" `
1498
+
1499
+ <details ><summary ><b >答え</b ></summary >
1500
+ <p >
1501
+
1502
+ #### 答え: B
1503
+
1504
+ 演算子結合性は、コンパイラーが式を評価する順序(左から右または右から左)となります。これは、すべての演算子が同じ優先順位を持つ場合にのみ発生します。演算子の種類は1つだけです: ` + ` 。さらに、結合性は左から右です。
1505
+
1506
+ ` 3 + 4 ` が最初に評価されます。これは数字の` 7 ` になります。
1507
+
1508
+ ` 7 + '5' ` は、強制的に` "75" ` になります。 JavaScriptでは、数字の` 7 ` を文字列に変換します。質問15を参照してください。2つの文字列を演算子の` + ` を使って連結することができます。よって、` "7" + "5" ` は、` "75" ` になります。
1509
+
1510
+ </p >
1511
+ </details >
1512
+
1513
+ ---
1514
+
1515
+ ###### 49. numの値は何ですか?
1516
+
1517
+ ``` javascript
1518
+ const num = parseInt (" 7*6" , 10 );
1519
+ ```
1520
+
1521
+ - A: ` 42 `
1522
+ - B: ` "42" `
1523
+ - C: ` 7 `
1524
+ - D: ` NaN `
1525
+
1526
+ <details ><summary ><b >答え</b ></summary >
1527
+ <p >
1528
+
1529
+ #### 答え: C
1530
+
1531
+ 文字列の最初の数字だけが返されます。"基数"(解析する数値の種類を指定するための2番目の引数: 基数10, 16進数, 8進数, 2進数など)に基づいて、` parseInt ` は文字列内の文字が有効かどうかをチェックします。基数の中で有効な数字ではない文字に出会うと、構文解析を停止して次の文字を無視します。
1532
+
1533
+ ` * ` は、有効な数字ではありません。` "7" ` を、10進数の` 7 ` に解析するだけです。そのままnumは` 7 ` の値を保持します。
1534
+
1535
+ </p >
1536
+ </details >
1537
+
1538
+ ---
1539
+
1540
+ ###### 50. 何が出力されるでしょうか?
1541
+
1542
+ ``` javascript
1543
+ [1 , 2 , 3 ].map (num => {
1544
+ if (typeof num === " number" ) return ;
1545
+ return num * 2 ;
1546
+ });
1547
+ ```
1548
+
1549
+ - A: ` [] `
1550
+ - B: ` [null, null, null] `
1551
+ - C: ` [undefined, undefined, undefined] `
1552
+ - D: ` [ 3 x empty ] `
1553
+
1554
+ <details ><summary ><b >答え</b ></summary >
1555
+ <p >
1556
+
1557
+ #### 答え: C
1558
+
1559
+ 配列をマッピングするとき、` num ` の値に代入されるのは、ループで渡ってくる要素となります。この場合、要素は数値なので、ifステートメント ` typeof num === "number" ` の条件は` true ` を返します。 map関数は新しい配列を作成して関数から返された値を挿入します。
1560
+
1561
+ ただし、値は返されません。関数から値を返さないと、関数は` undefined ` を返します。配列内のすべての要素に対して関数ブロックが呼び出されるので、各要素に対して` undefined ` を返します。
1562
+
1563
+ </p >
1564
+ </details >
1565
+
1566
+ ---
1567
+
1568
+ ###### 51. 何が出力されるでしょうか?
1569
+
1570
+ ``` javascript
1571
+ function getInfo (member , year ) {
1572
+ member .name = " Lydia" ;
1573
+ year = 1998 ;
1574
+ }
1575
+
1576
+ const person = { name: " Sarah" };
1577
+ const birthYear = " 1997" ;
1578
+
1579
+ getInfo (person, birthYear);
1580
+
1581
+ console .log (person, birthYear);
1582
+ ```
1583
+
1584
+ - A: ` { name: "Lydia" }, "1997" `
1585
+ - B: ` { name: "Sarah" }, "1998" `
1586
+ - C: ` { name: "Lydia" }, "1998" `
1587
+ - D: ` { name: "Sarah" }, "1997" `
1588
+
1589
+ <details ><summary ><b >答え</b ></summary >
1590
+ <p >
1591
+
1592
+ #### 答え: A
1593
+
1594
+ 値がオブジェクトでない限り、引数は"値"によって渡され、その後、"参照"によって渡されます。 ` birthYear ` はオブジェクトではなく文字列なので、値で渡されます。引数を値で渡すと、その値の"コピー"が作成されます(質問46を参照)。
1595
+
1596
+ 変数` birthYear ` は、値` "1997" ` への参照を持ちます。引数` year ` は、値` "1997" ` も参照していますが、それは` birthYear ` が参照しているのと同じ値ではありません。` year ` に` "1998" ` を代入することによって` year ` の値を更新したとしても、` year ` の値を更新するだけです。` birthYear ` はまだ` "1997" ` となります。
1597
+
1598
+ ` person ` の値はオブジェクトです。引数` member ` は"同じ"オブジェクトへの(コピーされた)参照を持ちます。
1599
+
1600
+ ` member ` が参照を持つオブジェクトのプロパティを変更すると、` person ` の値も変更されます。これらは両方とも同じオブジェクトへの参照を持つからです。` person ` の` name ` プロパティは、値の` "Lydia" ` となりました。
1601
+
1602
+ </p >
1603
+ </details >
1604
+
1605
+ ---
1606
+
1607
+ ###### 52. 何が出力されるでしょうか?
1608
+
1609
+ ``` javascript
1610
+ function greeting () {
1611
+ throw " Hello world!" ;
1612
+ }
1613
+
1614
+ function sayHi () {
1615
+ try {
1616
+ const data = greeting ();
1617
+ console .log (" It worked!" , data);
1618
+ } catch (e) {
1619
+ console .log (" Oh no an error!" , e);
1620
+ }
1621
+ }
1622
+
1623
+ sayHi ();
1624
+ ```
1625
+
1626
+ - A: ` "It worked! Hello world!" `
1627
+ - B: ` "Oh no an error: undefined `
1628
+ - C: ` SyntaxError: can only throw Error objects `
1629
+ - D: ` "Oh no an error: Hello world! `
1630
+
1631
+ <details ><summary ><b >答え</b ></summary >
1632
+ <p >
1633
+
1634
+ #### 答え: D
1635
+
1636
+ ` throw ` ステートメントを使って、カスタムエラーを作ることができます。このステートメントで、あなたは例外を投げることができます。例外は、<b >string</b >, <b >number</b >, <b >boolean</b >, <b >object</b >のいずれかとなります。上記の場合だと、例外は文字列` 'Hello world' ` となります。
1637
+
1638
+ ` catch ` ステートメントを使って、` try ` ブロックで例外が投げられた場合にどうするかを指定できます。例外がスローされます: 文字列` 'Hello world' ` は、` e ` に代入されます。その結果` 'Oh an error: Hello world' ` となります。
1639
+
1640
+ </p >
1641
+ </details >
1642
+
1643
+ ---
1644
+
1645
+ ###### 53. 何が出力されるでしょうか?
1646
+
1647
+ ``` javascript
1648
+ function Car () {
1649
+ this .make = " Lamborghini" ;
1650
+ return { make: " Maserati" };
1651
+ }
1652
+
1653
+ const myCar = new Car ();
1654
+ console .log (myCar .make );
1655
+ ```
1656
+
1657
+ - A: ` "Lamborghini" `
1658
+ - B: ` "Maserati" `
1659
+ - C: ` ReferenceError `
1660
+ - D: ` TypeError `
1661
+
1662
+ <details ><summary ><b >答え</b ></summary >
1663
+ <p >
1664
+
1665
+ #### 答え: B
1666
+
1667
+ プロパティを返すと、そのプロパティの値は、コンストラクタ関数で設定された値ではなく、"戻り値"となります。 ` "Maserati" ` という文字列を返すので、` myCar.make ` は ` "Maserati" ` となります。
1668
+
1669
+ </p >
1670
+ </details >
1671
+
1672
+ ---
1673
+
1674
+ ###### 54. 何が出力されるでしょうか?
1675
+
1676
+ ``` javascript
1677
+ (() => {
1678
+ let x = (y = 10 );
1679
+ })();
1680
+
1681
+ console .log (typeof x);
1682
+ console .log (typeof y);
1683
+ ```
1684
+
1685
+ - A: ` "undefined", "number" `
1686
+ - B: ` "number", "number" `
1687
+ - C: ` "object", "number" `
1688
+ - D: ` "number", "undefined" `
1689
+
1690
+ <details ><summary ><b >答え</b ></summary >
1691
+ <p >
1692
+
1693
+ #### 答え: A
1694
+
1695
+ ` let x = y = 10; ` is actually shorthand for:
1696
+
1697
+ ``` javascript
1698
+ y = 10 ;
1699
+ let x = y;
1700
+ ```
1701
+
1702
+ ` y ` に` 10 ` を代入すると、実際にはグローバルオブジェクトにプロパティ` y ` が追加されます(ブラウザでは` window ` 、nodeでは` global ` )。ブラウザでは、` window.y ` は` 10 ` となりました。
1703
+
1704
+ それから、変数` x ` を` 10 ` である値` y ` で宣言します。` let ` キーワードで宣言された変数は"ブロックスコープ"となり、宣言されたブロック内でのみ定義されます。この場合は即時関数(IIFE)となります。
1705
+
1706
+ ` typeof ` 演算子使用時、オペランド` x ` は定義されていません: 宣言されているブロックの外側で` x ` にアクセスしようとしています。これは` x ` が定義されていないことを意味します。
1707
+
1708
+ 値が割り当てられていない、または宣言されていない値は` "undefined" ` 型となります。なので` console.log(typeof x) ` は` "undefined" ` を返します。
1709
+
1710
+ yに関しては、` y ` に` 10 ` を代入するときにグローバル変数` y ` を作成しました。この値は、コード内のどこからでもアクセスできます。` y ` が定義されていて、` "number" ` 型の値を保持します。よって` console.log(typeof y) ` は` "number" ` を返します。
1711
+
1712
+ </p >
1713
+ </details >
0 commit comments