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
+
Operator associativity is the order in which the compiler evaluates the expressions, either left-to-right or right-to-left. This only happens if all operators have the _same_ precedence. We only have one type of operator: `+`. For addition, the associativity is left-to-right.
1453
+
1454
+
Ассоциативность операторов - это порядок, в котором компилятор оценивает выражения, слева направо или справа налево. Это происходит только в том случае, если все операторы имеют _одинаковый_ приоритет. У нас есть только один тип оператора: `+`. Кроме того, ассоциативность слева направо.
1455
+
1456
+
`3 + 4` оценивается первым. Это приводит к числу `7`.
1457
+
1458
+
`7 + '5'` приводит к `"75"` из-за принуждения. JavaScript преобразует число `7` в строку, см. вопрос 15. Мы можем объединить две строки, используя оператор `+`. `"7" + "5"` приводит к `"75"`.
1459
+
1460
+
</p>
1461
+
</details>
1462
+
1463
+
---
1464
+
1465
+
###### 49. Какое значение `num`?
1466
+
1467
+
```javascript
1468
+
constnum=parseInt("7*6", 10);
1469
+
```
1470
+
1471
+
- A: `42`
1472
+
- B: `"42"`
1473
+
- C: `7`
1474
+
- D: `NaN`
1475
+
1476
+
<details><summary><b>Ответ</b></summary>
1477
+
<p>
1478
+
1479
+
#### Ответ: C
1480
+
1481
+
Только первые числа в строке возвращаются. На основе _системы счисления_ (второй аргумент, чтобы указать, к какому типу чисел мы хотим его анализировать: основание 10, шестнадцатеричное, восьмеричное, двоичное и т.д.), `ParseInt` проверяет, являются ли символы в строке допустимыми. Как только он встречает символ, который не является допустимым числом в основании, он прекращает синтаксический анализ и игнорирует следующие символы.
1482
+
1483
+
`*` не является допустимым числом. Он только разбирает `"7"` в десятичную `7`. `num` теперь содержит значение` 7`.
1484
+
1485
+
</p>
1486
+
</details>
1487
+
1488
+
---
1489
+
1490
+
###### 50. Каким будет результат?
1491
+
1492
+
```javascript
1493
+
[1, 2, 3].map(num=> {
1494
+
if (typeof num ==="number") return;
1495
+
return num *2;
1496
+
});
1497
+
```
1498
+
1499
+
- A: `[]`
1500
+
- B: `[null, null, null]`
1501
+
- C: `[undefined, undefined, undefined]`
1502
+
- D: `[ 3 x empty ]`
1503
+
1504
+
<details><summary><b>Ответ</b></summary>
1505
+
<p>
1506
+
1507
+
#### Ответ: C
1508
+
1509
+
При использовании метода map, значение `num` равно элементу, над которым он в данный момент зацикливается. В этом случае элементы являются числами, поэтому условие оператора if `typeof num === "number"` возвращает `true`. Функция map создает новый массив и вставляет значения, возвращаемые функцией.
1510
+
1511
+
Однако мы не возвращаем значение. Когда мы не возвращаем значение из функции, функция возвращает значение `undefined`. Для каждого элемента в массиве вызывается функциональный блок, поэтому для каждого элемента мы возвращаем "undefined".
1512
+
1513
+
</p>
1514
+
</details>
1515
+
1516
+
---
1517
+
1518
+
###### 51. What's the output?
1519
+
1520
+
```javascript
1521
+
functiongetInfo(member, year) {
1522
+
member.name="Lydia";
1523
+
year =1998;
1524
+
}
1525
+
1526
+
constperson= { name:"Sarah" };
1527
+
constbirthYear="1997";
1528
+
1529
+
getInfo(person, birthYear);
1530
+
1531
+
console.log(person, birthYear);
1532
+
```
1533
+
1534
+
- A: `{ name: "Lydia" }, "1997"`
1535
+
- B: `{ name: "Sarah" }, "1998"`
1536
+
- C: `{ name: "Lydia" }, "1998"`
1537
+
- D: `{ name: "Sarah" }, "1997"`
1538
+
1539
+
<details><summary><b>Answer</b></summary>
1540
+
<p>
1541
+
1542
+
#### Answer: A
1543
+
1544
+
Arguments are passed by _value_, unless their value is an object, then they're passed by _reference_. `birthYear` is passed by value, since it's a string, not an object. When we pass arguments by value, a _copy_ of that value is created (see question 46).
1545
+
1546
+
The variable `birthYear` has a reference to the value `"1997"`. The argument `year` also has a reference to the value `"1997"`, but it's not the same value as `birthYear` has a reference to. When we update the value of `year` by setting `year` equal to `"1998"`, we are only updating the value of `year`. `birthYear` is still equal to `"1997"`.
1547
+
1548
+
The value of `person` is an object. The argument `member` has a (copied) reference to the _same_ object. When we modify a property of the object `member` has a reference to, the value of `person` will also be modified, since they both have a reference to the same object. `person`'s `name` property is now equal to the value `"Lydia"`
1549
+
1550
+
</p>
1551
+
</details>
1552
+
1553
+
---
1554
+
1555
+
###### 52. What's the output?
1556
+
1557
+
```javascript
1558
+
functiongreeting() {
1559
+
throw"Hello world!";
1560
+
}
1561
+
1562
+
functionsayHi() {
1563
+
try {
1564
+
constdata=greeting();
1565
+
console.log("It worked!", data);
1566
+
} catch (e) {
1567
+
console.log("Oh no an error!", e);
1568
+
}
1569
+
}
1570
+
1571
+
sayHi();
1572
+
```
1573
+
1574
+
- A: `"It worked! Hello world!"`
1575
+
- B: `"Oh no an error: undefined`
1576
+
- C: `SyntaxError: can only throw Error objects`
1577
+
- D: `"Oh no an error: Hello world!`
1578
+
1579
+
<details><summary><b>Answer</b></summary>
1580
+
<p>
1581
+
1582
+
#### Answer: D
1583
+
1584
+
With the `throw` statement, we can create custom errors. With this statement, you can throw exceptions. An exception can be a <b>string</b>, a <b>number</b>, a <b>boolean</b> or an <b>object</b>. In this case, our exception is the string `'Hello world'`.
1585
+
1586
+
With the `catch` statement, we can specify what to do if an exception is thrown in the `try` block. An exception is thrown: the string `'Hello world'`. `e` is now equal to that string, which we log. This results in `'Oh an error: Hello world'`.
1587
+
1588
+
</p>
1589
+
</details>
1590
+
1591
+
---
1592
+
1593
+
###### 53. What's the output?
1594
+
1595
+
```javascript
1596
+
functionCar() {
1597
+
this.make="Lamborghini";
1598
+
return { make:"Maserati" };
1599
+
}
1600
+
1601
+
constmyCar=newCar();
1602
+
console.log(myCar.make);
1603
+
```
1604
+
1605
+
- A: `"Lamborghini"`
1606
+
- B: `"Maserati"`
1607
+
- C: `ReferenceError`
1608
+
- D: `TypeError`
1609
+
1610
+
<details><summary><b>Answer</b></summary>
1611
+
<p>
1612
+
1613
+
#### Answer: B
1614
+
1615
+
When you return a property, the value of the property is equal to the _returned_ value, not the value set in the constructor function. We return the string `"Maserati"`, so `myCar.make` is equal to `"Maserati"`.
1616
+
1617
+
</p>
1618
+
</details>
1619
+
1620
+
---
1621
+
1622
+
###### 54. What's the output?
1623
+
1624
+
```javascript
1625
+
(() => {
1626
+
let x = (y =10);
1627
+
})();
1628
+
1629
+
console.log(typeof x);
1630
+
console.log(typeof y);
1631
+
```
1632
+
1633
+
- A: `"undefined", "number"`
1634
+
- B: `"number", "number"`
1635
+
- C: `"object", "number"`
1636
+
- D: `"number", "undefined"`
1637
+
1638
+
<details><summary><b>Answer</b></summary>
1639
+
<p>
1640
+
1641
+
#### Answer: A
1642
+
1643
+
`let x = y = 10;` is actually shorthand for:
1644
+
1645
+
```javascript
1646
+
y =10;
1647
+
let x = y;
1648
+
```
1649
+
1650
+
When we set `y` equal to `10`, we actually add a property `y` to the global object (`window` in browser, `global` in Node). In a browser, `window.y` is now equal to `10`.
1651
+
1652
+
Then, we declare a variable `x` with the value of `y`, which is `10`. Variables declared with the `let` keyword are _block scoped_, they are only defined within the block they're declared in; the immediately-invoked function (IIFE) in this case. When we use the `typeof` operator, the operand `x` is not defined: we are trying to access `x` outside of the block it's declared in. This means that `x` is not defined. Values who haven't been assigned a value or declared are of type `"undefined"`. `console.log(typeof x)` returns `"undefined"`.
1653
+
1654
+
However, we created a global variable `y` when setting `y` equal to `10`. This value is accessible anywhere in our code. `y` is defined, and holds a value of type `"number"`. `console.log(typeof y)` returns `"number"`.
0 commit comments