Skip to content

Commit 8d5ac18

Browse files
committed
* 'master' of https://github.com/lydiahallie/javascript-questions: Update README.md Update README.md Fix question 3 Fix question 10 Fix question 51 Add questions 55 to 63 Fixes answer of question 52 and adds missing quotes Updated syntax highlighting in first response. UA add new questions no.44 ~ no.54 & translate to japanese translate and change content vietnamese fix typo ru translate 50-54 ru translate 44-50 question
2 parents 3d98f9f + 67405aa commit 8d5ac18

File tree

6 files changed

+1051
-16
lines changed

6 files changed

+1051
-16
lines changed

README-de_DE.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,9 +1570,9 @@ sayHi();
15701570
```
15711571

15721572
- A: `"It worked! Hello world!"`
1573-
- B: `"Oh no an error: undefined`
1573+
- B: `"Oh no an error: undefined"`
15741574
- C: `SyntaxError: can only throw Error objects`
1575-
- D: `"Oh no an error: Hello world!`
1575+
- D: `"Oh no an error! Hello world!"`
15761576

15771577
<details><summary><b>Antwort</b></summary>
15781578
<p>

README-ja_JA.md

Lines changed: 378 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,3 +1333,381 @@ setInterval(() => console.log("Hi"), 1000);
13331333

13341334
</p>
13351335
</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

Comments
 (0)