Skip to content

Commit 8c9bc00

Browse files
authored
Merge pull request lydiahallie#109 from yavorskiydima/master
[Russian] Translation 44-54 questions
2 parents 97a199f + b82ac5b commit 8c9bc00

File tree

1 file changed

+358
-0
lines changed

1 file changed

+358
-0
lines changed

README_ru-RU.md

+358
Original file line numberDiff line numberDiff line change
@@ -1295,3 +1295,361 @@ setInterval(() => console.log("Hi"), 1000);
12951295

12961296
</p>
12971297
</details>
1298+
1299+
---
1300+
1301+
###### 44. Каким будет результат?
1302+
1303+
```javascript
1304+
function* generator(i) {
1305+
yield i;
1306+
yield i * 2;
1307+
}
1308+
1309+
const gen = generator(10);
1310+
1311+
console.log(gen.next().value);
1312+
console.log(gen.next().value);
1313+
```
1314+
1315+
- A: `[0, 10], [10, 20]`
1316+
- B: `20, 20`
1317+
- C: `10, 20`
1318+
- D: `0, 10 and 10, 20`
1319+
1320+
<details><summary><b>Ответ</b></summary>
1321+
<p>
1322+
1323+
#### Ответ: C
1324+
1325+
Обычные функции не могут быть остановлены на полпути после вызова. Однако функцию генератор можно "остановить" на полпути, а затем продолжить с того места, где она остановилась. Каждый раз, когда в функции-генераторе встречает ключевое слово `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.
1330+
1331+
</p>
1332+
</details>
1333+
1334+
---
1335+
1336+
###### 45. Каким будет результат?
1337+
1338+
```javascript
1339+
const firstPromise = new Promise((res, rej) => {
1340+
setTimeout(res, 500, "один");
1341+
});
1342+
1343+
const secondPromise = new Promise((res, rej) => {
1344+
setTimeout(res, 100, "два");
1345+
});
1346+
1347+
Promise.race([firstPromise, secondPromise]).then(res => console.log(res));
1348+
```
1349+
1350+
- A: `"один"`
1351+
- B: `"два"`
1352+
- C: `"два" "один"`
1353+
- D: `"один" "два"`
1354+
1355+
<details><summary><b>Ответ</b></summary>
1356+
<p>
1357+
1358+
#### Ответ: B
1359+
1360+
Когда мы передаем несколько промисов методу `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+
const members = [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`.
1388+
1389+
<img src="https://i.imgur.com/TML1MbS.png" width="200">
1390+
1391+
Затем мы объявляем переменную с именем `members`. Мы устанавливаем первый элемент этого массива равным значению переменной `person`. Объекты взаимодействуют посредством _ссылок_ при установке их равными друг другу. Когда вы назначаете ссылку из одной переменной в другую, вы создаете _копию_ этой ссылки. (обратите внимание, что у них _не одинаковые_ ссылки!)
1392+
1393+
<img src="https://i.imgur.com/FSG5K3F.png" width="300">
1394+
1395+
Затем мы присваиваем переменной `person` значение `null`.
1396+
1397+
<img src="https://i.imgur.com/sYjcsMT.png" width="300">
1398+
1399+
Мы изменили только значение переменной `person`, а не первый элемент в массиве, поскольку этот элемент имеет другую (скопированную) ссылку на объект. Первый элемент в `members` по-прежнему содержит ссылку на исходный объект. Когда мы выводим в консоль массив `members`, первый элемент по-прежнему содержит значение объекта, который выводится в консоль.
1400+
1401+
</p>
1402+
</details>
1403+
1404+
---
1405+
1406+
###### 47. Каким будет результат?
1407+
1408+
```javascript
1409+
const person = {
1410+
name: "Lydia",
1411+
age: 21
1412+
};
1413+
1414+
for (const item in 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+
const num = 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+
function getInfo(member, year) {
1520+
member.name = "Lydia";
1521+
year = 1998;
1522+
}
1523+
1524+
const person = { name: "Sarah" };
1525+
const birthYear = "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+
function greeting() {
1557+
throw "Hello world!";
1558+
}
1559+
1560+
function sayHi() {
1561+
try {
1562+
const data = 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+
function Car() {
1595+
this.make = "Lamborghini";
1596+
return { make: "Maserati" };
1597+
}
1598+
1599+
const myCar = new Car();
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"`.
1653+
1654+
</p>
1655+
</details>

0 commit comments

Comments
 (0)