@@ -3225,3 +3225,345 @@ console.log(one, two, three)
3225
3225
3226
3226
</p >
3227
3227
</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