JS 选择题
type
status
date
slug
summary
tags
category
icon
password
JavaScript 进阶问题列表
我在我的 Instagram 上每天都会发布 JavaScript 的多选问题,并且同时也会在这个仓库中发布。
从基础到进阶,测试你有多了解 JavaScript,刷新你的知识,或者帮助你的 coding 面试!
:muscle: :rocket: 我每周都会在这个仓库下更新新的问题。
答案在问题下方的折叠部分,点击即可展开问题。祝你好运 :heart:
1. 输出是什么?√
- A:
Lydia
和undefined
- B:
Lydia
和ReferenceError
- C:
ReferenceError
和21
- D:
undefined
和ReferenceError
答案
2. 输出是什么?*
- A:
0 1 2
和0 1 2
- B:
0 1 2
和3 3 3
- C:
3 3 3
和0 1 2
答案
3. 输出是什么?
- A:
20
and62.83185307179586
- B:
20
andNaN
- C:
20
and63
- D:
NaN
and63
答案
4. 输出是什么?
- A:
1
andfalse
- B:
false
andNaN
- C:
false
andfalse
5. 哪一个是正确的?
- A:
mouse.bird.size
是无效的
- B:
mouse[bird.size]
是无效的
- C:
mouse[bird["size"]]
是无效的
- D: 以上三个选项都是有效的
答案
答案:A
在 JavaScript 中,所有对象的 keys 都是字符串(除非对象是 Symbol)。尽管我们可能不会定义它们为字符串,但它们在底层总会被转换为字符串。
当我们使用括号语法时([]),JavaScript 会解释(或者 unboxes)语句。它首先看到第一个开始括号
[
并继续前进直到找到结束括号 ]
。只有这样,它才会计算语句的值。mouse[bird.size]
:首先计算 bird.size
,这会得到 small
。mouse["small"]
返回 true
。然后使用点语法的话,上面这一切都不会发生。
mouse
没有 bird
这个 key,这也就意味着 mouse.bird
是 undefined
。然后当我们使用点语法 mouse.bird.size
时,因为 mouse.bird
是 undefined
,这也就变成了 undefined.size
。这个行为是无效的,并且会抛出一个错误类似 Cannot read property "size" of undefined
。6. 输出是什么?
- A:
Hello
- B:
undefined
- C:
ReferenceError
- D:
TypeError
答案
7. 输出是什么?
- A:
true
false
true
- B:
false
false
true
- C:
true
false
false
- D:
false
true
true
答案
8. 输出是什么?
- A:
orange
- B:
purple
- C:
green
- D:
TypeError
答案
9. 输出是什么?
- A:
{}
- B:
ReferenceError: greetign is not defined
- C:
undefined
答案
10. 当我们这么做时,会发生什么?
- A: 正常运行!
- B:
SyntaxError
. 你不能通过这种方式给函数增加属性。
- C:
undefined
- D:
ReferenceError
答案
11. 输出是什么?
- A:
TypeError
- B:
SyntaxError
- C:
Lydia Hallie
- D:
undefined
undefined
答案
12. 输出是什么?
- A:
Person {firstName: "Lydia", lastName: "Hallie"}
andundefined
- B:
Person {firstName: "Lydia", lastName: "Hallie"}
andPerson {firstName: "Sarah", lastName: "Smith"}
- C:
Person {firstName: "Lydia", lastName: "Hallie"}
and{}
- D:
Person {firstName: "Lydia", lastName: "Hallie"}
andReferenceError
答案
13. 事件传播的三个阶段是什么?
- A: Target > Capturing > Bubbling
- B: Bubbling > Target > Capturing
- C: Target > Bubbling > Capturing
- D: Capturing > Target > Bubbling
14. 所有对象都有原型。
- A: 对
- B: 错
答案
15. 输出是什么?
- A:
NaN
- B:
TypeError
- C:
"12"
- D:
3
答案
16. 输出是什么?
- A:
1
1
2
- B:
1
2
2
- C:
0
2
2
- D:
0
1
2
17. 输出是什么?
- A:
"Lydia"
21
["", " is ", " years old"]
- B:
["", " is ", " years old"]
"Lydia"
21
- C:
"Lydia"
["", " is ", " years old"]
21
18. 输出是什么?
- A:
You are an adult!
- B:
You are still an adult.
- C:
Hmm.. You don't have an age I guess
答案
19. 输出是什么?
- A:
"number"
- B:
"array"
- C:
"object"
- D:
"NaN"
20. 输出是什么?
- A:
21
- B:
undefined
- C:
ReferenceError
- D:
TypeError
答案
21. 输出是什么?
- A:
105
- B:
"105"
- C:
TypeError
- D:
"10*10+5"
22. cool_secret 可访问多长时间?
- A: 永远,数据不会丢失。
- B: 当用户关掉标签页时。
- C: 当用户关掉整个浏览器,而不只是关掉标签页。
- D: 当用户关闭电脑时。
答案
23. 输出是什么?
- A:
8
- B:
10
- C:
SyntaxError
- D:
ReferenceError
24. 输出是什么?
- A:
false
true
false
true
- B:
false
true
true
true
- C:
true
true
false
true
- D:
true
true
true
true
答案
25. 输出是什么?
- A:
{ a: "one", b: "two" }
- B:
{ b: "two", a: "three" }
- C:
{ a: "three", b: "two" }
- D:
SyntaxError
26. JavaScript 全局执行上下文为你做了两件事:全局对象和 this 关键字。
- A: 对
- B: 错
- C: 看情况
27. 输出是什么?
- A:
1
2
- B:
1
2
3
- C:
1
2
4
- D:
1
3
4
28. 输出是什么?
- A:
"Just give Lydia pizza already!"
- B:
TypeError: not a function
- C:
SyntaxError
- D:
undefined
答案
29. 输出是什么?
- A:
123
- B:
456
- C:
undefined
- D:
ReferenceError
答案
30. 输出是什么?
- A:
First
Second
Third
- B:
First
Third
Second
- C:
Second
First
Third
- D:
Second
Third
First
答案
答案:B
我们有一个
setTimeout
函数,并首先调用它。然而,它是最后打印日志的。这是因为在浏览器中,我们不仅有运行时引擎,还有一个叫做
WebAPI
的东西。WebAPI
提供了 setTimeout
函数,也包含其他的,例如 DOM。将 callback 推送到 WebAPI 后,
setTimeout
函数本身 (但不是回调!) 将从栈中弹出。
现在,
foo
被调用,打印 "First"
。
foo
从栈中弹出,baz
被调用。打印 "Third"
。
WebAPI 不能随时向栈内添加内容。相反,它将回调函数推到名为 queue 的地方。

