Skip to content

Commit 6118d05

Browse files
committed
ru translate 44-50 question
1 parent 752029a commit 6118d05

File tree

1 file changed

+360
-0
lines changed

1 file changed

+360
-0
lines changed

README_ru-RU.md

Lines changed: 360 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,3 +1295,363 @@ 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+
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+
const num = 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+
function getInfo(member, year) {
1522+
member.name = "Lydia";
1523+
year = 1998;
1524+
}
1525+
1526+
const person = { name: "Sarah" };
1527+
const birthYear = "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+
function greeting() {
1559+
throw "Hello world!";
1560+
}
1561+
1562+
function sayHi() {
1563+
try {
1564+
const data = 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+
function Car() {
1597+
this.make = "Lamborghini";
1598+
return { make: "Maserati" };
1599+
}
1600+
1601+
const myCar = new Car();
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"`.
1655+
1656+
</p>
1657+
</details>

0 commit comments

Comments
 (0)