1. 下面代碼的輸出是什么?
function sayHi() {
console.log(name)
console.log(age)
var name = 'Lydia'
let age = 21
}
sayHi()
A:
Lydia
和undefined
B:
Lydia
和ReferenceError
C:
ReferenceError
和21
D:
undefined
和ReferenceError
答案: D
在函數(shù)中仰挣,我們首先使用var
關鍵字聲明了name
變量钩骇。 這意味著變量在創(chuàng)建階段會被提升(JavaScript
會在創(chuàng)建變量創(chuàng)建階段為其分配內(nèi)存空間)肠阱,默認值為undefined
沃饶,直到我們實際執(zhí)行到使用該變量的行胰锌。 我們還沒有為name
變量賦值治泥,所以它仍然保持undefined
的值暂幼。
使用let
關鍵字(和const
)聲明的變量也會存在變量提升,但與var
不同移迫,初始化沒有被提升旺嬉。 在我們聲明(初始化)它們之前,它們是不可訪問的厨埋。 這被稱為“暫時死區(qū)”邪媳。 當我們在聲明變量之前嘗試訪問變量時,JavaScript
會拋出一個ReferenceError
荡陷。
譯者注:
關于let
的是否存在變量提升悲酷,我們何以用下面的例子來驗證:
let name = 'ConardLi'{ console.log(name) // Uncaught ReferenceError: name is not defined let name = 'code秘密花園'}
let
變量如果不存在變量提升,console.log(name)
就會輸出ConardLi
亲善,結果卻拋出了ReferenceError
,那么這很好的說明了逗柴,let
也存在變量提升蛹头,但是它存在一個“暫時死區(qū)”,在變量未初始化或賦值前不允許訪問戏溺。
變量的賦值可以分為三個階段:
創(chuàng)建變量渣蜗,在內(nèi)存中開辟空間
初始化變量,將變量初始化為
undefined
真正賦值
關于let
旷祸、var
和function
:
let
的「創(chuàng)建」過程被提升了耕拷,但是初始化沒有提升。var
的「創(chuàng)建」和「初始化」都被提升了托享。function
的「創(chuàng)建」「初始化」和「賦值」都被提升了骚烧。
2. 下面代碼的輸出是什么?
for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1);}for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1);}
A:
0 1 2
and0 1 2
B:
0 1 2
and3 3 3
C:
3 3 3
and0 1 2
答案: C
由于JavaScript
中的事件執(zhí)行機制,setTimeout
函數(shù)真正被執(zhí)行時闰围,循環(huán)已經(jīng)走完赃绊。 由于第一個循環(huán)中的變量i
是使用var
關鍵字聲明的,因此該值是全局的羡榴。 在循環(huán)期間碧查,我們每次使用一元運算符++
都會將i
的值增加1
。 因此在第一個例子中校仑,當調(diào)用setTimeout
函數(shù)時忠售,i
已經(jīng)被賦值為3
。
在第二個循環(huán)中迄沫,使用let
關鍵字聲明變量i
:使用let
(和const
)關鍵字聲明的變量是具有塊作用域的(塊是{}
之間的任何東西)稻扬。 在每次迭代期間,i
將被創(chuàng)建為一個新值邢滑,并且每個值都會存在于循環(huán)內(nèi)的塊級作用域腐螟。
3. 下面代碼的輸出是什么?
const shape = { radius: 10, diameter() { return this.radius * 2; }, perimeter: () => 2 * Math.PI * this.radius};shape.diameter();shape.perimeter();
A:
20
and62.83185307179586
B:
20
andNaN
C:
20
and63
D:
NaN
and63
答案: B
請注意愿汰,diameter
是普通函數(shù),而perimeter
是箭頭函數(shù)乐纸。
對于箭頭函數(shù)衬廷,this
關鍵字指向是它所在上下文(定義時的位置)的環(huán)境,與普通函數(shù)不同汽绢! 這意味著當我們調(diào)用perimeter
時吗跋,它不是指向shape
對象,而是指其定義時的環(huán)境(window)宁昭。沒有值radius
屬性跌宛,返回undefined
。
4. 下面代碼的輸出是什么?
+true;!"Lydia";
A:
1
andfalse
B:
false
andNaN
C:
false
andfalse
答案: A
一元加號會嘗試將boolean
類型轉換為數(shù)字類型积仗。 true
被轉換為1
疆拘,false
被轉換為0
。
字符串'Lydia'
是一個真值寂曹。 我們實際上要問的是“這個真值是假的嗎哎迄?”。 這會返回false
隆圆。
5. 哪個選項是不正確的?
const bird = { size: "small"};const mouse = { name: "Mickey", small: true};
A:
mouse.bird.size
B:
mouse[bird.size]
C:
mouse[bird["size"]]
D: All of them are valid
答案: A
在JavaScript
中漱挚,所有對象鍵都是字符串(除了Symbol
)。盡管有時我們可能不會給定字符串類型渺氧,但它們總是被轉換為字符串旨涝。
JavaScript
解釋語句。當我們使用方括號表示法時侣背,它會看到第一個左括號[
白华,然后繼續(xù),直到找到右括號]
秃踩。只有在那個時候衬鱼,它才會對這個語句求值。
mouse [bird.size]
:首先它會對bird.size
求值憔杨,得到small
鸟赫。 mouse [“small”]
返回true
。
但是消别,使用點表示法抛蚤,這不會發(fā)生。 mouse
沒有名為bird
的鍵寻狂,這意味著mouse.bird
是undefined
岁经。 然后,我們使用點符號來詢問size
:mouse.bird.size
蛇券。 由于mouse.bird
是undefined
缀壤,我們實際上是在詢問undefined.size
樊拓。 這是無效的,并將拋出Cannot read property "size" of undefined
塘慕。
6. 下面代碼的輸出是什么?
let c = { greeting: "Hey!" };
let d;
d = c;
c.greeting = "Hello";
console.log(d.greeting);
A:
Hello
B:
undefined
C:
ReferenceError
D:
TypeError
答案: A
在JavaScript
中筋夏,當設置它們彼此相等時,所有對象都通過引用進行交互图呢。
首先条篷,變量c
為對象保存一個值。 之后蛤织,我們將d
指定為c
與對象相同的引用赴叹。
更改一個對象時,可以更改所有對象指蚜。
7. 下面代碼的輸出是什么?
let a = 3
let b = new Number(3)
let c = 3
console.log(a == b)
console.log(a === b)
console.log(b === c)
A:
true
false
true
B:
false
false
true
C:
true
false
false
D:
false
true
true
答案: C
new Number()
是一個內(nèi)置的函數(shù)構造函數(shù)乞巧。 雖然它看起來像一個數(shù)字,但它并不是一個真正的數(shù)字:它有一堆額外的功能摊鸡,是一個對象摊欠。
當我們使用==
運算符時,它只檢查它是否具有相同的值柱宦。 他們都有3
的值,所以它返回true
播瞳。
譯者注:
==
會引發(fā)隱式類型轉換掸刊,右側的對象類型會自動拆箱為Number
類型。
然而赢乓,當我們使用===
操作符時忧侧,類型和值都需要相等,new Number()
不是一個數(shù)字牌芋,是一個對象類型蚓炬。兩者都返回 false
。
8. 下面代碼的輸出是什么?
class Chameleon {
static colorChange(newColor) {
this.newColor = newColor
}
constructor({ newColor = 'green' } = {}) {
this.newColor = newColor
}
}
const freddie = new Chameleon({ newColor: 'purple' })
freddie.colorChange('orange')
A:
orange
B:
purple
C:
green
D:
TypeError
答案: D
colorChange
方法是靜態(tài)的躺屁。 靜態(tài)方法僅在創(chuàng)建它們的構造函數(shù)中存在肯夏,并且不能傳遞給任何子級。 由于freddie
是一個子級對象犀暑,函數(shù)不會傳遞驯击,所以在freddie
實例上不存在freddie
方法:拋出TypeError
。
9. 下面代碼的輸出是什么?
let greeting
greetign = {} // Typo!console.log(greetign);
A:
{}
B:
ReferenceError: greetign is not defined
C:
undefined
答案: A
控制臺會輸出空對象耐亏,因為我們剛剛在全局對象上創(chuàng)建了一個空對象徊都! 當我們錯誤地將greeting
輸入為greetign
時,JS解釋器實際上在瀏覽器中將其視為global.greetign = {}
(或window.greetign = {}
)广辰。
為了避免這種情況暇矫,我們可以使用“use strict”
主之。 這可以確保在將變量賦值之前必須聲明變量。
10. 當我們這樣做時會發(fā)生什么?
function bark() { console.log("Woof!");}bark.animal = "dog";
A: Nothing, this is totally fine!
B:
SyntaxError
. You cannot add properties to a function this way.C:
undefined
D:
ReferenceError
答案: A
這在JavaScript
中是可能的李根,因為函數(shù)也是對象2坜取(原始類型之外的所有東西都是對象)
函數(shù)是一種特殊類型的對象。您自己編寫的代碼并不是實際的函數(shù)朱巨。 該函數(shù)是具有屬性的對象史翘,此屬性是可調(diào)用的。
11. 下面代碼的輸出是什么?
function Person(firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
const member = new Person('Lydia', 'Hallie')
Person.getFullName = () => this.firstName + this.lastName
console.log(member.getFullName())
A:
TypeError
B:
SyntaxError
C:
Lydia Hallie
D:
undefined
undefined
答案: A
您不能像使用常規(guī)對象那樣向構造函數(shù)添加屬性冀续。 如果要一次向所有對象添加功能琼讽,則必須使用原型。 所以在這種情況下應該這樣寫:
Person.prototype.getFullName = function() {
return `${this.firstName} ${this.lastName}`
}
這樣會使member.getFullName()
是可用的洪唐,為什么樣做是對的钻蹬? 假設我們將此方法添加到構造函數(shù)本身。 也許不是每個Person
實例都需要這種方法凭需。這會浪費大量內(nèi)存空間问欠,因為它們?nèi)匀痪哂性搶傩裕@占用了每個實例的內(nèi)存空間粒蜈。 相反顺献,如果我們只將它添加到原型中,我們只需將它放在內(nèi)存中的一個位置枯怖,但它們都可以訪問它注整!
12. 下面代碼的輸出是什么?
function Person(firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
const lydia = new Person('Lydia', 'Hallie')
const sarah = Person('Sarah', 'Smith')
console.log(lydia)
console.log(sarah)
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
答案: A
對于sarah
,我們沒有使用new
關鍵字度硝。 使用new
時肿轨,它指的是我們創(chuàng)建的新空對象。 但是蕊程,如果你不添加new
它指的是全局對象椒袍!
我們指定了this.firstName
等于'Sarah
和this.lastName
等于Smith
。 我們實際做的是定義global.firstName ='Sarah'
和global.lastName ='Smith
藻茂。 sarah
本身的返回值是undefined
驹暑。
12. 事件傳播的三個階段是什么??
A: 目標 > 捕獲 > 冒泡
B: 冒泡 > 目標 > 捕獲
C: 目標 > 冒泡 > 捕獲
D: 捕獲 > 目標 > 冒泡
答案: D
在捕獲階段辨赐,事件通過父元素向下傳遞到目標元素岗钩。 然后它到達目標元素,冒泡開始肖油。
13. 所有對象都有原型.
A: 對
B: 錯誤
答案: B
除基礎對象外兼吓,所有對象都有原型。 基礎對象可以訪問某些方法和屬性森枪,例如.toString
视搏。 這就是您可以使用內(nèi)置JavaScript
方法的原因审孽! 所有這些方法都可以在原型上找到。 雖然JavaScript
無法直接在您的對象上找到它浑娜,但它會沿著原型鏈向下尋找并在那里找到它佑力,這使您可以訪問它。
譯者注:基礎對象指原型鏈終點的對象筋遭〈虿基礎對象的原型是null
。
14. 下面代碼的輸出是什么?
function sum(a, b) { return a + b;}sum(1, "2");
A:
NaN
B:
TypeError
C:
"12"
D:
3
答案: C
JavaScript
是一種動態(tài)類型語言:我們沒有指定某些變量的類型漓滔。 在您不知情的情況下肴焊,值可以自動轉換為另一種類型役首,稱為隱式類型轉換。 強制從一種類型轉換為另一種類型。
在此示例中伤塌,JavaScript
將數(shù)字1
轉換為字符串屯援,以使函數(shù)有意義并返回值茎杂。 在讓數(shù)字類型(1
)和字符串類型('2'
)相加時惫恼,該數(shù)字被視為字符串。 我們可以連接像“Hello”+“World”
這樣的字符串琳骡,所以這里發(fā)生的是“1”+“2”
返回“12”
锅论。
15. 下面代碼的輸出是什么?
let number = 0
console.log(number++)
console.log(++number)
console.log(number)
A:
1
1
2
B:
1
2
2
C:
0
2
2
D:
0
1
2
答案: C
后綴一元運算符++
:
返回值(返回
0
)增加值(數(shù)字現(xiàn)在是
1
)
前綴一元運算符++
:
增加值(數(shù)字現(xiàn)在是
2
)返回值(返回
2
)
所以返回0 2 2
。
16. 下面代碼的輸出是什么?
function getPersonInfo(one, two, three) {
console.log(one)
console.log(two)
console.log(three)
}
const person = 'Lydia'
const age = 21
getPersonInfo`${person} is ${age} years old`
A:
Lydia
21
["", "is", "years old"]
B:
["", "is", "years old"]
Lydia
21
C:
Lydia
["", "is", "years old"]
21
答案: B
如果使用標記的模板字符串楣号,則第一個參數(shù)的值始終是字符串值的數(shù)組棍厌。 其余參數(shù)獲取傳遞到模板字符串中的表達式的值!
17. 下面代碼的輸出是什么?
function checkAge(data) {
if (data === { age: 18 }) {
console.log('You are an adult!')
} else if (data == { age: 18 }) {
console.log('You are still an adult.')
} else {
console.log(`Hmm.. You don't have an age I guess`)
}
}
checkAge({ age: 18 })
A:
You are an adult!
B:
You are still an adult.
C:
Hmm.. You don't have an age I guess
答案: C
在比較相等性竖席,原始類型通過它們的值進行比較,而對象通過它們的引用進行比較敬肚。JavaScript
檢查對象是否具有對內(nèi)存中相同位置的引用毕荐。
我們作為參數(shù)傳遞的對象和我們用于檢查相等性的對象在內(nèi)存中位于不同位置,所以它們的引用是不同的艳馒。
這就是為什么{ age: 18 } === { age: 18 }
和 { age: 18 } == { age: 18 }
返回 false
的原因憎亚。
18. 下面代碼的輸出是什么?
function getAge(...args) { console.log(typeof args);}getAge(21);
A:
"number"
B:
"array"
C:
"object"
D:
"NaN"
答案: C
擴展運算符(... args
)返回一個帶參數(shù)的數(shù)組。 數(shù)組是一個對象弄慰,因此typeof args
返回object
第美。
20. 下面代碼的輸出是什么?
function getAge() {
'use strict'
age = 21
console.log(age)
}
getAge()
A:
21
B:
undefined
C:
ReferenceError
D:
TypeError
答案: C
使用“use strict”
,可以確保不會意外地聲明全局變量陆爽。 我們從未聲明變量age
什往,因為我們使用``use strict',它會引發(fā)一個
ReferenceError慌闭。 如果我們不使用
“use strict”别威,它就會起作用躯舔,因為屬性
age`會被添加到全局對象中。
21. 下面代碼的輸出是什么?
const sum = eval("10*10+5");
A:
105
B:
"105"
C:
TypeError
D:
"10*10+5"
答案: A
eval
會為字符串傳遞的代碼求值省古。 如果它是一個表達式粥庄,就像在這種情況下一樣,它會計算表達式豺妓。 表達式為10 * 10 + 5
計算得到105
惜互。
22. cool_secret可以訪問多長時間?
sessionStorage.setItem("cool_secret", 123);
A:永遠,數(shù)據(jù)不會丟失琳拭。
B:用戶關閉選項卡時训堆。
C:當用戶關閉整個瀏覽器時,不僅是選項卡臀栈。
D:用戶關閉計算機時蔫慧。
答案: B
關閉選項卡后,將刪除存儲在sessionStorage
中的數(shù)據(jù)权薯。
如果使用localStorage
姑躲,數(shù)據(jù)將永遠存在,除非例如調(diào)用localStorage.clear()
盟蚣。
23. 下面代碼的輸出是什么?
var num = 8;var num = 10;console.log(num);
A:
8
B:
10
C:
SyntaxError
D:
ReferenceError
答案: B
使用var
關鍵字黍析,您可以用相同的名稱聲明多個變量。然后變量將保存最新的值屎开。
您不能使用let
或const
來實現(xiàn)這一點阐枣,因為它們是塊作用域的。
24. 下面代碼的輸出是什么?
const obj = { 1: 'a', 2: 'b', 3: 'c' }
const set = new Set([1, 2, 3, 4, 5])
obj.hasOwnProperty('1')
obj.hasOwnProperty(1)
set.has('1')
set.has(1)
A:
false
true
false
true
B:
false
true
true
true
C:
true
true
false
true
D:
true
true
true
true
答案: C
所有對象鍵(不包括Symbols
)都會被存儲為字符串奄抽,即使你沒有給定字符串類型的鍵蔼两。 這就是為什么obj.hasOwnProperty('1')
也返回true
。
上面的說法不適用于Set
逞度。 在我們的Set
中沒有“1”
:set.has('1')
返回false
额划。 它有數(shù)字類型1
,set.has(1)
返回true
档泽。
25. 下面代碼的輸出是什么?
const obj = { a: 'one', b: 'two', a: 'three' }
console.log(obj)
A:
{ a: "one", b: "two" }
B:
{ b: "two", a: "three" }
C:
{ a: "three", b: "two" }
D:
SyntaxError
答案: C
如果對象有兩個具有相同名稱的鍵俊戳,則將替前面的鍵。它仍將處于第一個位置馆匿,但具有最后指定的值抑胎。
26. JavaScript全局執(zhí)行上下文為你創(chuàng)建了兩個東西:全局對象和this關鍵字.
A: 對
B: 錯誤
C: 視情況而定
答案: A
基本執(zhí)行上下文是全局執(zhí)行上下文:它是代碼中隨處可訪問的內(nèi)容。
27. 下面代碼的輸出是什么?
for (let i = 1; i < 5; i++) {
if (i === 3) continue
console.log(i)
}
A:
1
2
B:
1
2
3
C:
1
2
4
D:
1
3
4
答案: C
如果某個條件返回true
渐北,則continue
語句跳過迭代阿逃。
28. 下面代碼的輸出是什么?
String.prototype.giveLydiaPizza = () => {
return 'Just give Lydia pizza already!'
}
const name = 'Lydia'
name.giveLydiaPizza()
A:
"Just give Lydia pizza already!"
B:
TypeError: not a function
C:
SyntaxError
D:
undefined
答案: A
String
是一個內(nèi)置的構造函數(shù),我們可以為它添加屬性。 我剛給它的原型添加了一個方法盆昙。 原始類型的字符串自動轉換為字符串對象羽历,由字符串原型函數(shù)生成。 因此淡喜,所有字符串(字符串對象)都可以訪問該方法秕磷!
譯者注:
當使用基本類型的字符串調(diào)用giveLydiaPizza
時,實際上發(fā)生了下面的過程:
創(chuàng)建一個
String
的包裝類型實例在實例上調(diào)用
substring
方法銷毀實例
29. 下面代碼的輸出是什么?
const a = {}
const b = { key: 'b' }
const c = { key: 'c' }
a[b] = 123
a[c] = 456
console.log(a[b])
A:
123
B:
456
C:
undefined
D:
ReferenceError
答案: B
對象鍵自動轉換為字符串炼团。我們試圖將一個對象設置為對象a
的鍵澎嚣,其值為123
。
但是瘟芝,當對象自動轉換為字符串化時易桃,它變成了[Object object]
。 所以我們在這里說的是a["Object object"] = 123
锌俱。 然后晤郑,我們可以嘗試再次做同樣的事情。 c
對象同樣會發(fā)生隱式類型轉換贸宏。那么造寝,a["Object object"] = 456
。
然后吭练,我們打印a[b]
诫龙,它實際上是a["Object object"]
。 我們將其設置為456
鲫咽,因此返回456
签赃。
30. 下面代碼的輸出是什么?
const foo = () => console.log('First')
const bar = () => setTimeout(() => console.log('Second'))
const baz = () => console.log('Third')
bar()
foo()
baz()
A:
First
Second
Third
B:
First
Third
Second
C:
Second
First
Third
D:
Second
Third
First
答案: B
我們有一個setTimeout
函數(shù)并首先調(diào)用它。 然而卻最后打印了它分尸。
這是因為在瀏覽器中锦聊,我們不只有運行時引擎,我們還有一個叫做WebAPI
的東西箩绍。WebAPI
為我們提供了setTimeout
函數(shù)孔庭,例如DOM
。
將callback
推送到WebAPI
后伶选,setTimeout
函數(shù)本身(但不是回調(diào)!)從堆棧中彈出尖昏。
現(xiàn)在仰税,調(diào)用foo
,并打印First
抽诉。
foo
從堆棧彈出陨簇,baz
被調(diào)用,并打印Third
。
WebAPI
不能只是在準備就緒時將內(nèi)容添加到堆棧中河绽。 相反己单,它將回調(diào)函數(shù)推送到一個稱為任務隊列
的東西。
這是事件循環(huán)開始工作的地方耙饰。 事件循環(huán)查看堆棧和任務隊列纹笼。 如果堆棧為空,則會占用隊列中的第一個內(nèi)容并將其推送到堆棧中苟跪。
bar
被調(diào)用廷痘,Second
被打印,它從棧中彈出件已。
31. 單擊按鈕時event.target是什么?
<div onclick="console.log('first div')">
<div onclick="console.log('second div')">
<button onclick="console.log('button')">Click!</button>
</div>
</div>
A:
div
外部B:
div
內(nèi)部C:
button
D: 所有嵌套元素的數(shù)組.
答案: C
導致事件的最深嵌套元素是事件的目標笋额。 你可以通過event.stopPropagation
停止冒泡
32. 單擊下面的html片段打印的內(nèi)容是什么?
<div onclick="console.log('div')">
<p onclick="console.log('p')">Click here!</p>
</div>
A:
p
div
B:
div
p
C:
p
D:
div
答案: A
如果我們單擊p
,我們會看到兩個日志:p
和div
篷扩。在事件傳播期間兄猩,有三個階段:捕獲,目標和冒泡鉴未。 默認情況下枢冤,事件處理程序在冒泡階段執(zhí)行(除非您將useCapture
設置為true
)。 它從最深的嵌套元素向外延伸歼狼。
33. 下面代碼的輸出是什么?
const person = { name: 'Lydia' }
function sayHi(age) {
console.log(`${this.name} is ${age}`)
}
sayHi.call(person, 21)
sayHi.bind(person, 21)
A:
undefined is 21
Lydia is 21
B:
function
function
C:
Lydia is 21
Lydia is 21
D:
Lydia is 21
function
答案: D
使用兩者掏导,我們可以傳遞我們想要this
關鍵字引用的對象。 但是羽峰,.call
方法會立即執(zhí)行趟咆!
.bind
方法會返回函數(shù)的拷貝值,但帶有綁定的上下文梅屉! 它不會立即執(zhí)行值纱。
34. 下面代碼的輸出是什么?
function sayHi() {
return (() => 0)()
}
typeof sayHi()
A:
"object"
B:
"number"
C:
"function"
D:
"undefined"
答案: B
sayHi
函數(shù)返回立即調(diào)用的函數(shù)(IIFE
)的返回值。 該函數(shù)返回0
坯汤,類型為數(shù)字
虐唠。
僅供參考:只有7種內(nèi)置類型:null
,undefined
惰聂,boolean
疆偿,number
,string
搓幌,object
和symbol
杆故。 function
不是一個類型,因為函數(shù)是對象溉愁,它的類型是object
处铛。
35. 下面這些值哪些是假值?
0;new Number(0);("");(" ");new Boolean(false);undefined;
A:
0
,''
,undefined
B:
0
,new Number(0)
,''
,new Boolean(false)
,undefined
C:
0
,''
,new Boolean(false)
,undefined
D: 所有都是假值
答案: A
JavaScript
中只有6個假值:
undefined
null
NaN
0
''
(empty string)false
函數(shù)構造函數(shù),如new Number
和new Boolean
都是真值。
36. 下面代碼的輸出是什么?
console.log(typeof typeof 1);
A:
"number"
B:
"string"
C:
"object"
D:
"undefined"
答案: B
typeof 1
返回 "number"
.
typeof "number"
返回 "string"
37. 下面代碼的輸出是什么?
const numbers = [1, 2, 3]
numbers[10] = 11
console.log(numbers)
A:
[1, 2, 3, 7 x null, 11]
B:
[1, 2, 3, 11]
C:
[1, 2, 3, 7 x empty, 11]
D:
SyntaxError
答案: C
When you set a value to an element in an array that exceeds the length of the array, JavaScript creates something called "empty slots". These actually have the value of undefined
, but you will see something like:
當你為數(shù)組中的元素設置一個超過數(shù)組長度的值時撤蟆,JavaScript
會創(chuàng)建一個名為“空插槽”的東西奕塑。 這些位置的值實際上是undefined
,但你會看到類似的東西:
[1, 2, 3, 7 x empty, 11]
這取決于你運行它的位置(每個瀏覽器有可能不同)家肯。
38. 下面代碼的輸出是什么?
;(() => {
let x, y
try {
throw new Error()
} catch (x) {
;(x = 1), (y = 2)
console.log(x)
}
console.log(x)
console.log(y)
})()
A:
1
undefined
2
B:
undefined
undefined
undefined
C:
1
1
2
D:
1
undefined
undefined
答案: A
catch
塊接收參數(shù)x
龄砰。當我們傳遞參數(shù)時,這與變量的x
不同息楔。這個變量x
是屬于catch
作用域的寝贡。
之后,我們將這個塊級作用域的變量設置為1
值依,并設置變量y
的值圃泡。 現(xiàn)在,我們打印塊級作用域的變量x
愿险,它等于1
颇蜡。
在catch
塊之外,x
仍然是undefined
辆亏,而y
是2
风秤。 當我們想在catch
塊之外的console.log(x)
時,它返回undefined
扮叨,而y
返回2
缤弦。
39. JavaScript中的所有內(nèi)容都是…
A:原始或?qū)ο?/p>
B:函數(shù)或?qū)ο?/p>
C:技巧問題!只有對象
D:數(shù)字或?qū)ο?/p>
答案: A
JavaScript
只有原始類型和對象彻磁。
原始類型是boolean
碍沐,null
,undefined
衷蜓,bigint
累提,number
,string
和symbol
磁浇。
40. 下面代碼的輸出是什么?
[[0, 1], [2, 3]].reduce( (acc, cur) => { return acc.concat(cur); }, [1, 2]);
A:
[0, 1, 2, 3, 1, 2]
B:
[6, 1, 2]
C:
[1, 2, 0, 1, 2, 3]
D:
[1, 2, 6]
答案: C
[1,2]
是我們的初始值斋陪。 這是我們開始執(zhí)行reduce
函數(shù)的初始值,以及第一個acc
的值置吓。 在第一輪中无虚,acc
是[1,2]
,cur
是[0,1]
衍锚。 我們將它們連接起來友题,結果是[1,2,0,1]
。
然后构拳,acc
的值為[1,2,0,1]
咆爽,cur
的值為[2,3]
。 我們將它們連接起來置森,得到[1,2,0,1,2,3]
斗埂。
41. 下面代碼的輸出是什么?
!!null;!!"";!!1;
A:
false
true
false
B:
false
false
true
C:
false
true
true
D:
true
true
false
答案: B
null
是假值。 !null
返回true
凫海。 !true
返回false
呛凶。
""
是假值。 !""
返回true
行贪。 !true
返回false
漾稀。
1
是真值。 !1
返回false
建瘫。 !false
返回true
崭捍。
42. setInterval
方法的返回值什么?
setInterval(() => console.log("Hi"), 1000);
A:一個唯一的
id
B:指定的毫秒數(shù)
C:傳遞的函數(shù)
D:
undefined
答案: A
它返回一個唯一的id
。 此id
可用于使用clearInterval()
函數(shù)清除該定時器啰脚。
43. What does this return?
[..."Lydia"];
A:
["L", "y", "d", "i", "a"]
B:
["Lydia"]
C:
[[], "Lydia"]
D:
[["L", "y", "d", "i", "a"]]
答案: A
字符串是可迭代的殷蛇。 擴展運算符將迭代的每個字符映射到一個元素。