You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Обычные функции не могут быть остановлены на полпути после вызова. Однако функцию генератор можно "остановить" на полпути, а затем продолжить с того места, где она остановилась. Каждый раз, когда в функции-генераторе встречает ключевое слово `yield`, функция возвращает значение, указанное после него. Обратите внимание, что функция генератора в этом случае не _return_ значение, оно _yields_ значение.
1326
+
1327
+
Сначала мы инициализируем функцию генератор с `i`, равным` 10`. Мы вызываем функцию генератор, используя метод `next ()`. Когда мы в первый раз вызываем функцию генератора, `i` равно` 10`. Он встречает первое ключевое слово `yield`, получая значение `i`. Генератор теперь "приостановлен", и `10` выводится в консоль.
1328
+
1329
+
Затем мы снова вызываем функцию с помощью метода `next ()`. Она запускается с того места, где остановилась ранее, все еще с `i`, равным` 10`. Теперь он встречает следующее ключевое слово `yield` и возвращает `i * 2`. `i` равно` 10`, поэтому он возвращает `10 * 2`, то есть` 20`. Это приводит к 10, 20.
Когда мы передаем несколько промисов методу `Promise.race`, он разрешает/отклоняет _первый_ промис, который разрешает/отклоняет. В метод `setTimeout` мы передаем таймер: 500 мс для первого промиса (`firstPromise`) и 100 мс для второго промиса (`secondPromise`). Это означает, что `secondPromise` разрешается первым со значением `'два'`. `res` теперь содержит значение `'два'`, которое выводиться в консоль.
1361
+
1362
+
</p>
1363
+
</details>
1364
+
1365
+
---
1366
+
1367
+
###### 46. Каким будет результат?
1368
+
1369
+
```javascript
1370
+
let person = { name:"Lydia" };
1371
+
constmembers= [person];
1372
+
person =null;
1373
+
1374
+
console.log(members);
1375
+
```
1376
+
1377
+
- A: `null`
1378
+
- B: `[null]`
1379
+
- C: `[{}]`
1380
+
- D: `[{ name: "Lydia" }]`
1381
+
1382
+
<details><summary><b>Ответ</b></summary>
1383
+
<p>
1384
+
1385
+
#### Ответ: D
1386
+
1387
+
Сначала мы объявляем переменную `person` со значением объекта, у которого есть свойство` name`.
Затем мы объявляем переменную с именем `members`. Мы устанавливаем первый элемент этого массива равным значению переменной `person`. Объекты взаимодействуют посредством _ссылок_ при установке их равными друг другу. Когда вы назначаете ссылку из одной переменной в другую, вы создаете _копию_ этой ссылки. (обратите внимание, что у них _не одинаковые_ ссылки!)
Мы изменили только значение переменной `person`, а не первый элемент в массиве, поскольку этот элемент имеет другую (скопированную) ссылку на объект. Первый элемент в `members` по-прежнему содержит ссылку на исходный объект. Когда мы выводим в консоль массив `members`, первый элемент по-прежнему содержит значение объекта, который выводится в консоль.
1400
+
1401
+
</p>
1402
+
</details>
1403
+
1404
+
---
1405
+
1406
+
###### 47. Каким будет результат?
1407
+
1408
+
```javascript
1409
+
constperson= {
1410
+
name:"Lydia",
1411
+
age:21
1412
+
};
1413
+
1414
+
for (constitemin person) {
1415
+
console.log(item);
1416
+
}
1417
+
```
1418
+
1419
+
- A: `{ name: "Lydia" }, { age: 21 }`
1420
+
- B: `"name", "age"`
1421
+
- C: `"Lydia", 21`
1422
+
- D: `["name", "Lydia"], ["age", 21]`
1423
+
1424
+
<details><summary><b>Ответ</b></summary>
1425
+
<p>
1426
+
1427
+
#### Ответ: B
1428
+
1429
+
С помощью цикла `for-in` мы можем перебирать ключи объекта, в данном случае `name` и `age`. Под капотом ключи объекта являются строками (если они не являются Symbol). В каждом цикле мы устанавливаем значение `item` равным текущему ключу, по которому он перебирается. Сначала, `item` равен `name`, и выводится в консоль. Затем `item` равен `age`, который выводится в консоль.
1430
+
1431
+
</p>
1432
+
</details>
1433
+
1434
+
---
1435
+
1436
+
###### 48. Каким будет результат?
1437
+
1438
+
```javascript
1439
+
console.log(3+4+"5");
1440
+
```
1441
+
1442
+
- A: `"345"`
1443
+
- B: `"75"`
1444
+
- C: `12`
1445
+
- D: `"12"`
1446
+
1447
+
<details><summary><b>Ответ</b></summary>
1448
+
<p>
1449
+
1450
+
#### Ответ: B
1451
+
1452
+
Ассоциативность операторов - это порядок, в котором компилятор оценивает выражения, слева направо или справа налево. Это происходит только в том случае, если все операторы имеют _одинаковый_ приоритет. У нас есть только один тип оператора: `+`. Кроме того, ассоциативность слева направо.
1453
+
1454
+
`3 + 4` оценивается первым. Это приводит к числу `7`.
1455
+
1456
+
`7 + '5'` приводит к `"75"` из-за принуждения. JavaScript преобразует число `7` в строку, см. вопрос 15. Мы можем объединить две строки, используя оператор `+`. `"7" + "5"` приводит к `"75"`.
1457
+
1458
+
</p>
1459
+
</details>
1460
+
1461
+
---
1462
+
1463
+
###### 49. Какое значение `num`?
1464
+
1465
+
```javascript
1466
+
constnum=parseInt("7*6", 10);
1467
+
```
1468
+
1469
+
- A: `42`
1470
+
- B: `"42"`
1471
+
- C: `7`
1472
+
- D: `NaN`
1473
+
1474
+
<details><summary><b>Ответ</b></summary>
1475
+
<p>
1476
+
1477
+
#### Ответ: C
1478
+
1479
+
Только первые числа в строке возвращаются. На основе _системы счисления_ (второй аргумент, чтобы указать, к какому типу чисел мы хотим его анализировать: основание 10, шестнадцатеричное, восьмеричное, двоичное и т.д.), `ParseInt` проверяет, являются ли символы в строке допустимыми. Как только он встречает символ, который не является допустимым числом в основании, он прекращает синтаксический анализ и игнорирует следующие символы.
1480
+
1481
+
`*` не является допустимым числом. Он только разбирает `"7"` в десятичную `7`. `num` теперь содержит значение` 7`.
1482
+
1483
+
</p>
1484
+
</details>
1485
+
1486
+
---
1487
+
1488
+
###### 50. Каким будет результат?
1489
+
1490
+
```javascript
1491
+
[1, 2, 3].map(num=> {
1492
+
if (typeof num ==="number") return;
1493
+
return num *2;
1494
+
});
1495
+
```
1496
+
1497
+
- A: `[]`
1498
+
- B: `[null, null, null]`
1499
+
- C: `[undefined, undefined, undefined]`
1500
+
- D: `[ 3 x empty ]`
1501
+
1502
+
<details><summary><b>Ответ</b></summary>
1503
+
<p>
1504
+
1505
+
#### Ответ: C
1506
+
1507
+
При использовании метода map, значение `num` равно элементу, над которым он в данный момент зацикливается. В этом случае элементы являются числами, поэтому условие оператора if `typeof num === "number"` возвращает `true`. Функция map создает новый массив и вставляет значения, возвращаемые функцией.
1508
+
1509
+
Однако мы не возвращаем значение. Когда мы не возвращаем значение из функции, функция возвращает значение `undefined`. Для каждого элемента в массиве вызывается функциональный блок, поэтому для каждого элемента мы возвращаем `undefined`.
1510
+
1511
+
</p>
1512
+
</details>
1513
+
1514
+
---
1515
+
1516
+
###### 51. Каким будет результат?
1517
+
1518
+
```javascript
1519
+
functiongetInfo(member, year) {
1520
+
member.name="Lydia";
1521
+
year =1998;
1522
+
}
1523
+
1524
+
constperson= { name:"Sarah" };
1525
+
constbirthYear="1997";
1526
+
1527
+
getInfo(person, birthYear);
1528
+
1529
+
console.log(person, birthYear);
1530
+
```
1531
+
1532
+
- A: `{ name: "Lydia" }, "1997"`
1533
+
- B: `{ name: "Sarah" }, "1998"`
1534
+
- C: `{ name: "Lydia" }, "1998"`
1535
+
- D: `{ name: "Sarah" }, "1997"`
1536
+
1537
+
<details><summary><b>Ответ</b></summary>
1538
+
<p>
1539
+
1540
+
#### Ответ: A
1541
+
1542
+
Аргументы передаются _значением_, если их значение не является объектом, то они передаются _ссылкой_. `birthYear` передается по значению, поскольку это строка, а не объект. Когда мы передаем аргументы по значению, создается _копия_ этого значения (см. вопрос 46).
1543
+
1544
+
Переменная `birthYear` имеет ссылку на значение `"1997"`. Аргумент `year` также имеет ссылку на значение` "1997" `, но это не то же самое значение, на которое имеется ссылка для `birthYear`. Когда мы обновляем значение `year`, устанавливая `year` равным `"1998"`, мы обновляем только значение `year`. `birthYear` по-прежнему равно `"1997"`.
1545
+
1546
+
Значение `person` является объектом. Аргумент `member` имеет (скопированную) ссылку на _тот же_ объект. Когда мы изменяем свойство объекта, на который `member` ссылается, значение `person` также будет изменено, поскольку они оба имеют ссылку на один и тот же объект. Свойство `name` объекта `person` теперь равно значению `"Lydia"`.
1547
+
1548
+
</p>
1549
+
</details>
1550
+
1551
+
---
1552
+
1553
+
###### 52. Каким будет результат?
1554
+
1555
+
```javascript
1556
+
functiongreeting() {
1557
+
throw"Hello world!";
1558
+
}
1559
+
1560
+
functionsayHi() {
1561
+
try {
1562
+
constdata=greeting();
1563
+
console.log("It worked!", data);
1564
+
} catch (e) {
1565
+
console.log("Oh no an error!", e);
1566
+
}
1567
+
}
1568
+
1569
+
sayHi();
1570
+
```
1571
+
1572
+
- A: `"It worked! Hello world!"`
1573
+
- B: `"Oh no an error: undefined`
1574
+
- C: `SyntaxError: can only throw Error objects`
1575
+
- D: `"Oh no an error: Hello world!`
1576
+
1577
+
<details><summary><b>Ответ</b></summary>
1578
+
<p>
1579
+
1580
+
#### Ответ: D
1581
+
1582
+
С помощью оператора `throw` мы можем создавать собственные ошибки. С этим оператором вы можете генерировать исключения. Исключением может быть <b>строка</b>, <b>число</b>, <b>логическое значение</b> или <b>объект</b>. В этом случае нашим исключением является строка `'Hello world'`.
1583
+
1584
+
С помощью оператора `catch` мы можем указать, что делать, если в блоке` try` выдается исключение. Исключение: строка `'Hello world'`. `e` теперь равно той строке, которую мы записываем. Это приводит к `'Oh error: Hello world'`.
1585
+
1586
+
</p>
1587
+
</details>
1588
+
1589
+
---
1590
+
1591
+
###### 53. Каким будет результат?
1592
+
1593
+
```javascript
1594
+
functionCar() {
1595
+
this.make="Lamborghini";
1596
+
return { make:"Maserati" };
1597
+
}
1598
+
1599
+
constmyCar=newCar();
1600
+
console.log(myCar.make);
1601
+
```
1602
+
1603
+
- A: `"Lamborghini"`
1604
+
- B: `"Maserati"`
1605
+
- C: `ReferenceError`
1606
+
- D: `TypeError`
1607
+
1608
+
<details><summary><b>Ответ</b></summary>
1609
+
<p>
1610
+
1611
+
#### Ответ: B
1612
+
1613
+
Когда вы возвращаете свойство, значение свойства равно _возвращаемому_ значению, а не значению, установленному в функции конструктора. Мы возвращаем строку `"Maserati"`, поэтому `myCar.make` равно `"Maserati"`.
1614
+
1615
+
</p>
1616
+
</details>
1617
+
1618
+
---
1619
+
1620
+
###### 54. Каким будет результат?
1621
+
1622
+
```javascript
1623
+
(() => {
1624
+
let x = (y =10);
1625
+
})();
1626
+
1627
+
console.log(typeof x);
1628
+
console.log(typeof y);
1629
+
```
1630
+
1631
+
- A: `"undefined", "number"`
1632
+
- B: `"number", "number"`
1633
+
- C: `"object", "number"`
1634
+
- D: `"number", "undefined"`
1635
+
1636
+
<details><summary><b>Ответ</b></summary>
1637
+
<p>
1638
+
1639
+
#### Ответ: A
1640
+
1641
+
`let x = y = 10;` на самом деле является сокращением для:
1642
+
1643
+
```javascript
1644
+
y =10;
1645
+
let x = y;
1646
+
```
1647
+
1648
+
Когда мы устанавливаем `y` равным` 10`, мы фактически добавляем свойство `y` к глобальному объекту (`window` в браузере, `global` в Node). В браузере `window.y` теперь равен` 10`.
1649
+
1650
+
Затем мы объявляем переменную `x` со значением` y`, которое равно `10`. Переменные, объявленные с ключевым словом `let`, имею _блочную видимость_, они определены только в блоке, в котором они объявлены; немедленно вызванная функция (IIFE) в этом случае. Когда мы используем оператор `typeof`, операнд` x` не определен: мы пытаемся получить доступ к `x` вне блока, в котором он объявлен. Это означает, что` x` не определен. Значения, которым не присвоено или не объявлено значение, имеют тип `"undefined"`. `console.log(typeof x)` возвращает `"undefined"`.
1651
+
1652
+
Однако мы создали глобальную переменную `y`, установив `y` равным `10`. Это значение доступно в любом месте нашего кода. `y` определен и содержит значение типа `"number"`. `console.log(typeof y)` возвращает `"number"`.
0 commit comments