Skip to content

Commit c265204

Browse files
committed
update zh-CN: translate question 102-111
1 parent 13b4209 commit c265204

File tree

1 file changed

+342
-0
lines changed

1 file changed

+342
-0
lines changed

zh-CN/README-zh_CN.md

Lines changed: 342 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3225,3 +3225,345 @@ console.log(one, two, three)
32253225

32263226
</p>
32273227
</details>
3228+
3229+
---
3230+
3231+
###### 102. 依次输出什么?
3232+
3233+
```javascript
3234+
const myPromise = () => Promise.resolve('I have resolved!')
3235+
3236+
function firstFunction() {
3237+
myPromise().then(res => console.log(res))
3238+
console.log('second')
3239+
}
3240+
3241+
async function secondFunction() {
3242+
console.log(await myPromise())
3243+
console.log('second')
3244+
}
3245+
3246+
firstFunction()
3247+
secondFunction()
3248+
```
3249+
3250+
- A: `I have resolved!`, `second` and `I have resolved!`, `second`
3251+
- B: `second`, `I have resolved!` and `second`, `I have resolved!`
3252+
- C: `I have resolved!`, `second` and `second`, `I have resolved!`
3253+
- D: `second`, `I have resolved!` and `I have resolved!`, `second`
3254+
3255+
<details><summary><b>答案</b></summary>
3256+
<p>
3257+
3258+
#### 答案: D
3259+
3260+
有了promise,我们通常会说:当我想要调用某个方法,但是由于它可能需要一段时间,因此暂时将它放在一边。只有当某个值被resolved/rejected,并且执行栈为空时才使用这个值。
3261+
3262+
我们可以在`async`函数中通过`.then``await`关键字获得该值。 尽管我们可以通过`.then``await`获得promise的价值,但是它们的工作方式有所不同。
3263+
3264+
`firstFunction`中,当运行到`myPromise`方法时我们将其放在一边,即promise进入微任务队列,其他后面的代码(`console.log('second')`)照常运行,因此`second`被打印出,`firstFunction`方法到此执行完毕,执行栈中宏任务队列被清空,此时开始执行微任务队列中的任务,`I have resolved`被打印出。
3265+
3266+
`secondFunction`方法中,我们通过`await`关键字,暂停了后面代码的执行,直到异步函数的值被解析才开始后面代码的执行。这意味着,它会等着直到 `myPromise` 以值`I have resolved`被解决之后,下一行`second`才开始执行。
3267+
3268+
</p>
3269+
</details>
3270+
3271+
---
3272+
3273+
###### 103. 输出什么?
3274+
3275+
```javascript
3276+
const set = new Set()
3277+
3278+
set.add(1)
3279+
set.add("Lydia")
3280+
set.add({ name: "Lydia" })
3281+
3282+
for (let item of set) {
3283+
console.log(item + 2)
3284+
}
3285+
```
3286+
3287+
- A: `3`, `NaN`, `NaN`
3288+
- B: `3`, `7`, `NaN`
3289+
- C: `3`, `Lydia2`, `[Object object]2`
3290+
- D: `"12"`, `Lydia2`, `[Object object]2`
3291+
3292+
<details><summary><b>答案</b></summary>
3293+
<p>
3294+
3295+
#### 答案: C
3296+
3297+
`“+”`运算符不仅用于数值相加,还可以使用它来连接字符串。 每当JavaScript引擎发现一个或多个值不是数字时,就会将数字强制转化为字符串。
3298+
3299+
第一个是数字`1`, 1 + 2返回数字3。
3300+
3301+
但是,第二个是字符串`Lydia``Lydia`是字符串,`2`是数字:`2`被强制转换为字符串。 `Lydia``2`被连接起来,产生字符`Lydia2`
3302+
3303+
`{name:“Lydia”}`是一个对象。 数字和对象都不是字符串,因此将二者都字符串化。 每当我们对常规对象进行字符串化时,它就会变成`“[Object object]”`
3304+
3305+
</p>
3306+
</details>
3307+
3308+
---
3309+
3310+
###### 104. 结果是什么?
3311+
3312+
```javascript
3313+
Promise.resolve(5)
3314+
```
3315+
3316+
- A: `5`
3317+
- B: `Promise {<pending>: 5}`
3318+
- C: `Promise {<resolved>: 5}`
3319+
- D: `Error`
3320+
3321+
<details><summary><b>答案</b></summary>
3322+
<p>
3323+
3324+
#### 答案: C
3325+
3326+
我们可以将我们想要的任何类型的值传递`Promise.resolve`,无论是否`promise`。 该方法本身返回带有已解析值的`Promise`。 如果您传递常规函数,它将是具有常规值的已解决`promise`。 如果你通过了promise,它将是一个已经resolved的且带有传的值的promise。
3327+
3328+
上述情况,我们传了数字5,因此返回一个resolved状态的promise,resolve值为`5`
3329+
3330+
</p>
3331+
</details>
3332+
3333+
---
3334+
3335+
###### 105. 输出什么?
3336+
3337+
```javascript
3338+
function compareMembers(person1, person2 = person) {
3339+
if (person1 !== person2) {
3340+
console.log("Not the same!")
3341+
} else {
3342+
console.log("They are the same!")
3343+
}
3344+
}
3345+
3346+
const person = { name: "Lydia" }
3347+
3348+
compareMembers(person)
3349+
```
3350+
3351+
- A: `Not the same!`
3352+
- B: `They are the same!`
3353+
- C: `ReferenceError`
3354+
- D: `SyntaxError`
3355+
3356+
<details><summary><b>答案</b></summary>
3357+
<p>
3358+
3359+
#### 答案: B
3360+
3361+
对象通过引用传递。 当我们检查对象的严格相等性(===)时,我们正在比较它们的引用。
3362+
3363+
我们将`person2`的默认值设置为等于`person`对象,并将`person`对象作为`person1`的值传递。
3364+
3365+
这意味着两个值都引用内存中的同一位置,因此它们是相等的。
3366+
3367+
</p>
3368+
</details>
3369+
3370+
---
3371+
3372+
###### 106. 输出什么?
3373+
3374+
```javascript
3375+
const colorConfig = {
3376+
red: true,
3377+
blue: false,
3378+
green: true,
3379+
black: true,
3380+
yellow: false,
3381+
}
3382+
3383+
const colors = ["pink", "red", "blue"]
3384+
3385+
console.log(colorConfig.colors[1])
3386+
```
3387+
3388+
- A: `true`
3389+
- B: `false`
3390+
- C: `undefined`
3391+
- D: `TypeError`
3392+
3393+
<details><summary><b>答案</b></summary>
3394+
<p>
3395+
3396+
#### 答案: D
3397+
3398+
在JavaScript中,我们有两种访问对象属性的方法:括号表示法或点表示法。在此示例中,我们使用点表示法(`colorConfig.colors`)代替括号表示法(`colorConfig ['colors']`)。
3399+
3400+
使用点表示法,JavaScript会尝试使用该确切名称在对象上查找属性。在此示例中,JavaScript尝试在`colorconfig`对象上找到名为`'colors'`的属性。没有`'colors'`的属性,因此返回`undefined`。然后,我们尝试使用`[1]`访问第一个元素的值。我们无法对`undefined`执行此操作,因此会抛出`TypeError`: `Cannot read property '1' of undefined`
3401+
3402+
当我们使用方括号表示法时,JavaScript会看到第一个左方括号`[`,并且一直走到找到右方括号`]`。只有这样,它才会解析该语句。如果我们使用了`colorConfig[colors[1]]`,它将返回`colorConfig`对象上`red`属性的值。
3403+
3404+
</p>
3405+
</details>
3406+
3407+
---
3408+
3409+
###### 107. 输出什么?
3410+
3411+
```javascript
3412+
console.log('❤️' === '❤️')
3413+
```
3414+
3415+
- A: `true`
3416+
- B: `false`
3417+
3418+
<details><summary><b>答案</b></summary>
3419+
<p>
3420+
3421+
#### 答案: A
3422+
3423+
在内部,表情符号是unicode。 心表情符号的unicode是`U+2764 U+FE0F`。 对于相同的表情符号,它们总是相同的,因此我们正在将两个相等的字符串相互比较,这将返回true。
3424+
3425+
</p>
3426+
</details>
3427+
3428+
---
3429+
3430+
###### 108. 哪些方法修改了原数组?
3431+
3432+
```javascript
3433+
const emojis = ['', '🥑', '😍']
3434+
3435+
emojis.map(x => x + '')
3436+
emojis.filter(x => x !== '🥑')
3437+
emojis.find(x => x !== '🥑')
3438+
emojis.reduce((acc, cur) => acc + '')
3439+
emojis.slice(1, 2, '')
3440+
emojis.splice(1, 2, '')
3441+
```
3442+
3443+
- A: `All of them`
3444+
- B: `map` `reduce` `slice` `splice`
3445+
- C: `map` `slice` `splice`
3446+
- D: `splice`
3447+
3448+
<details><summary><b>答案</b></summary>
3449+
<p>
3450+
3451+
#### 答案: D
3452+
3453+
使用`splice`方法,我们通过删除,替换或添加元素来修改原始数组。 上述情况,我们从索引1中删除了2个元素(删除了'🥑'和'😍'),并添加了✨emoji表情。
3454+
3455+
`map``filter``slice`返回一个新数组,`find`返回一个元素,而`reduce`返回一个减小的值。
3456+
3457+
</p>
3458+
</details>
3459+
3460+
---
3461+
3462+
###### <a name=20191009></a>109. 输出什么?
3463+
3464+
```javascript
3465+
const food = ['🍕', '🍫', '🥑', '🍔']
3466+
const info = { favoriteFood: food[0] }
3467+
3468+
info.favoriteFood = '🍝'
3469+
3470+
console.log(food)
3471+
```
3472+
3473+
- A: `['🍕', '🍫', '🥑', '🍔']`
3474+
- B: `['🍝', '🍫', '🥑', '🍔']`
3475+
- C: `['🍝', '🍕', '🍫', '🥑', '🍔']`
3476+
- D: `ReferenceError`
3477+
3478+
<details><summary><b>答案</b></summary>
3479+
<p>
3480+
3481+
#### 答案: A
3482+
3483+
我们将`info`对象上的`favoriteFood`属性的值设置为披萨表情符号“🍕”的字符串。字符串是原始数据类型。在JavaScript中,原始数据类型通过值起作用
3484+
3485+
在这种情况下,我们将`info`对象上的`favoriteFood`属性的值设置为等于`food`数组中的第一个元素的值,字符串为披萨表情符号(`'🍕'` )。字符串是原始数据类型,并且通过值进行交互,我们更改`info`对象上`favoriteFood`属性的值。 food数组没有改变,因为favoriteFood的值只是该数组中第一个元素的值的复制,并且与该元素上的元素没有相同的内存引用食物`[0]`。当我们记录食物时,它仍然是原始数组'['🍕','🍫','🥑','🍔']`。
3486+
3487+
</p>
3488+
</details>
3489+
3490+
---
3491+
3492+
###### 110. 这个函数干了什么?
3493+
3494+
```javascript
3495+
JSON.parse()
3496+
```
3497+
3498+
- A: Parses JSON to a JavaScript value
3499+
- B: Parses a JavaScript object to JSON
3500+
- C: Parses any JavaScript value to JSON
3501+
- D: Parses JSON to a JavaScript object only
3502+
3503+
<details><summary><b>答案</b></summary>
3504+
<p>
3505+
3506+
#### 答案: A
3507+
3508+
使用`JSON.parse()`方法,我们可以将JSON字符串解析为JavaScript值。
3509+
3510+
```javascript
3511+
// 将数字字符串化为有效的JSON,然后将JSON字符串解析为JavaScript值:
3512+
const jsonNumber = JSON.stringify(4) // '4'
3513+
JSON.parse(jsonNumber) // 4
3514+
3515+
// 将数组值字符串化为有效的JSON,然后将JSON字符串解析为JavaScript值:
3516+
const jsonArray = JSON.stringify([1, 2, 3]) // '[1, 2, 3]'
3517+
JSON.parse(jsonArray) // [1, 2, 3]
3518+
3519+
// 将对象字符串化为有效的JSON,然后将JSON字符串解析为JavaScript值:
3520+
const jsonArray = JSON.stringify({ name: "Lydia" }) // '{"name":"Lydia"}'
3521+
JSON.parse(jsonArray) // { name: 'Lydia' }
3522+
```
3523+
3524+
</p>
3525+
</details>
3526+
3527+
---
3528+
3529+
###### 111. 输出什么?
3530+
3531+
```javascript
3532+
let name = 'Lydia'
3533+
3534+
function getName() {
3535+
console.log(name)
3536+
let name = 'Sarah'
3537+
}
3538+
3539+
getName()
3540+
```
3541+
3542+
- A: Lydia
3543+
- B: Sarah
3544+
- C: `undefined`
3545+
- D: `ReferenceError`
3546+
3547+
<details><summary><b>答案</b></summary>
3548+
<p>
3549+
3550+
#### 答案: D
3551+
3552+
每个函数都有其自己的执行上下文。 `getName`函数首先在其自身的上下文(范围)内查找,以查看其是否包含我们尝试访问的变量`name`。 上述情况,`getName`函数包含其自己的`name`变量:我们用`let`关键字和`Sarah`的值声明变量`name`
3553+
3554+
带有`let`关键字(和`const`)的变量被提升,但是与`var`不同,它不会被***初始化***。 在我们声明(初始化)它们之前,无法访问它们。 这称为“暂时性死区”。 当我们尝试在声明变量之前访问变量时,JavaScript会抛出`ReferenceError: Cannot access 'name' before initialization`
3555+
3556+
如果我们不在`getName`函数中声明`name`变量,则javascript引擎会查看原型练。会找到其外部作用域有一个名为`name`的变量,其值为`Lydia`。 在这种情况下,它将打印`Lydia`
3557+
3558+
```javascript
3559+
let name = 'Lydia'
3560+
3561+
function getName() {
3562+
console.log(name)
3563+
}
3564+
3565+
getName() // Lydia
3566+
```
3567+
3568+
</p>
3569+
</details>

0 commit comments

Comments
 (0)