Skip to content

Commit 07944be

Browse files
author
Uyen Nguyen
committed
translate to Vietnamese 147 - 155
1 parent ab38824 commit 07944be

File tree

1 file changed

+306
-1
lines changed

1 file changed

+306
-1
lines changed

vi-VI/README-vi.md

Lines changed: 306 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4754,7 +4754,7 @@ getFruit([['🍍'], ['🍊', '🍌']])
47544754
- C: `[]`, `[]`, 🍌
47554755
- D: `undefined`, `undefined`, 🍌
47564756
4757-
<details><summary><b>Answer</b></summary>
4757+
<details><summary><b>Đáp án</b></summary>
47584758
<p>
47594759
47604760
#### Đáp án: D
@@ -4771,3 +4771,308 @@ Cuối cùng, ta thử in ra phần tử thứ hai trong mảng con `['🍊', '
47714771
</details>
47724772
47734773
---
4774+
4775+
###### 147. Output là gì?
4776+
4777+
```javascript
4778+
class Calc {
4779+
constructor() {
4780+
this.count = 0
4781+
}
4782+
4783+
increase() {
4784+
this.count ++
4785+
}
4786+
}
4787+
4788+
const calc = new Calc()
4789+
new Calc().increase()
4790+
4791+
console.log(calc.count)
4792+
```
4793+
4794+
- A: `0`
4795+
- B: `1`
4796+
- C: `undefined`
4797+
- D: `ReferenceError`
4798+
4799+
<details><summary><b>Đáp án</b></summary>
4800+
<p>
4801+
4802+
#### Đáp án: A
4803+
4804+
Ta set biến `calc` bằng một instance mới của `Calc` class. Sau đó ta tạo ra instance mới của `Calc` và gọi `increase` hàm trên instance đó. Vì thuộc tính count nằm trong constructor của `Calc` class, thuộc tính count không được sử dụng trên prototype của `Calc`. Điều này nghĩa là giá trị của count chưa được thay đổi cho instance mà calc trỏ vào, giá trị của count vẫn là `0`.
4805+
4806+
</p>
4807+
</details>
4808+
4809+
---
4810+
4811+
###### 148. Output là gi?
4812+
4813+
```javascript
4814+
const user = {
4815+
4816+
password: "12345"
4817+
}
4818+
4819+
const updateUser = ({ email, password }) => {
4820+
if (email) {
4821+
Object.assign(user, { email })
4822+
}
4823+
4824+
if (password) {
4825+
user.password = password
4826+
}
4827+
4828+
return user
4829+
}
4830+
4831+
const updatedUser = updateUser({ email: "[email protected]" })
4832+
4833+
console.log(updatedUser === user)
4834+
```
4835+
4836+
- A: `false`
4837+
- B: `true`
4838+
- C: `TypeError`
4839+
- D: `ReferenceError`
4840+
4841+
<details><summary><b>Đáp án</b></summary>
4842+
<p>
4843+
4844+
#### Đáp án: B
4845+
4846+
Hàm `updateUser` thay đổi các giá trị của thuộc tính `email``password` của user, nếu các giá trị của chúng được truyền vào hàm sau và sau đó hàm trả về `user` object. Giá trị trả về của hàm `updateUser``user` object, tức là giá trị của updateUser là trỏ đến cùng một `user` object mà `user` trỏ vào. `updatedUser === user` bằng `true`.
4847+
4848+
</p>
4849+
</details>
4850+
4851+
---
4852+
4853+
###### 149. Output là gi?
4854+
4855+
```javascript
4856+
const fruit = ['🍌', '🍊', '🍎']
4857+
4858+
fruit.slice(0, 1)
4859+
fruit.splice(0, 1)
4860+
fruit.unshift('🍇')
4861+
4862+
console.log(fruit)
4863+
```
4864+
4865+
- A: `['🍌', '🍊', '🍎']`
4866+
- B: `['🍊', '🍎']`
4867+
- C: `['🍇', '🍊', '🍎']`
4868+
- D: `['🍇', '🍌', '🍊', '🍎']`
4869+
4870+
<details><summary><b>Đáp án</b></summary>
4871+
<p>
4872+
4873+
#### Đáp án: C
4874+
4875+
Trước tiên, ta gọi hàm `slice` trên mảng fruit. Hàm slice không thay đổi mảng ban đầu nhưng sẽ trả về giá trị mà nó cắt từ mảng đó: banana emoji. Sau đó ta gọi hàm `splice` trên mảng fruit. Hàm splice sẽ thay đổi mảng ban đầu, nghĩa là mảng fruit bây giờ sẽ bao gồm `['🍊', '🍎']`. Cuối cùng, ta gọi mảng `unshift` trên mảng `fruit` để thay đổi mảng ban đầu bằng cách cộng thêm giá trị được đưa ra, trong trường hợp này là ‘🍇’, phần tử đầu tiên của mảng. Mảng fruit bây giờ bao gồm ['🍇', '🍊', '🍎']`.
4876+
4877+
</p>
4878+
</details>
4879+
4880+
---
4881+
4882+
###### 150. Output là gì?
4883+
4884+
```javascript
4885+
const animals = {};
4886+
let dog = { emoji: '🐶' }
4887+
let cat = { emoji: '🐈' }
4888+
4889+
animals[dog] = { ...dog, name: "Mara" }
4890+
animals[cat] = { ...cat, name: "Sara" }
4891+
4892+
console.log(animals[dog])
4893+
```
4894+
4895+
- A: `{ emoji: "🐶", name: "Mara" }`
4896+
- B: `{ emoji: "🐈", name: "Sara" }`
4897+
- C: `undefined`
4898+
- D: `ReferenceError`
4899+
4900+
<details><summary><b>Đáp án</b></summary>
4901+
<p>
4902+
4903+
#### Đáp án: B
4904+
4905+
Các keys của object được chuyển thành các chuỗi.
4906+
4907+
Do giá trị của `dog` là một object, `animals[dog]` thực sự nghĩa là ta tạo ra một thuộc tính mới gọi là `"object Object"` bằng với object mới. `animals["object Object"]` lúc này bằng với `{ emoji: "🐶", name: "Mara"}`.
4908+
4909+
`cat` cũng là một object, nên `animals[cat]` thực sự nghĩa là ta thay đổi giá trị của `animals[``"``object Object``"``]` bằng thuộc tính cat mới.
4910+
4911+
Khi in ra `animals[dog]`, hoặc thực chất là `animals["object Object"]` vì thay `dog` object bằng một chuỗi thì nó trả về `"object Object"`, ta nhận được `{ emoji: "🐈", name: "Sara" }`.
4912+
4913+
</p>
4914+
</details>
4915+
4916+
---
4917+
4918+
###### 151. Output là gì?
4919+
4920+
```javascript
4921+
const user = {
4922+
4923+
updateEmail: email => {
4924+
this.email = email
4925+
}
4926+
}
4927+
4928+
user.updateEmail("[email protected]")
4929+
console.log(user.email)
4930+
```
4931+
4932+
4933+
4934+
- C: `undefined`
4935+
- D: `ReferenceError`
4936+
4937+
<details><summary><b>Đáp án</b></summary>
4938+
<p>
4939+
4940+
#### Đáp án: A
4941+
4942+
Hàm `updateEmail` là một cú pháp arrow function và nó không gắn với `user` object. Điều này cho thấy từ khoá `this` không trỏ tới `user` object mà trỏ tới global scope. Giá trị của `email` trong `user` object không thay đổi. Khi ta in ra giá trị của `user.email`, nó trả về giá trị ban đầu của `[email protected]`.
4943+
4944+
</p>
4945+
</details>
4946+
4947+
---
4948+
4949+
###### 152. Output là gì?
4950+
4951+
```javascript
4952+
const promise1 = Promise.resolve('First')
4953+
const promise2 = Promise.resolve('Second')
4954+
const promise3 = Promise.reject('Third')
4955+
const promise4 = Promise.resolve('Fourth')
4956+
4957+
const runPromises = async () => {
4958+
const res1 = await Promise.all([promise1, promise2])
4959+
const res2 = await Promise.all([promise3, promise4])
4960+
return [res1, res2]
4961+
}
4962+
4963+
runPromises()
4964+
.then(res => console.log(res))
4965+
.catch(err => console.log(err))
4966+
```
4967+
4968+
- A: `[['First', 'Second'], ['Fourth']]`
4969+
- B: `[['First', 'Second'], ['Third', 'Fourth']]`
4970+
- C: `[['First', 'Second']]`
4971+
- D: `'Third'`
4972+
4973+
<details><summary><b>Đáp án</b></summary>
4974+
<p>
4975+
4976+
#### Đáp án: D
4977+
4978+
Hàm `Promise.all` trả về những promise truyền vào song song nhau. Nếu một promise thất bại, hàm `Promise.all` _rejects_ với giá trị của promise đó. Trong trường hợp này, `promise3` bị reject với giá trị `"Third"`. Ta đang kiểm tra giá trị bị reject trong chuỗi hàm `catch` khi goi hàm `runPromises` để tìm ra lỗi trong hàm `runPromises`. Chỉ có `"Third"` được trả về vì `promise3` reject giá trị này.
4979+
4980+
</p>
4981+
</details>
4982+
4983+
---
4984+
4985+
###### 153. Giá trị nào của `method` sẽ được trả về với log `{ name: "Lydia", age: 22 }`?
4986+
4987+
```javascript
4988+
const keys = ["name", "age"]
4989+
const values = ["Lydia", 22]
4990+
4991+
const method = /* ?? */
4992+
Object[method](keys.map((_, i) => {
4993+
return [keys[i], values[i]]
4994+
})) // { name: "Lydia", age: 22 }
4995+
```
4996+
4997+
- A: `entries`
4998+
- B: `values`
4999+
- C: `fromEntries`
5000+
- D: `forEach`
5001+
5002+
<details><summary><b>Đáp án</b></summary>
5003+
<p>
5004+
5005+
#### Đáp án: C
5006+
5007+
Hàm `fromEntries` trả về một mảng 2d trong một object. Phần tử đầu tiên trong từng mảng con sẽ là từ khoá và phần tử thứ hai trong từng mảng con sẽ là giá trị. Trong trường hợp này, ta tiến hành map qua mảng `keys`, nó sẽ trả về một mảng mà phần tử đầu tiên của mảng đó là phần tử trên thứ tự hiện tại của mảng key, và phần tử thứ hai của mảng đó là phần tử trên thứ tự hiện tại của mảng values.
5008+
5009+
Theo như trên thì ta tạo ra một mảng gồm những mảng con chứa đựng những từ khoá và giá trị đúng, và nó trả về `{ name: "Lydia", age: 22 }`.
5010+
5011+
</p>
5012+
</details>
5013+
5014+
---
5015+
5016+
###### 154. Output là gì?
5017+
5018+
```javascript
5019+
const createMember = ({ email, address = {}}) => {
5020+
const validEmail = /.+\@.+\..+/.test(email)
5021+
if (!validEmail) throw new Error("Valid email pls")
5022+
5023+
return {
5024+
email,
5025+
address: address ? address : null
5026+
}
5027+
}
5028+
5029+
const member = createMember({ email: "[email protected]" })
5030+
console.log(member)
5031+
```
5032+
5033+
- A: `{ email: "[email protected]", address: null }`
5034+
- B: `{ email: "[email protected]" }`
5035+
- C: `{ email: "[email protected]", address: {} }`
5036+
- D: `{ email: "[email protected]", address: undefined }`
5037+
5038+
<details><summary><b>Đáp án</b></summary>
5039+
<p>
5040+
5041+
#### Đáp án: C
5042+
5043+
Giá trị mặc định của `address` là một object rỗng `{}`. Khi ta cho biến `member` bằng với object được trả về bởi hàm `createMember`, ta đã không truyền vào một giá trị của address, nghĩa là giá trị của address là object rỗng `{}` được mặc định. Object rỗng mang giá trị truthy, tức là điều kiện `address ? address : null` trả về `true`. Giá trị của address là một object rỗng `{}`.
5044+
5045+
</p>
5046+
</details>
5047+
5048+
---
5049+
5050+
###### 155. Output là gì?
5051+
5052+
```javascript
5053+
let randomValue = { name: "Lydia" }
5054+
randomValue = 23
5055+
5056+
if (!typeof randomValue === "string") {
5057+
console.log("It's not a string!")
5058+
} else {
5059+
console.log("Yay it's a string!")
5060+
}
5061+
```
5062+
5063+
- A: `It's not a string!`
5064+
- B: `Yay it's a string!`
5065+
- C: `TypeError`
5066+
- D: `undefined`
5067+
5068+
<details><summary><b>Đáp án</b></summary>
5069+
<p>
5070+
5071+
#### Đáp án: B
5072+
5073+
Điều kiện trong mệnh đề `if` kiểm tra xem giá trị của `!typeof randomValue` bằng với `"string"` hay không. Phép toán `!` chuyển giá trị đó thành giá trị boolean. Nếu giá trị là truthy, giá trị trả về sẽ là `false`, nếu giá trị là falsy, giá trị trả về sẽ là `true`. Trong trường hợp này, giá trị trả về của `typeof randomValue` là giá trị truthy `"number"`, nghĩa là giá trị của `!typeof randomValue` là một giá trị boolean `false`.
5074+
5075+
`!typeof randomValue === "string"` luôn trả về false, vì ta thực sự đang kiểm tra `false === "string"`. Vì điều kiện đã trả về `false`, code của mệnh đề `else` sẽ chạy và `Yay it's a string!` được in ra.
5076+
5077+
</p>
5078+
</details>

0 commit comments

Comments
 (0)