JS 练习题
type
status
date
slug
summary
tags
category
icon
password
JavaScript 进阶问题列表
我在我的 Instagram 上每天都会发布 JavaScript 的多选问题,并且同时也会在这个仓库中发布。
从基础到进阶,测试你有多了解 JavaScript,刷新你的知识,或者帮助你的 coding 面试!
:muscle: :rocket: 我每周都会在这个仓库下更新新的问题。
答案在问题下方的折叠部分,点击即可展开问题。祝你好运 :heart:
1. 输出是什么?√
var 变量提升,let 没有变量提升
- A:
Lydia和undefined
- B:
Lydia和ReferenceError
- C:
ReferenceError和21
- D:
undefined和ReferenceError
答案
2. 输出是什么?×
let 和 const 才有块级作用域,var 没有块级作用域,而是函数作用域或全局作用域 函数作用域 :变量在函数内部定义,在整个函数内都可以访问(如 var) 块级作用域 :变量在 {} 块中定义,只能在该块中访问(如 let 和 const)
- A:
0 1 2和0 1 2
- B:
0 1 2和3 3 3
- C:
3 3 3和0 1 2
答案
3. 输出是什么?√
this关键字指向的是它当前周围作用域(简单来说是包含箭头函数的常规函数,如果没有常规函数的话就是全局对象)
- A:
20and62.83185307179586
- B:
20andNaN
- C:
20and63
- D:
NaNand63
答案
4. 输出是什么?√
- A:
1andfalse
- B:
falseandNaN
- C:
falseandfalse
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:
truefalsetrue
- B:
falsefalsetrue
- C:
truefalsefalse
- D:
falsetruetrue
答案
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:
undefinedundefined
答案
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:
112
- B:
122
- C:
022
- D:
012
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:
falsetruefalsetrue
- B:
falsetruetruetrue
- C:
truetruefalsetrue
- D:
truetruetruetrue
答案
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:
12
- B:
123
- C:
124
- D:
134
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:
FirstSecondThird
- B:
FirstThirdSecond
- C:
SecondFirstThird
- D:
SecondThirdFirst
答案
答案: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:
pdiv
- B:
divp
- C:
p
- D:
div
答案
33. 输出是什么?
- A:
undefined is 21Lydia is 21
- B:
functionfunction
- C:
Lydia is 21Lydia is 21
- D:
Lydia is 21function
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:
1undefined2
- B:
undefinedundefinedundefined
- C:
112
- D:
1undefinedundefined
答案
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:
falsetruefalse
- B:
falsefalsetrue
- C:
falsetruetrue
- D:
truetruefalse
答案
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:
12and33and64
- B:
12and23and34
- C:
1undefinedand2undefinedand3undefinedand4undefined
- D:
12andundefined3andundefined4
答案
答案: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").valueandgame.next().value
- B:
game.next.value("Yes")andgame.next.value()
- C:
game.next().valueandgame.next("Yes").value
- D:
game.next.value()andgame.next.value("Yes")
答案
答案:C
generator函数在遇到yield关键字时会“暂停”其执行。首先,我们需要让函数产生字符串Do you love JavaScript?,这可以通过调用game.next().value来完成。上述函数的第一行就有一个yield关键字,那么运行立即停止了,yield表达式本身没有返回值,或者说总是返回undefined,这意味着此时变量 答案 为undefinednext方法可以带一个参数,该参数会被当作上一个 yield 表达式的返回值。当我们调用game.next("Yes").value时,先前的 yield 的返回值将被替换为传递给next()函数的参数"Yes"。此时变量 答案 被赋值为 "Yes",if语句返回false,所以JavaScript loves you back ❤️被打印。72. 输出什么?
- A:
Hello world!
- B:
Helloworld
- C:
Hello\nworld
- D:
Hello\nworld
答案
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! 20Calculated! 20Calculated! 20
- B:
Calculated! 20From cache! 20Calculated! 20
- C:
Calculated! 20From cache! 20From cache! 20
- D:
Calculated! 20From cache! 20Error
答案
答案: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:
0123and"☕""💻""🍷""🍫"
- B:
"☕""💻""🍷""🍫"and"☕""💻""🍷""🍫"
- C:
"☕""💻""🍷""🍫"and0123
- D:
0123and{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:
nameLydiaandage21
- 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,6andb is bigger,3
- B:
a is bigger,undefinedandb is bigger,undefined
- C:
undefinedandundefined
- 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:
Errorand{ 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:
falsenull[]
- B:
null""true
- C:
{}""[]
- D:
nullnulltrue
答案
102. 依次输出什么?
- A:
I have resolved!,secondandI have resolved!,second
- B:
second,I have resolved!andsecond,I have resolved!
- C:
I have resolved!,secondandsecond,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:
mapreduceslicesplice
- C:
mapslicesplice
- 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:
aanda
- B:
aandundefined
- C:
['a', 'b', 'c']anda
- D:
aand['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:
undefinedundefinedundefinedundefined
- B:
MaraundefinedLydia HallieReferenceError
- C:
MaranullLydia Hallienull
- D:
nullReferenceErrornullReferenceError
答案
答案: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:
falsetrue
- B:
truefalse
- C:
falsefalse
- D:
truetrue
答案
123. 输出什么?
- A:
456
- B:
654
- C:
4functionfunction
- D:
undefinedundefined6
答案
124. 输出什么?
- A:
Promise {1}Promise {2}Promise {3}
- B:
Promise {<pending>}Promise {<pending>}Promise {<pending>}
- C:
123
- D:
undefinedundefinedundefined
答案
答案: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:
123
- B:
{1: 1}{2: 2}{3: 3}
- C:
{ 1: undefined }undefinedundefined
- D:
undefinedundefinedundefined
答案
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:
truefalsetruefalse
- B:
truefalsefalsefalse
- C:
falsefalsetruefalse
- D:
falsetruefalsetrue
答案
129. 输出什么?
- A:
"number"
- B:
"string"
- C:
undefined
- D:
ReferenceError
答案
130. 输出什么?
- A:
Woah some cool data
- B:
Oh finally!
- C:
Woah some cool dataOh finally!
- D:
Oops didn't workOh 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:
24and36
- B:
2NaNand3NaN
- C:
2Errorand36
- D:
24and3Error
答案
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知识👀
❤️ 若您认可我的内容,欢迎请我喝杯咖啡~