这就是事件循环开始工作的地方。一个事件循环查看栈和任务队列。如果栈是空的,它接受队列上的第一个元素并将其推入栈。

bar
被调用,打印 "Second"
,然后它被栈弹出。31. 当点击按钮时,event.target 是什么?
- A: Outer
div
- B: Inner
div
- C:
button
- D: 一个包含所有嵌套元素的数组。
32. 当您单击该段落时,日志输出是什么?
- A:
p
div
- B:
div
p
- C:
p
- D:
div
答案
33. 输出是什么?
- A:
undefined is 21
Lydia is 21
- B:
function
function
- C:
Lydia is 21
Lydia is 21
- D:
Lydia is 21
function
34. 输出是什么?
- A:
"object"
- B:
"number"
- C:
"function"
- D:
"undefined"
答案
35. 下面哪些值是 falsy?
- A:
0
,''
,undefined
- B:
0
,new Number(0)
,''
,new Boolean(false)
,undefined
- C:
0
,''
,new Boolean(false)
,undefined
- D: All of them are falsy
答案
36. 输出是什么?
- A:
"number"
- B:
"string"
- C:
"object"
- D:
"undefined"
37. 输出是什么?
- A:
[1, 2, 3, 7 x null, 11]
- B:
[1, 2, 3, 11]
- C:
[1, 2, 3, 7 x empty, 11]
- D:
SyntaxError
答案
38. 输出是什么?
- A:
1
undefined
2
- B:
undefined
undefined
undefined
- C:
1
1
2
- D:
1
undefined
undefined
答案
39. JavaScript 中的一切都是?
- A: 基本类型与对象
- B: 函数与对象
- C: 只有对象
- D: 数字与对象
- 答案
答案:A
JavaScript 只有基本类型和对象。
基本类型包括
boolean
, null
, undefined
, bigint
, number
, string
, symbol
。40. 输出是什么?
- A:
[0, 1, 2, 3, 1, 2]
- B:
[6, 1, 2]
- C:
[1, 2, 0, 1, 2, 3]
- D:
[1, 2, 6]
答案
41. 输出是什么?
- A:
false
true
false
- B:
false
false
true
- C:
false
true
true
- D:
true
true
false
答案
42. setInterval
方法的返回值是什么?
- A: 一个唯一的 id
- B: 该方法指定的毫秒数
- C: 传递的函数
- D:
undefined
43. 输出是什么?
- A:
["L", "y", "d", "i", "a"]
- B:
["Lydia"]
- C:
[[], "Lydia"]
- D:
[["L", "y", "d", "i", "a"]]
44. 输出是什么?
- A:
[0, 10], [10, 20]
- B:
20, 20
- C:
10, 20
- D:
0, 10 and 10, 20
答案
答案:C
一般的函数在执行之后是不能中途停下的。但是,生成器函数却可以中途“停下”,之后可以再从停下的地方继续。当生成器遇到
yield
关键字的时候,会生成yield
后面的值。注意,生成器在这种情况下不 返回 (return ) 值,而是 生成 (yield) 值。首先,我们用
10
作为参数i
来初始化生成器函数。然后使用next()
方法一步步执行生成器。第一次执行生成器的时候,i
的值为10
,遇到第一个yield
关键字,它要生成i
的值。此时,生成器“暂停”,生成了10
。然后,我们再执行
next()
方法。生成器会从刚才暂停的地方继续,这个时候i
还是10
。于是我们走到了第二个yield
关键字处,这时候需要生成的值是i*2
,i
为10
,那么此时生成的值便是20
。所以这道题的最终结果是10,20
。45. 返回值是什么?
- A:
"one"
- B:
"two"
- C:
"two" "one"
- D:
"one" "two"
答案
46. 输出是什么?
- A:
null
- B:
[null]
- C:
[{}]
- D:
[{ name: "Lydia" }]
答案
47. 输出是什么?
- A:
{ name: "Lydia" }, { age: 21 }
- B:
"name", "age"
- C:
"Lydia", 21
- D:
["name", "Lydia"], ["age", 21]
答案
48. 输出是什么?
- A:
"345"
- B:
"75"
- C:
12
- D:
"12"
答案
49. num
的值是什么?
- A:
42
- B:
"42"
- C:
7
- D:
NaN
答案
50. 输出是什么?
- A:
[]
- B:
[null, null, null]
- C:
[undefined, undefined, undefined]
- D:
[ 3 x empty ]
答案
51. 输出的是什么?
- A:
{ name: "Lydia" }, "1997"
- B:
{ name: "Sarah" }, "1998"
- C:
{ name: "Lydia" }, "1998"
- D:
{ name: "Sarah" }, "1997"
答案
答案:A
普通参数都是 值 传递的,而对象则不同,是 引用 传递。所以说,
birthYear
是值传递,因为他是个字符串而不是对象。当我们对参数进行值传递时,会创建一份该值的 复制。(可以参考问题 46)变量
birthYear
有一个对"1997"
的引用,而传入的参数也有一个对"1997"
的引用,但二者的引用并不相同。当我们通过给 year
赋值"1998"
来更新year
的值的时候我们只是更新了year
(的引用)。此时birthYear
仍然是"1997"
.而
person
是个对象。参数member
引用与之 相同的 对象。当我们修改member
所引用对象的属性时,person
的相应属性也被修改了,因为他们引用了相同的对象。person
的 name
属性也变成了 "Lydia"
.52. 输出是什么?
- A:
"It worked! Hello world!"
- B:
"Oh no an error: undefined
- C:
SyntaxError: can only throw Error objects
- D:
"Oh no an error: Hello world!
答案
53. 输出是什么?
- A:
"Lamborghini"
- B:
"Maserati"
- C:
ReferenceError
- D:
TypeError
54. 输出是什么?
- A:
"undefined", "number"
- B:
"number", "number"
- C:
"object", "number"
- D:
"number", "undefined"
答案
答案:A
let x = y = 10;
是下面这个表达式的缩写:我们设定
y
等于10
时,我们实际上增加了一个属性y
给全局对象 (浏览器里的window
, Nodejs 里的global
)。在浏览器中,window.y
等于10
.然后我们声明了变量
x
等于y
,也是10
.但变量是使用 let
声明的,它只作用于 块级作用域,仅在声明它的块中有效;就是案例中的立即调用表达式 (IIFE)。使用typeof
操作符时,操作值 x
没有被定义:因为我们在x
声明块的外部,无法调用它。这就意味着x
未定义。未分配或是未声明的变量类型为"undefined"
. console.log(typeof x)
返回"undefined"
.而我们创建了全局变量
y
,并且设定y
等于10
.这个值在我们的代码各处都访问的到。y
已经被定义了,而且有一个"number"
类型的值。console.log(typeof y)
返回"number"
.55. 输出是什么?
- A:
"Woof I am Mara"
,TypeError
- B:
"Woof I am Mara"
"Woof I am Mara"
- C:
"Woof I am Mara"
,undefined
- D:
TypeError
,TypeError
答案
56. 输出是什么?
- A:
[1, 1, 2, 3, 4]
- B:
[1, 2, 3, 4]
- C:
{1, 1, 2, 3, 4}
- D:
{1, 2, 3, 4}
答案
57. 输出是什么?
- A:
10
- B:
11
- C:
Error
- D:
NaN
58. 输出是什么?
- A:
false
,true
- B:
"Lydia"
,21
- C:
true
,true
- D:
undefined
,undefined
答案
59. 输出是什么?
- A:
[[1, 2, 3, 4, 5]]
- B:
[1, 2, 3, 4, 5]
- C:
1
- D:
[1]
60. 输出是什么?
- A:
{ admin: true, user: { name: "Lydia", age: 21 } }
- B:
{ admin: true, name: "Lydia", age: 21 }
- C:
{ admin: true, user: ["Lydia", 21] }
- D:
{ admin: true }
答案
61. 输出是什么?
- A:
{ name: "Lydia", age: 21 }
,["name", "age"]
- B:
{ name: "Lydia", age: 21 }
,["name"]
- C:
{ name: "Lydia"}
,["name", "age"]
- D:
{ name: "Lydia"}
,["age"]
答案
62. 输出是什么?
- A:
"{"level":19, "health":90}"
- B:
"{"username": "lydiahallie"}"
- C:
"["level", "health"]"
- D:
"{"username": "lydiahallie", "level":19, "health":90}"
答案
答案:A
JSON.stringify
的第二个参数是 替代者 (replacer). 替代者 (replacer) 可以是个函数或数组,用以控制哪些值如何被转换为字符串。如果替代者 (replacer) 是个 数组,那么就只有包含在数组中的属性将会被转化为字符串。在本例中,只有名为
"level"
和 "health"
的属性被包括进来,"username"
则被排除在外。data
就等于 "{"level":19, "health":90}"
.而如果替代者 (replacer) 是个 函数,这个函数将被对象的每个属性都调用一遍。
函数返回的值会成为这个属性的值,最终体现在转化后的 JSON 字符串中(译者注:Chrome 下,经过实验,如果所有属性均返回同一个值的时候有异常,会直接将返回值作为结果输出而不会输出 JSON 字符串),而如果返回值为
undefined
,则该属性会被排除在外。63. 输出是什么?
- A:
10
,10
- B:
10
,11
- C:
11
,11
- D:
11
,12
答案
64. 输出什么?
- A:
20
,40
,80
,160
- B:
20
,40
,20
,40
- C:
20
,20
,20
,40
- D:
NaN
,NaN
,20
,40
答案
答案:C
在 ES6 中,我们可以使用默认值初始化参数。如果没有给函数传参,或者传的参值为
"undefined"
,那么参数的值将是默认值。上述例子中,我们将 value
对象进行了解构并传到一个新对象中,因此 x
的默认值为 {number:10}
。默认参数在调用时才会进行计算,每次调用函数时,都会创建一个新的对象。我们前两次调用
multiply
函数且不传递值,那么每一次 x
的默认值都为 {number:10}
,因此打印出该数字的乘积值为20
。第三次调用
multiply
时,我们传递了一个参数,即对象value
。*=
运算符实际上是x.number = x.number * 2
的简写,我们修改了x.number
的值,并打印出值20
。第四次,我们再次传递
value
对象。x.number
之前被修改为20
,所以x.number * = 2
打印为40
。65. 输出什么?
- A:
1
2
and3
3
and6
4
- B:
1
2
and2
3
and3
4
- C:
1
undefined
and2
undefined
and3
undefined
and4
undefined
- D:
1
2
andundefined
3
andundefined
4
答案
答案:D
reducer
函数接收 4 个参数:- Accumulator (acc) (累计器)
- Current Value (cur) (当前值)
- Current Index (idx) (当前索引)
- Source Array (src) (源数组)
reducer
函数的返回值将会分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值。reducer
函数还有一个可选参数initialValue
,该参数将作为第一次调用回调函数时的第一个参数的值。如果没有提供initialValue
,则将使用数组中的第一个元素。在上述例子,
reduce
方法接收的第一个参数 (Accumulator) 是x
,第二个参数 (Current Value) 是y
。在第一次调用时,累加器
x
为1
,当前值“y”
为2
,打印出累加器和当前值:1
和2
。例子中我们的回调函数没有返回任何值,只是打印累加器的值和当前值。如果函数没有返回值,则默认返回
undefined
。在下一次调用时,累加器为undefined
,当前值为“3”,因此undefined
和3
被打印出。66. 使用哪个构造函数可以成功继承Dog
类?
- A: 1
- B: 2
- C: 3
- D: 4
答案
67. 输出什么?
- A:
running index.js
,running sum.js
,3
- B:
running sum.js
,running index.js
,3
- C:
running sum.js
,3
,running index.js
- D:
running index.js
,undefined
,running sum.js
答案
68. 输出什么?
- A:
true
,true
,false
- B:
false
,true
,false
- C:
true
,false
,true
- D:
true
,true
,true
答案
69. 输出什么?
- A:
"Lydia Hallie"
,"Lydia Hallie"
- B:
" Lydia Hallie"
," Lydia Hallie"
("[13x whitespace]Lydia Hallie"
,"[2x whitespace]Lydia Hallie"
)
- C:
" Lydia Hallie"
,"Lydia Hallie"
("[1x whitespace]Lydia Hallie"
,"Lydia Hallie"
)
- D:
"Lydia Hallie"
,"Lyd"
答案
70. 输出什么?
- A:
"🥑💻"
- B:
257548
- C: A string containing their code points
- D: Error
71. 如何能打印出console.log
语句后注释掉的值?
- A:
game.next("Yes").value
andgame.next().value
- B:
game.next.value("Yes")
andgame.next.value()
- C:
game.next().value
andgame.next("Yes").value
- D:
game.next.value()
andgame.next.value("Yes")
答案
答案:C
generator
函数在遇到yield
关键字时会“暂停”其执行。首先,我们需要让函数产生字符串Do you love JavaScript?
,这可以通过调用game.next().value
来完成。上述函数的第一行就有一个yield
关键字,那么运行立即停止了,yield
表达式本身没有返回值,或者说总是返回undefined
,这意味着此时变量 答案
为undefined
next
方法可以带一个参数,该参数会被当作上一个 yield
表达式的返回值。当我们调用game.next("Yes").value
时,先前的 yield
的返回值将被替换为传递给next()
函数的参数"Yes"
。此时变量 答案
被赋值为 "Yes"
,if
语句返回false
,所以JavaScript loves you back ❤️
被打印。72. 输出什么?
- A:
Hello world!
- B:
Hello
world
- C:
Hello\nworld
- D:
Hello\n
world
答案
73. 输出什么?
- A:
"I made it!"
- B:
Promise {<resolved>: "I made it!"}
- C:
Promise {<pending>}
- D:
undefined
答案
74. 输出什么?
- A:
['apple', 'banana']
- B:
2
- C:
true
- D:
undefined
答案
75. 输出什么?
- A:
{ x: 100, y: 20 }
- B:
{ x: 10, y: 20 }
- C:
{ x: 100 }
- D:
ReferenceError
答案
76. 输出什么?
- A:
"Lydia"
- B:
"myName"
- C:
undefined
- D:
ReferenceError
答案
77. 以下是个纯函数么?
- A: Yes
- B: No
答案
78. 输出什么?
- A:
Calculated! 20
Calculated! 20
Calculated! 20
- B:
Calculated! 20
From cache! 20
Calculated! 20
- C:
Calculated! 20
From cache! 20
From cache! 20
- D:
Calculated! 20
From cache! 20
Error
答案
答案:C
add
函数是一个记忆函数。通过记忆化,我们可以缓存函数的结果,以加快其执行速度。上述情况,我们创建一个cache
对象,用于存储先前返回过的值。如果我们使用相同的参数多次调用
addFunction
函数,它首先检查缓存中是否已有该值,如果有,则返回缓存值,这将节省执行时间。如果没有,那么它将计算该值,并存储在缓存中。我们用相同的值三次调用了
addFunction
函数:在第一次调用,
num
等于10
时函数的值尚未缓存,if 语句num in cache
返回false
,else 块的代码被执行:Calculated! 20
,并且其结果被添加到缓存对象,cache
现在看起来像{10:20}
。第二次,
cache
对象包含10
的返回值。if 语句 num in cache
返回true
,From cache! 20
被打印。第三次,我们将
5 * 2
(值为 10) 传递给函数。cache
对象包含10
的返回值。if 语句 num in cache
返回true
,From cache! 20
被打印。79. 输出什么?
- A:
0
1
2
3
and"☕"
"💻"
"🍷"
"🍫"
- B:
"☕"
"💻"
"🍷"
"🍫"
and"☕"
"💻"
"🍷"
"🍫"
- C:
"☕"
"💻"
"🍷"
"🍫"
and0
1
2
3
- D:
0
1
2
3
and{0: "☕", 1: "💻", 2: "🍷", 3: "🍫"}
答案
80. 输出什么?
- A:
["1 + 2", "1 * 2", "1 / 2"]
- B:
["12", 2, 0.5]
- C:
[3, 2, 0.5]
- D:
[1, 1, 1]
答案
81. 输出什么?
- A:
Hi there,
- B:
Hi there, undefined
- C:
Hi there, null
- D:
ReferenceError
答案
82. 输出什么?
- A:
"🥑"
and"😍"
- B:
"🥑"
and"😎"
- C:
"😍"
and"😎"
- D:
"😎"
and"😎"
答案
83. 输出什么?
- A:
{ name: "Lydia", age: 21 }
- B:
{ name: "Lydia", age: 21, city: "Amsterdam" }
- C:
{ name: "Lydia", age: 21, city: undefined }
- D:
"Amsterdam"
答案
84. 输出什么?
- A:
"Sorry, you're too young."
- B:
"Yay! You're old enough!"
- C:
ReferenceError
- D:
undefined
答案
85. 什么样的信息将被打印?
- A:
fetch
方法的结果
- B: 第二次调用
fetch
方法的结果
- C: 前一个
.then()
中回调方法返回的结果
- D: 总是
undefined
86. 哪个选项是将hasName
设置为true
的方法,前提是不能将true
作为参数传递?
- A:
!!name
- B:
name
- C:
new Boolean(name)
- D:
name.length
答案
87. 输出什么?
- A:
"""
- B:
"I"
- C:
SyntaxError
- D:
undefined
答案
88. 输出什么?
- A:
NaN
- B:
20
- C:
ReferenceError
- D:
undefined
答案
89. 输出什么?
- A:
{ default: function default(), name: "Lydia" }
- B:
{ default: function default() }
- C:
{ default: "Hello world", name: "Lydia" }
- D: Global object of
module.js
答案
90. 输出什么?
- A:
"class"
- B:
"function"
- C:
"object"
- D:
"string"
答案
91. 输出什么?
- A:
[1, 2, 3, 4, 5]
- B:
[1, 2, 3, 5]
- C:
[1, 2, 3, 4]
- D:
Error
答案
92. 输出什么?
- A:
{ constructor: ...}
{ constructor: ...}
- B:
{}
{ constructor: ...}
- C:
{ constructor: ...}
{}
- D:
{ constructor: ...}
undefined
答案
93. 输出什么?
- A:
name
Lydia
andage
21
- B:
["name", "Lydia"]
and["age", 21]
- C:
["name", "age"]
andundefined
- D:
Error
答案
94. 输出什么?
- A:
["banana", "apple", "pear", "orange"]
- B:
[["banana", "apple"], "pear", "orange"]
- C:
["banana", "apple", ["pear"], "orange"]
- D:
SyntaxError
95. 输出什么?
- A:
a is bigger
,6
andb is bigger
,3
- B:
a is bigger
,undefined
andb is bigger
,undefined
- C:
undefined
andundefined
- D:
SyntaxError
答案
96. 输出什么?
- A:
"Lydia"
- B:
"Sarah"
- C:
Error: cannot redeclare Person
- D:
SyntaxError
答案
97. 输出什么?
- A:
{Symbol('a'): 'b'}
and["{Symbol('a')"]
- B:
{}
and[]
- C:
{ a: "b" }
and["a"]
- D:
{Symbol('a'): 'b'}
and[]
答案
98. 输出什么?
- A:
[1, [2, 3, 4]]
andSyntaxError
- B:
[1, [2, 3, 4]]
and{ name: "Lydia", age: 21 }
- C:
[1, 2, 3, 4]
and{ name: "Lydia", age: 21 }
- D:
Error
and{ name: "Lydia", age: 21 }
答案
答案:A
getList
函数接收一个数组作为其参数。在getList
函数的括号之间,我们立即解构这个数组。您可以将其视为:[x, ...y] = [1, 2, 3, 4]
使用剩余的参数
... y
,我们将所有剩余参数放在一个数组中。在这种情况下,其余的参数是2
,3
和4
。 y
的值是一个数组,包含所有其余参数。在这种情况下,x
的值等于1
,所以当我们打印[x,y]
时,会打印[1,[2,3,4]]
。getUser
函数接收一个对象。对于箭头函数,如果只返回一个值,我们不必编写花括号。但是,如果您想从一个箭头函数返回一个对象,您必须将它写在圆括号之间,否则两个花括号之间的所有内容都将被解释为一个块语句!在这种情况下,花括号之间的代码不是有效的 JavaScript 代码,因此会抛出 SyntaxError。以下函数将返回一个对象:
const getUser = user => ({ name: user.name, age: user.age })
99. 输出什么?
- A:
SyntaxError
- B:
ReferenceError
- C:
TypeError
- D:
undefined
答案
100. 输出什么?
- A:
possible! You should see a therapist after so much JavaScript lol
- B:
Impossible! You should see a therapist after so much JavaScript lol
- C:
possible! You shouldn't see a therapist after so much JavaScript lol
- D:
Impossible! You shouldn't see a therapist after so much JavaScript lol
101.输出什么?
- A:
false
null
[]
- B:
null
""
true
- C:
{}
""
[]
- D:
null
null
true
答案
102. 依次输出什么?
- A:
I have resolved!
,second
andI have resolved!
,second
- B:
second
,I have resolved!
andsecond
,I have resolved!
- C:
I have resolved!
,second
andsecond
,I have resolved!
- D:
second
,I have resolved!
andI have resolved!
,second
答案
答案:D
有了 promise,我们通常会说:当我想要调用某个方法,但是由于它可能需要一段时间,因此暂时将它放在一边。只有当某个值被 resolved/rejected,并且执行栈为空时才使用这个值。
我们可以在
async
函数中通过.then
和await
关键字获得该值。尽管我们可以通过.then
和await
获得 promise 的价值,但是它们的工作方式有所不同。在
firstFunction
中,当运行到myPromise
方法时我们将其放在一边,即 promise 进入微任务队列,其他后面的代码(console.log('second')
)照常运行,因此second
被打印出,firstFunction
方法到此执行完毕,执行栈中宏任务队列被清空,此时开始执行微任务队列中的任务,I have resolved
被打印出。在
secondFunction
方法中,我们通过await
关键字,暂停了后面代码的执行,直到异步函数的值被解析才开始后面代码的执行。这意味着,它会等着直到 myPromise
以值I have resolved
被解决之后,下一行second
才开始执行。103. 输出什么?
- A:
3
,NaN
,NaN
- B:
3
,7
,NaN
- C:
3
,Lydia2
,[Object object]2
- D:
"12"
,Lydia2
,[Object object]2
答案
答案:C
“+”运算符不仅用于添加数值,还可以使用它来连接字符串。每当 JavaScript 引擎发现一个或多个值不是数字时,就会将数字强制为字符串。
第一个是数字 1。1 + 2 返回数字 3。
但是,第二个是字符串“Lydia”。 “Lydia”是一个字符串,2 是一个数字:2 被强制转换为字符串。 “Lydia”和“2”被连接起来,产生字符串“Lydia2”。
{name:“Lydia”}
是一个对象。数字和对象都不是字符串,因此将二者都字符串化。每当我们对常规对象进行字符串化时,它就会变成[Object object]
。与“2”串联的“ [Object object]”成为“[Object object]2”。104. 结果是什么?
- A:
5
- B:
Promise {<pending>: 5}
- C:
Promise {<fulfilled>: 5}
- D:
Error
答案
105. 输出什么?
- A:
Not the same!
- B:
They are the same!
- C:
ReferenceError
- D:
SyntaxError
答案
106. 输出什么?
- A:
true
- B:
false
- C:
undefined
- D:
TypeError
答案
答案:D
在 JavaScript 中,我们有两种访问对象属性的方法:括号表示法或点表示法。在此示例中,我们使用点表示法(
colorConfig.colors
)代替括号表示法(colorConfig [“colors”]
)。使用点表示法,JavaScript 会尝试使用该确切名称在对象上查找属性。在此示例中,JavaScript 尝试在 colorConfig 对象上找到名为 colors 的属性。没有名为“colors”的属性,因此返回“undefined”。
然后,我们尝试使用
[1]
访问第一个元素的值。我们无法对未定义的值执行此操作,因此会抛出Cannot read property '1' of undefined
。JavaScript 解释(或取消装箱)语句。当我们使用方括号表示法时,它会看到第一个左方括号
[
并一直进行下去,直到找到右方括号]
。只有这样,它才会评估该语句。如果我们使用了 colorConfig [colors [1]],它将返回 colorConfig 对象上 red 属性的值。107. 输出什么?
- A:
true
- B:
false
答案
108. 哪些方法修改了原数组?
- A:
All of them
- B:
map
reduce
slice
splice
- C:
map
slice
splice
- D:
splice
答案
109. 输出什么?
- A:
['🍕', '🍫', '🥑', '🍔']
- B:
['🍝', '🍫', '🥑', '🍔']
- C:
['🍝', '🍕', '🍫', '🥑', '🍔']
- D:
ReferenceError
答案
答案:A
我们将
info
对象上的favoriteFood
属性的值设置为披萨表情符号“🍕”的字符串。字符串是原始数据类型。在 JavaScript 中,原始数据类型通过值起作用在这种情况下,我们将
info
对象上的favoriteFood
属性的值设置为等于food
数组中的第一个元素的值,字符串为披萨表情符号('🍕'
)。字符串是原始数据类型,并且通过值进行交互,我们更改info
对象上favoriteFood
属性的值。food 数组没有改变,因为 favoriteFood 的值只是该数组中第一个元素的值的复制,并且与该元素上的元素没有相同的内存引用食物[0]
。当我们记录食物时,它仍然是原始数组['🍕','🍫','🥑','🍔']
。110. 这个函数干了什么?
- A: Parses JSON to a JavaScript value
- B: Parses a JavaScript object to JSON
- C: Parses any JavaScript value to JSON
- D: Parses JSON to a JavaScript object only
111. 输出什么?
- A: Lydia
- B: Sarah
- C:
undefined
- D:
ReferenceError
答案
答案:D
每个函数都有其自己的执行上下文。
getName
函数首先在其自身的上下文(范围)内查找,以查看其是否包含我们尝试访问的变量name
。上述情况,getName
函数包含其自己的name
变量:我们用let
关键字和Sarah
的值声明变量name
。带有
let
关键字(和const
)的变量被提升,但是与var
不同,它不会被*** 初始化***。在我们声明(初始化)它们之前,无法访问它们。这称为“暂时性死区”。当我们尝试在声明变量之前访问变量时,JavaScript 会抛出ReferenceError: Cannot access 'name' before initialization
。如果我们不在
getName
函数中声明name
变量,则 javascript 引擎会查看原型链。会找到其外部作用域有一个名为name
的变量,其值为Lydia
。在这种情况下,它将打印Lydia
:112. 输出什么?
- A:
a
anda
- B:
a
andundefined
- C:
['a', 'b', 'c']
anda
- D:
a
and['a', 'b', 'c']
答案
答案:C
通过
yield
关键字,我们在 Generator
函数里执行yield
表达式。通过 yield*
关键字,我们可以在一个Generator
函数里面执行(yield
表达式)另一个 Generator
函数,或可遍历的对象 (如数组).在函数
generatorOne
中,我们通过 yield
关键字 yield 了一个完整的数组 ['a', 'b', 'c']
。函数one
通过next
方法返回的对象的value
属性的值 (one.next().value
) 等价于数组 ['a', 'b', 'c']
.在函数
generatorTwo
中,我们使用 yield*
关键字。就相当于函数two
第一个yield
的值,等价于在迭代器中第一个 yield
的值。数组['a', 'b', 'c']
就是这个迭代器。第一个 yield
的值就是 a
,所以我们第一次调用 two.next().value
时,就返回a
。113. 输出什么?
- A:
I love to program
- B:
undefined to program
- C:
${(x => x)('I love') to program
- D:
TypeError
答案
114. 将会发生什么?
- A:
setInterval
的回调不会被调用
- B:
setInterval
的回调被调用一次
- C:
setInterval
的回调仍然会被每秒钟调用
- D: 我们从没调用过
config.alert()
, config 为null
答案
115. 哪一个方法会返回 'Hello world!'
?
- A: 1
- B: 2
- C: 2 and 3
- D: All of them
答案
116. 输出什么?
- A:
{name: "Sarah", age: 22}
- B:
{name: "Sarah", age: 23}
- C:
{name: "Lydia", age: 22}
- D:
{name: "Lydia", age: 23}
答案
答案:C
函数
changeAge
和函数 changeAgeAndName
有着不同的参数,定义一个 新 生成的对象 { ...person }
。这个对象有着所有 person
对象 中 k/v 值的副本。首项,我们调用
changeAge
函数并传递 person
对象作为它的参数。这个函数对 age
属性进行加一操作。person
现在是 { name: "Lydia", age: 22 }
。然后,我们调用函数
changeAgeAndName
,然而我们没有传递参数。取而代之,x
的值等价 new 生成的对象:{ ...person }
。因为它是一个新生成的对象,它并不会对对象 person
造成任何副作用。person
仍然等价于 { name: "Lydia", age: 22 }
。117. 下面那个选项将会返回 6
?
- A:
sumValues([...1, 2, 3])
- B:
sumValues([...[1, 2, 3]])
- C:
sumValues(...[1, 2, 3])
- D:
sumValues([1, 2, 3])
答案
118. 输出什么?
- A:
🤠
- B:
🥰
- C:
SyntaxError
- D:
ReferenceError
答案
119. 输出什么?
- A:
undefined
undefined
undefined
undefined
- B:
Mara
undefined
Lydia Hallie
ReferenceError
- C:
Mara
null
Lydia Hallie
null
- D:
null
ReferenceError
null
ReferenceError
答案
答案:B
通过 ES10 或 TS3.7+可选链操作符
?.
,我们不再需要显式检测更深层的嵌套值是否有效。如果我们尝试获取 undefined
或 null
的值 (nullish),表达将会短路并返回 undefined
.person.pet?.name
:person
有一个名为 pet
的属性:person.pet
不是 nullish。它有个名为 name
的属性,并返回字符串 Mara
。
person.pet?.family?.name
:person
有一个名为 pet
的属性:person.pet
不是 nullish. pet
并没有 一个名为 family
的属性,person.pet.family
是 nullish。表达式返回 undefined
。
person.getFullName?.()
:person
有一个名为 getFullName
的属性:person.getFullName()
不是 nullish 并可以被调用,返回字符串 Lydia Hallie
。
member.getLastName?.()
: 变量member
不存在,因此会抛出错误ReferenceError
。120. 输出什么?
- A: We have to buy bananas!
- B: We don’t have to buy bananas
- C:
undefined
- D:
1
答案
121. 输出什么?
- A:
function language(lang) { this.languages.push(lang }
- B:
0
- C:
[]
- D:
undefined
122. 输出什么?
- A:
false
true
- B:
true
false
- C:
false
false
- D:
true
true
答案
123. 输出什么?
- A:
4
5
6
- B:
6
5
4
- C:
4
function
function
- D:
undefined
undefined
6
答案
124. 输出什么?
- A:
Promise {1}
Promise {2}
Promise {3}
- B:
Promise {<pending>}
Promise {<pending>}
Promise {<pending>}
- C:
1
2
3
- D:
undefined
undefined
undefined
答案
答案:C
我们给 函数 range 传递:
Promise{1}
, Promise{2}
, Promise{3}
,Generator 函数 range
返回一个全是 async object promise 数组。我们将 async object 赋值给变量 gen
,之后我们使用for await ... of
进行循环遍历。我们将返回的 Promise 实例赋值给 item
:第一个返回 Promise{1}
,第二个返回 Promise{2}
,之后是 Promise{3}
。因为我们正 awaiting item
的值,resolved 状态的 promise,promise 数组的 resolved 值 以此为:1
,2
,3
.125. 输出什么?
- A:
1
2
3
- B:
{1: 1}
{2: 2}
{3: 3}
- C:
{ 1: undefined }
undefined
undefined
- D:
undefined
undefined
undefined
答案
126. 输出什么?
- A: The driver drove 130 and has to pay 300
- B: The driver drove 130 mph and has to pay $300.00
- C: The driver drove undefined and has to pay undefined
- D: The driver drove 130.00 and has to pay 300.00
答案
127. 输出什么?
- A:
["👻", "🎃", "🕸"]
- B:
["👻", "🎃", "🕸", "💀"]
- C:
["👻", "🎃", "🕸", { item: "💀" }]
- D:
["👻", "🎃", "🕸", "[object Object]"]
答案
128. 输出什么?
- A:
true
false
true
false
- B:
true
false
false
false
- C:
false
false
true
false
- D:
false
true
false
true
答案
129. 输出什么?
- A:
"number"
- B:
"string"
- C:
undefined
- D:
ReferenceError
答案
130. 输出什么?
- A:
Woah some cool data
- B:
Oh finally!
- C:
Woah some cool data
Oh finally!
- D:
Oops didn't work
Oh finally!
答案
131. 输出什么?
- A:
['🥑', ['✨', '✨', ['🍕', '🍕']]]
- B:
['🥑', '✨', '✨', ['🍕', '🍕']]
- C:
['🥑', ['✨', '✨', '🍕', '🍕']]
- D:
['🥑', '✨', '✨', '🍕', '🍕']
答案
132. 输出什么?
- A:
0
- B:
1
- C:
2
- D:
3
答案
答案:D
counterOne
是类 Counter
的一个实例。类 Counter 包含一个count
属性在它的构造函数里,和一个 increment
方法。首先,我们通过 counterOne.increment()
调用方法 increment
两次。现在,counterOne.count
为 2
.
然后,我们创建一个新的变量
counterTwo
并将 counterOne
的引用地址赋值给它。因为对象受引用地址的影响,我们刚刚创建了一个新的对象,其引用地址和 counterOne
的等价。因此它们指向同一块内存地址,任何对其的副作用都会影响 counterTwo
。现在 counterTwo.count
为 2
。我们调用
counterTwo.increment()
将 count
的值设为 3
。然后,我们打印 counterOne
里的 count,结果为 3
。
133. 输出什么?
- A:
Promise! Last line! Promise! Last line! Last line! Promise!
- B:
Last line! Timeout! Promise! Last line! Timeout! Promise!
- C:
Promise! Last line! Last line! Promise! Timeout! Timeout!
- D:
Last line! Promise! Promise! Last line! Timeout! Timeout!
答案
答案:D
首先,我们调用
funcOne
。在函数 funcOne
的第一行,我们调用myPromise
promise 异步操作。当 JS 引擎在忙于执行 promise,它继续执行函数 funcOne
。下一行 异步操作 setTimeout
,其回调函数被 Web API 调用。 (详情请参考我关于 event loop 的文章.)promise 和 timeout 都是异步操作,函数继续执行当 JS 引擎忙于执行 promise 和 处理
setTimeout
的回调。相当于 Last line!
首先被输出,因为它不是异步操作。执行完 funcOne
的最后一行,promise 状态转变为 resolved,Promise!
被打印。然而,因为我们调用了 funcTwo()
,调用栈不为空,setTimeout
的回调仍不能入栈。我们现在处于
funcTwo
,先 awaiting myPromise。通过 await
关键字,我们暂停了函数的执行直到 promise 状态变为 resolved (或 rejected)。然后,我们输出 res
的 awaited 值(因为 promise 本身返回一个 promise)。接着输出 Promise!
。下一行就是 异步操作
setTimeout
,其回调函数被 Web API 调用。我们执行到函数
funcTwo
的最后一行,输出 Last line!
。现在,因为 funcTwo
出栈,调用栈为空。在事件队列中等待的回调函数(() => console.log("Timeout!")
from funcOne
, and () => console.log("Timeout!")
from funcTwo
)以此入栈。第一个回调输出 Timeout!
,并出栈。然后,第二个回调输出 Timeout!
,并出栈。得到结果 Last line! Promise! Promise! Last line! Timeout! Timeout!
134. 我们怎样才能在 index.js
中调用 sum.js?
中的 sum
?
- A:
sum(4)
- B:
sum.sum(4)
- C:
sum.default(4)
- D: 默认导出不用 来导入,只能具名导出
答案
135. 输出什么?
- A:
Added a new property!
- B:
Accessed a property!
- C:
Added a new property!
Accessed a property!
- D: 没有任何输出
答案
答案:C
使用 Proxy 对象,我们可以给一个对象添加自定义行为。在这个 case,我们传递一个包含以下属性的对象
handler
: set
and get
。每当我们 设置 属性值时 set
被调用,每当我们 获取 时 get
被调用。第一个参数是一个空对象
{}
,作为 person
的值。对于这个对象,自定义行为被定义在对象 handler
。如果我们向对象 person
添加属性,set
将被调用。如果我们获取 person
的属性,get
将被调用。首先,我们向 proxy 对象 (
person.name = "Lydia"
) 添加一个属性 name
。set
被调用并输出 "Added a new property!"
。然后,我们获取 proxy 对象的一个属性,对象 handler 的属性
get
被调用。输出 "Accessed a property!"
。136. 以下哪一项会对对象 person
有副作用?
- A:
person.name = "Evan Bacon"
- B:
person.age = 21
- C:
delete person.name
- D:
Object.assign(person, { age: 21 })
137. 以下哪一项会对对象 person
有副作用?
- A:
person.name = "Evan Bacon"
- B:
delete person.address
- C:
person.address.street = "101 Main St"
- D:
person.pet = { name: "Mara" }
答案
138. 输出什么?
- A:
2
4
and3
6
- B:
2
NaN
and3
NaN
- C:
2
Error
and3
6
- D:
2
4
and3
Error
答案
139. 输出什么?
- A:
10
- B:
11
- C:
undefined
- D:
SyntaxError
答案
140. 选择哪一个?
- A:
yield getMembers(teams[i].members)
- B:
yield* getMembers(teams[i].members)
- C:
return getMembers(teams[i].members)
- D:
return yield getMembers(teams[i].members)
答案
141. 输出什么?
- A:
["coding"]
- B:
["coding", "dancing"]
- C:
["coding", "dancing", "baking"]
- D:
["coding", "running", "dancing", "baking"]
答案
答案:C
函数
addHobby
接受两个参数,hobby
和有着对象 person
中数组 hobbies
默认值的 hobbies
。首相,我们调用函数
addHobby
,并给 hobby
传递 "running"
以及给 hobbies
传递一个空数组。因为我们给 hobbies
传递了空数组,"running"
被添加到这个空数组。然后,我们调用函数
addHobby
,并给 hobby
传递 "dancing"
。我们不向 hobbies
传递值,因此它获取其默认值 —— 对象 person
的 属性 hobbies
。我们向数组 person.hobbies
push dancing
。最后,我们调用函数
addHobby
,并向 hobby
传递 值 "baking"
,并且向 hobbies
传递 person.hobbies
。我们向数组 person.hobbies
push dancing
。pushing
dancing
和 baking
之后,person.hobbies
的值为 ["coding", "dancing", "baking"]
142. 输出什么?
- A:
I'm pink. 🌸
- B:
I'm pink. 🌸
I'm a bird. 🦢
- C:
I'm a bird. 🦢
I'm pink. 🌸
- D: Nothing, we didn’t call any method
答案
143. 哪一个选项会导致报错?
- A: 1
- B: 1 and 2
- C: 3 and 4
- D: 3
144. 我们需要向对象 person
添加什么,以致执行 [...person]
时获得形如 ["Lydia Hallie", 21]
的输出?
- A: 不需要,对象默认就是可迭代的
- B:
[Symbol.iterator]() { for (let x in this) yield* this}
- C:
[Symbol.iterator]() { yield* Object.values(this) }
- D:
[Symbol.iterator]() { for (let x in this) yield this }
答案
答案:C
对象默认并不是可迭代的。如果迭代规则被定义,则一个对象是可迭代的(An iterable is an iterable if the iterator protocol is present)。我们可以通过添加迭代器 symbol
[Symbol.iterator]
来定义迭代规则,其返回一个 generator 对象,比如说构建一个 generator 函数 *[Symbol.iterator]() {}
。如果我们想要返回数组 ["Lydia Hallie", 21]
: yield* Object.values(this)
,这个 generator 函数一定要 yield 对象 person
的Object.values
。145. 输出什么?
- A: 1
- B: 2
- C: 3
- D: 4
答案
答案:C
在
forEach
循环内部的 if
会判断 num
的值是 truthy 或者是 falsy。因为 nums
数组的第一个数字是 0
,一个 falsy 值,if
语句代码块不会被执行。count
仅仅在 nums
数组的其他 3 个数字 1
,2
,3
时加 1。因为 count
执行了 3 次加 1
运算,所以 count
的值为 3
。146. 输出是什么?
- A:
null
,undefined
, 🍌
- B:
[]
,null
, 🍌
- C:
[]
,[]
, 🍌
- D:
undefined
,undefined
, 🍌
答案
答案:D
?
允许我们去选择性地访问对象内部更深层的嵌套属性。我们尝试打印 fruits
数组索引值为 1
的子数组内部的索引值为 1
的元素。如果在 fruits
数组索引值 为 1
的位置不存在元素,会直接返回 undefined
。如果 fruits
数组在索引值为 1
的位置存在元素,但是子数组在索引值为 1
的位置不存在元素,也会返回 undefined
。首先,我们尝试打印
[['🍊', '🍌'], ['🍍']]
的子数组 ['🍍']
的第 2 个元素。这个子数组只包含一个元素,也就意味着在索引值为 1
的位置不存在元素,所以返回的是 undefined
。其次,我们在没有传入任何参数调用了
getFruits
函数,也就意味着形参 fruits
的默认值为undefined
。因为我们选择性地链接了 fruits
在索引值为 1
的元素,因为在索引值为 1
的位置不存在元素,因此返回的是 undefined
。最后,我们尝试打印
['🍍'], ['🍊', '🍌']
的子数组 ['🍊', '🍌']
的第 2 个元素。子数组索引值为 1
的位置为 🍌
,因此它被打印出了。147. 输出什么?
- A:
0
- B:
1
- C:
undefined
- D:
ReferenceError
答案
148. 输出什么?
- A:
false
- B:
true
- C:
TypeError
- D:
ReferenceError
答案
149. 输出什么?
- A:
['🍌', '🍊', '🍎']
- B:
['🍊', '🍎']
- C:
['🍇', '🍊', '🍎']
- D:
['🍇', '🍌', '🍊', '🍎']
答案
150. 输出什么?
- A:
{ emoji: "🐶", name: "Mara" }
- B:
{ emoji: "🐈", name: "Sara" }
- C:
undefined
- D:
ReferenceError
答案
答案:B
对象的键会被转换为字符串。
因为
dog
的值是一个对象,animals[dog]
实际上意味着我们创建了一个叫做 "object Object"
的属性来代表新的对象。animals["object Object"]
现在等于 { emoji: "🐶", name: "Mara"}
。cat
也是一个对象,animals[cat]
实际上意味着我们在用新的 cat 的属性覆盖 animals[``"``object Object``"``]
的值。打印
animals[dog]
,实际上是animals["object Object"]
,这是因为转化dog
对象为一个字符串结果 "object Object"
,所以返回 { emoji: "🐈", name: "Sara" }
。151. 输出什么?
- A:
my@email.com
- B:
new@email.com
- C:
undefined
- D:
ReferenceError
答案
152. 输出什么?
- A:
[['First', 'Second'], ['Fourth']]
- B:
[['First', 'Second'], ['Third', 'Fourth']]
- C:
[['First', 'Second']]
- D:
'Third'
答案
153. 哪个作为method
的值可以打印{ name: "Lydia", age: 22 }
?
- A:
entries
- B:
values
- C:
fromEntries
- D:
forEach
答案
154. 输出什么?
- A:
{ email: "my@email.com", address: null }
- B:
{ email: "my@email.com" }
- C:
{ email: "my@email.com", address: {} }
- D:
{ email: "my@email.com", address: undefined }
答案
155. 输出什么?
- A:
It's not a string!
- B:
Yay it's a string!
- C:
TypeError
- D:
undefined
答案
答案:B
if
语句的条件判断 !typeof randomValue
的值是否等于 "string"
。!
操作符将这个值转化为一个布尔值。如果值是 truthy 的话,返回值会是 false
,如果值是 falsy,返回值会是 true
。在这里,typeof randomValue
的返回值是一个 truthy 值 "number"
,意味着 !typeof randomValue
的值是一个布尔值 false
。!typeof randomValue === "string"
总是返回 false,因为我们实际上是在执行 false === "string"
。因为条件返回的是 false
,所以 else
语句中的代码块会被运行,因此打印 Yay it's a string!
。Last update:
type
status
date
slug
summary
tags
category
icon
password
🎉 欢迎来到我的小站!
📚 这里主要分享记录开发技术和AI知识👀
❤️ 若您认可我的内容,欢迎请我喝杯咖啡~