送你 43 道 JavaScript 面試題


送你 43 道 JavaScript 面試題


導讀


送你 43 道 JavaScript 面試題


這兩天的GitHub Trending repositories被一個名叫 javascript-questions的項目霸榜了,項目中記錄了一些JavaScript題目。


送你 43 道 JavaScript 面試題


我大概從頭到尾看了一遍,都是一些基礎的題目,我大概花了半個小時(有些題很簡單,可以一掃而過)把這些題做完了,雖然題目很簡單,但是每道題都對應一個知識點,如果這個知識點你沒有接觸過,那肯定會做錯,如果你接觸過這些知識點,那麼這些題對你來說就很容易。

建議大家也花半個小時來做一做,以便查漏補缺。

為方便大家能夠更快的做題,而不把時間浪費在翻譯上,我又花了幾個小時把它們翻譯成了中文,當然已經獲得了作者授權。


送你 43 道 JavaScript 面試題

文中有些點作者解釋的不太完整,為了更好的理解,我在文中添加了一些個人解釋。

倉庫地址:https://github.com/lydiahallie/javascript-questions

JavaScript 進階問題列表

我在我的Instagram上發佈了每日JavaScript選擇題,我也會在這裡發佈!

從基礎到高級:測試您對JavaScript的瞭解程度,刷新您的知識,或為您的編碼面試做好準備! 我每週用新問題更新這個項目。

答案位於問題下方的摺疊部分,只需單擊它們即可展開。 祝你好運❤️


1. 下面代碼的輸出是什麼?

<code>function sayHi() {
console.log(name);
console.log(age);
var name = "Lydia";
let age = 21;
}

sayHi();
複製代碼/<code>
  • A: Lydia 和 undefined
  • B: Lydia 和 ReferenceError
  • C: ReferenceError 和 21
  • D: undefined 和 ReferenceError

答案


答案: D

在函數中,我們首先使用var關鍵字聲明瞭name變量。 這意味著變量在創建階段會被提升(JavaScript會在創建變量創建階段為其分配內存空間),默認值為undefined,直到我們實際執行到使用該變量的行。 我們還沒有為name變量賦值,所以它仍然保持undefined的值。

使用let關鍵字(和const)聲明的變量也會存在變量提升,但與var不同,初始化沒有被提升。 在我們聲明(初始化)它們之前,它們是不可訪問的。 這被稱為“暫時死區”。 當我們在聲明變量之前嘗試訪問變量時,JavaScript會拋出一個ReferenceError。

譯者注:

關於let的是否存在變量提升,我們可以用下面的例子來驗證:

<code>let name = 'ConardLi'
{
console.log(name) // Uncaught ReferenceError: name is not defined
let name = 'code秘密花園'
}
複製代碼/<code>

let變量如果不存在變量提升,console.log(name)就會輸出ConardLi,結果卻拋出了ReferenceError,那麼這很好的說明了,let也存在變量提升,但是它存在一個“暫時死區”,在變量未初始化或賦值前不允許訪問。

變量的賦值可以分為三個階段:

  • 創建變量,在內存中開闢空間
  • 初始化變量,將變量初始化為undefined
  • 真正賦值

關於let、var和function:

  • let 的「創建」過程被提升了,但是初始化沒有提升。
  • var 的「創建」和「初始化」都被提升了。
  • function 的「創建」「初始化」和「賦值」都被提升了。



2. 下面代碼的輸出是什麼?

<code>for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1);
}

for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1);
}
複製代碼/<code>
  • A: 0 1 2 and 0 1 2
  • B: 0 1 2 and 3 3 3
  • C: 3 3 3 and 0 1 2

答案


答案: C

由於JavaScript中的事件執行機制,setTimeout函數真正被執行時,循環已經走完。 由於第一個循環中的變量i是使用var關鍵字聲明的,因此該值是全局的。 在循環期間,我們每次使用一元運算符++都會將i的值增加1。 因此在第一個例子中,當調用setTimeout函數時,i已經被賦值為3。

在第二個循環中,使用let關鍵字聲明變量i:使用let(和const)關鍵字聲明的變量是具有塊作用域的(塊是{}之間的任何東西)。 在每次迭代期間,i將被創建為一個新值,並且每個值都會存在於循環內的塊級作用域。



3. 下面代碼的輸出是什麼?

<code>const shape = {
radius: 10,
diameter() {
return this.radius * 2;
},
perimeter: () => 2 * Math.PI * this.radius

};

shape.diameter();
shape.perimeter();
複製代碼/<code>
  • A: 20 and 62.83185307179586
  • B: 20 and NaN
  • C: 20 and 63
  • D: NaN and 63

答案


答案: B

請注意,diameter是普通函數,而perimeter是箭頭函數。

對於箭頭函數,this關鍵字指向是它所在上下文(定義時的位置)的環境,與普通函數不同! 這意味著當我們調用perimeter時,它不是指向shape對象,而是指其定義時的環境(window)。沒有值radius屬性,返回undefined。



4. 下面代碼的輸出是什麼?

<code>+true;
!"Lydia";
複製代碼/<code>
  • A: 1 and false
  • B: false and NaN
  • C: false and false

答案


答案: A

一元加號會嘗試將boolean類型轉換為數字類型。 true被轉換為1,false被轉換為0。

字符串'Lydia'是一個真值。 我們實際上要問的是“這個真值是假的嗎?”。 這會返回false。



5. 哪個選項是不正確的?

<code>const bird = {
size: "small"
};

const mouse = {
name: "Mickey",
small: true
};
複製代碼/<code>
  • A: mouse.bird.size
  • B: mouse[bird.size]
  • C: mouse[bird["size"]]
  • D: All of them are valid

答案


答案: A

在JavaScript中,所有對象鍵都是字符串(除了Symbol)。儘管有時我們可能不會給定字符串類型,但它們總是被轉換為字符串。

JavaScript解釋語句。當我們使用方括號表示法時,它會看到第一個左括號[,然後繼續,直到找到右括號]。只有在那個時候,它才會對這個語句求值。

mouse [bird.size]:首先它會對bird.size求值,得到small。 mouse [“small”]返回true。

但是,使用點表示法,這不會發生。 mouse沒有名為bird的鍵,這意味著mouse.bird是undefined。 然後,我們使用點符號來詢問size:mouse.bird.size。 由於mouse.bird是undefined,我們實際上是在詢問undefined.size。 這是無效的,並將拋出Cannot read property "size" of undefined。




6. 下面代碼的輸出是什麼?

<code>let c = { greeting: "Hey!" };
let d;

d = c;
c.greeting = "Hello";
console.log(d.greeting);
複製代碼/<code>
  • A: Hello
  • B: undefined
  • C: ReferenceError
  • D: TypeError

答案


答案: A

在JavaScript中,當設置它們彼此相等時,所有對象都通過引用進行交互。

首先,變量c為對象保存一個值。 之後,我們將d指定為c與對象相同的引用。

送你 43 道 JavaScript 面試題

更改一個對象時,可以更改所有對象。



7. 下面代碼的輸出是什麼?

<code>let a = 3;
let b = new Number(3);
let c = 3;

console.log(a == b);
console.log(a === b);
console.log(b === c);
複製代碼/<code>
  • A: true false true
  • B: false false true
  • C: true false false
  • D: false true true

答案


答案: C

new Number()是一個內置的函數構造函數。 雖然它看起來像一個數字,但它並不是一個真正的數字:它有一堆額外的功能,是一個對象。

當我們使用==運算符時,它只檢查它是否具有相同的值。 他們都有3的值,所以它返回true。

譯者注:==會引發隱式類型轉換,右側的對象類型會自動拆箱為Number類型。

然而,當我們使用===操作符時,類型和值都需要相等,new Number()不是一個數字,是一個對象類型。兩者都返回 false。



8. 下面代碼的輸出是什麼?

<code>class Chameleon {
static colorChange(newColor) {
this.newColor = newColor;
}

constructor({ newColor = "green" } = {}) {
this.newColor = newColor;
}
}

const freddie = new Chameleon({ newColor: "purple" });
freddie.colorChange("orange");
複製代碼/<code>
  • A: orange
  • B: purple
  • C: green
  • D: TypeError

答案


答案: D

colorChange方法是靜態的。 靜態方法僅在創建它們的構造函數中存在,並且不能傳遞給任何子級。 由於freddie是一個子級對象,函數不會傳遞,所以在freddie實例上不存在freddie方法:拋出TypeError。



9. 下面代碼的輸出是什麼?

<code>let greeting;
greetign = {}; // Typo!
console.log(greetign);
複製代碼/<code>
  • A: {}
  • B: ReferenceError: greetign is not defined
  • C: undefined

答案


答案: A

控制檯會輸出空對象,因為我們剛剛在全局對象上創建了一個空對象! 當我們錯誤地將greeting輸入為greetign時,JS解釋器實際上在瀏覽器中將其視為global.greetign = {}(或window.greetign = {})。

為了避免這種情況,我們可以使用“use strict”。 這可以確保在將變量賦值之前必須聲明變量。



10. 當我們這樣做時會發生什麼?

<code>function bark() {
console.log("Woof!");
}

bark.animal = "dog";
複製代碼/<code>
  • A: Nothing, this is totally fine!
  • B: SyntaxError. You cannot add properties to a function this way.
  • C: undefined
  • D: ReferenceError

答案


答案: A

這在JavaScript中是可能的,因為函數也是對象!(原始類型之外的所有東西都是對象)

函數是一種特殊類型的對象。您自己編寫的代碼並不是實際的函數。 該函數是具有屬性的對象,此屬性是可調用的。



11. 下面代碼的輸出是什麼?

<code>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());
複製代碼/<code>
  • A: TypeError
  • B: SyntaxError
  • C: Lydia Hallie
  • D: undefined undefined

答案


答案: A

您不能像使用常規對象那樣向構造函數添加屬性。 如果要一次向所有對象添加功能,則必須使用原型。 所以在這種情況下應該這樣寫:

<code>Person.prototype.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
}
複製代碼/<code>

這樣會使member.getFullName()是可用的,為什麼樣做是對的? 假設我們將此方法添加到構造函數本身。 也許不是每個Person實例都需要這種方法。這會浪費大量內存空間,因為它們仍然具有該屬性,這佔用了每個實例的內存空間。 相反,如果我們只將它添加到原型中,我們只需將它放在內存中的一個位置,但它們都可以訪問它!



12. 下面代碼的輸出是什麼?

<code>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);
複製代碼/<code>
  • A: Person {firstName: "Lydia", lastName: "Hallie"} and undefined
  • B: Person {firstName: "Lydia", lastName: "Hallie"} and Person {firstName: "Sarah", lastName: "Smith"}
  • C: Person {firstName: "Lydia", lastName: "Hallie"} and {}
  • D:Person {firstName: "Lydia", lastName: "Hallie"} and ReferenceError

答案


答案: A

對於sarah,我們沒有使用new關鍵字。 使用new時,它指的是我們創建的新空對象。 但是,如果你不添加new它指的是全局對象!

我們指定了this.firstName等於'Sarah和this.lastName等於Smith。 我們實際做的是定義global.firstName ='Sarah'和global.lastName ='Smith。 sarah本身的返回值是undefined。



12. 事件傳播的三個階段是什麼??

  • A: 目標 > 捕獲 > 冒泡
  • B: 冒泡 > 目標 > 捕獲
  • C: 目標 > 冒泡 > 捕獲
  • D: 捕獲 > 目標 > 冒泡

答案


答案: D

在捕獲階段,事件通過父元素向下傳遞到目標元素。 然後它到達目標元素,冒泡開始。

送你 43 道 JavaScript 面試題



13. 所有對象都有原型.

  • A: 對
  • B: 錯誤

答案


答案: B

基礎對象外,所有對象都有原型。 基礎對象可以訪問某些方法和屬性,例如.toString。 這就是您可以使用內置JavaScript方法的原因! 所有這些方法都可以在原型上找到。 雖然JavaScript無法直接在您的對象上找到它,但它會沿著原型鏈向下尋找並在那裡找到它,這使您可以訪問它。

譯者注:基礎對象指原型鏈終點的對象。基礎對象的原型是null。



14. 下面代碼的輸出是什麼?

<code>function sum(a, b) {
return a + b;
}

sum(1, "2");
複製代碼/<code>
  • A: NaN
  • B: TypeError
  • C: "12"
  • D: 3

答案


答案: C

JavaScript是一種動態類型語言:我們沒有指定某些變量的類型。 在您不知情的情況下,值可以自動轉換為另一種類型,稱為隱式類型轉換。 強制從一種類型轉換為另一種類型。

在此示例中,JavaScript將數字1轉換為字符串,以使函數有意義並返回值。 在讓數字類型(1)和字符串類型('2')相加時,該數字被視為字符串。 我們可以連接像“Hello”+“World”這樣的字符串,所以這裡發生的是“1”+“2”返回“12”。



15. 下面代碼的輸出是什麼?

<code>let number = 0;
console.log(number++);
console.log(++number);
console.log(number);
複製代碼/<code>
  • A: 1 1 2
  • B: 1 2 2
  • C: 0 2 2
  • D: 0 1 2

答案


答案: C

後綴一元運算符++:

  1. 返回值(返回0)
  2. 增加值(數字現在是1)

前綴一元運算符++:

  1. 增加值(數字現在是2)
  2. 返回值(返回2)

所以返回0 2 2。



16. 下面代碼的輸出是什麼?

<code>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`;
複製代碼/<code>
  • A: Lydia 21 ["", "is", "years old"]
  • B: ["", "is", "years old"] Lydia 21
  • C: Lydia ["", "is", "years old"] 21

答案


答案: B

如果使用標記的模板字符串,則第一個參數的值始終是字符串值的數組。 其餘參數獲取傳遞到模板字符串中的表達式的值!



17. 下面代碼的輸出是什麼?

<code>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 });

複製代碼/<code>
  • A: You are an adult!
  • B: You are still an adult.
  • C: Hmm.. You don't have an age I guess

答案


答案: C

在比較相等性,原始類型通過它們的值進行比較,而對象通過它們的引用進行比較。JavaScript檢查對象是否具有對內存中相同位置的引用。

我們作為參數傳遞的對象和我們用於檢查相等性的對象在內存中位於不同位置,所以它們的引用是不同的。

這就是為什麼{ age: 18 } === { age: 18 }和 { age: 18 } == { age: 18 } 返回 false的原因。



18. 下面代碼的輸出是什麼?

<code>function getAge(...args) {
console.log(typeof args);
}

getAge(21);
複製代碼/<code>
  • A: "number"
  • B: "array"
  • C: "object"
  • D: "NaN"

答案


答案: C

擴展運算符(... args)返回一個帶參數的數組。 數組是一個對象,因此typeof args返回object。



20. 下面代碼的輸出是什麼?

<code>function getAge() {
"use strict";
age = 21;
console.log(age);
}

getAge();
複製代碼/<code>
  • A: 21
  • B: undefined
  • C: ReferenceError
  • D: TypeError

答案


答案: C

使用“use strict”,可以確保不會意外地聲明全局變量。 我們從未聲明變量age,因為我們使用``use strict',它會引發一個ReferenceError。 如果我們不使用“use strict”,它就會起作用,因為屬性age`會被添加到全局對象中。



21. 下面代碼的輸出是什麼?

<code>const sum = eval("10*10+5");
複製代碼/<code>
  • A: 105
  • B: "105"
  • C: TypeError
  • D: "10*10+5"

答案


答案: A

eval會為字符串傳遞的代碼求值。 如果它是一個表達式,就像在這種情況下一樣,它會計算表達式。 表達式為10 * 10 + 5計算得到105。



22. cool_secret可以訪問多長時間?

<code>sessionStorage.setItem("cool_secret", 123);
複製代碼/<code>
  • A:永遠,數據不會丟失。
  • B:用戶關閉選項卡時。
  • C:當用戶關閉整個瀏覽器時,不僅是選項卡。
  • D:用戶關閉計算機時。

答案


答案: B

關閉選項卡後,將刪除存儲在sessionStorage中的數據。

如果使用localStorage,數據將永遠存在,除非例如調用localStorage.clear()。



23. 下面代碼的輸出是什麼?

<code>var num = 8;
var num = 10;

console.log(num);
複製代碼/<code>
  • A: 8
  • B: 10
  • C: SyntaxError
  • D: ReferenceError

答案


答案: B

使用var關鍵字,您可以用相同的名稱聲明多個變量。然後變量將保存最新的值。

您不能使用let或const來實現這一點,因為它們是塊作用域的。



24. 下面代碼的輸出是什麼?

<code>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);
複製代碼/<code>
  • 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。 它有數字類型1,set.has(1)返回true。



25. 下面代碼的輸出是什麼?

<code>const obj = { a: "one", b: "two", a: "three" };
console.log(obj);
複製代碼/<code>
  • A: { a: "one", b: "two" }
  • B: { b: "two", a: "three" }
  • C: { a: "three", b: "two" }
  • D: SyntaxError

答案


答案: C

如果對象有兩個具有相同名稱的鍵,則將替前面的鍵。它仍將處於第一個位置,但具有最後指定的值。



26. JavaScript全局執行上下文為你創建了兩個東西:全局對象和this關鍵字.

  • A: 對
  • B: 錯誤
  • C: 視情況而定

答案


答案: A

基本執行上下文是全局執行上下文:它是代碼中隨處可訪問的內容。



27. 下面代碼的輸出是什麼?

<code>for (let i = 1; i < 5; i++) {
if (i === 3) continue;
console.log(i);
}
複製代碼/<code>
  • A: 1 2
  • B: 1 2 3
  • C: 1 2 4
  • D: 1 3 4

答案


答案: C

如果某個條件返回true,則continue語句跳過迭代。



28. 下面代碼的輸出是什麼?

<code>String.prototype.giveLydiaPizza = () => {
return "Just give Lydia pizza already!";
};

const name = "Lydia";

name.giveLydiaPizza();
複製代碼/<code>
  • A: "Just give Lydia pizza already!"
  • B: TypeError: not a function
  • C: SyntaxError
  • D: undefined

答案


答案: A

String是一個內置的構造函數,我們可以為它添加屬性。 我剛給它的原型添加了一個方法。 原始類型的字符串自動轉換為字符串對象,由字符串原型函數生成。 因此,所有字符串(字符串對象)都可以訪問該方法!

譯者注:

當使用基本類型的字符串調用giveLydiaPizza時,實際上發生了下面的過程:

  • 創建一個String的包裝類型實例
  • 在實例上調用substring方法
  • 銷燬實例



29. 下面代碼的輸出是什麼?

<code>const a = {};
const b = { key: "b" };
const c = { key: "c" };

a[b] = 123;
a[c] = 456;

console.log(a[b]);
複製代碼/<code>
  • A: 123
  • B: 456
  • C: undefined
  • D: ReferenceError

答案


答案: B

對象鍵自動轉換為字符串。我們試圖將一個對象設置為對象a的鍵,其值為123。

但是,當對象自動轉換為字符串化時,它變成了[Object object]。 所以我們在這裡說的是a["Object object"] = 123。 然後,我們可以嘗試再次做同樣的事情。 c對象同樣會發生隱式類型轉換。那麼,a["Object object"] = 456。

然後,我們打印a[b],它實際上是a["Object object"]。 我們將其設置為456,因此返回456。



30. 下面代碼的輸出是什麼?

<code>const foo = () => console.log("First");
const bar = () => setTimeout(() => console.log("Second"));
const baz = () => console.log("Third");

bar();
foo();
baz();
複製代碼/<code>
  • 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函數本身(但不是回調!)從堆棧中彈出。

送你 43 道 JavaScript 面試題

現在,調用foo,並打印First。

送你 43 道 JavaScript 面試題

foo從堆棧彈出,baz被調用,並打印Third。

送你 43 道 JavaScript 面試題

WebAPI不能只是在準備就緒時將內容添加到堆棧中。 相反,它將回調函數推送到一個稱為任務隊列的東西。

送你 43 道 JavaScript 面試題

這是事件循環開始工作的地方。 事件循環查看堆棧和任務隊列。 如果堆棧為空,則會佔用隊列中的第一個內容並將其推送到堆棧中。

送你 43 道 JavaScript 面試題

bar被調用,Second被打印,它從棧中彈出。



31. 單擊按鈕時event.target是什麼?

<code>


<button>
Click!
/<button>


複製代碼/<code>
  • A: div外部
  • B: div內部
  • C: button
  • D: 所有嵌套元素的數組.

答案


答案: C

導致事件的最深嵌套元素是事件的目標。 你可以通過event.stopPropagation停止冒泡



32. 單擊下面的html片段打印的內容是什麼?

<code>


Click here!



複製代碼/<code>
  • A: p div
  • B: div p
  • C: p
  • D: div

答案


答案: A

如果我們單擊p,我們會看到兩個日誌:p和div。在事件傳播期間,有三個階段:捕獲,目標和冒泡。 默認情況下,事件處理程序在冒泡階段執行(除非您將useCapture設置為true)。 它從最深的嵌套元素向外延伸。



33. 下面代碼的輸出是什麼?

<code>const person = { name: "Lydia" };

function sayHi(age) {
console.log(`${this.name} is ${age}`);
}


sayHi.call(person, 21);
sayHi.bind(person, 21);
複製代碼/<code>
  • 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方法會立即執行!

.bind方法會返回函數的拷貝值,但帶有綁定的上下文! 它不會立即執行。



34. 下面代碼的輸出是什麼?

<code>function sayHi() {
return (() => 0)();
}

typeof sayHi();
複製代碼/<code>
  • A: "object"
  • B: "number"
  • C: "function"
  • D: "undefined"

答案


答案: B

sayHi函數返回立即調用的函數(IIFE)的返回值。 該函數返回0,類型為數字。

僅供參考:只有7種內置類型:null,undefined,boolean,number,string,object和symbol。 function不是一個類型,因為函數是對象,它的類型是object。



35. 下面這些值哪些是假值?

<code>0;
new Number(0);
("");
(" ");
new Boolean(false);
undefined;
複製代碼/<code>
  • 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

函數構造函數,如new Number和new Boolean都是真值。



36. 下面代碼的輸出是什麼?

<code>console.log(typeof typeof 1);
複製代碼/<code>
  • A: "number"
  • B: "string"
  • C: "object"
  • D: "undefined"

答案


答案: B

typeof 1 返回 "number". typeof "number" 返回 "string"



37. 下面代碼的輸出是什麼?

<code>const numbers = [1, 2, 3];
numbers[10] = 11;
console.log(numbers);
複製代碼/<code>
  • A: [1, 2, 3, 7 x null, 11]
  • B: [1, 2, 3, 11]
  • C: [1, 2, 3, 7 x empty, 11]
  • D: SyntaxError

答案


答案: C

當你為數組中的元素設置一個超過數組長度的值時,JavaScript會創建一個名為“空插槽”的東西。 這些位置的值實際上是undefined,但你會看到類似的東西:

[1, 2, 3, 7 x empty, 11]

這取決於你運行它的位置(每個瀏覽器有可能不同)。



38. 下面代碼的輸出是什麼?

<code>(() => {
let x, y;
try {
throw new Error();
} catch (x) {
(x = 1), (y = 2);
console.log(x);
}
console.log(x);
console.log(y);
})();
複製代碼/<code>
  • A: 1 undefined 2
  • B: undefined undefined undefined
  • C: 1 1 2
  • D: 1 undefined undefined

答案


答案: A

catch塊接收參數x。當我們傳遞參數時,這與變量的x不同。這個變量x是屬於catch作用域的。

之後,我們將這個塊級作用域的變量設置為1,並設置變量y的值。 現在,我們打印塊級作用域的變量x,它等於1。

在catch塊之外,x仍然是undefined,而y是2。 當我們想在catch塊之外的console.log(x)時,它返回undefined,而y返回2。



39. JavaScript中的所有內容都是...

  • A:原始或對象
  • B:函數或對象
  • C:技巧問題!只有對象
  • D:數字或對象

答案


答案: A

JavaScript只有原始類型和對象。

原始類型是boolean,null,undefined,bigint,number,string和symbol。



40. 下面代碼的輸出是什麼?

<code>[[0, 1], [2, 3]].reduce(
(acc, cur) => {
return acc.concat(cur);
},
[1, 2]
);
複製代碼/<code>
  • 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]是我們的初始值。 這是我們開始執行reduce函數的初始值,以及第一個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. 下面代碼的輸出是什麼?

<code>!!null;
!!"";
!!1;
複製代碼/<code>
  • 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方法的返回值什麼?

<code>setInterval(() => console.log("Hi"), 1000);
複製代碼/<code>
  • A:一個唯一的id
  • B:指定的毫秒數
  • C:傳遞的函數
  • D:undefined

答案


答案: A

它返回一個唯一的id。 此id可用於使用clearInterval()函數清除該定時器。



43. 下面代碼的返回值是什麼?

<code>[..."Lydia"];
複製代碼/<code>
  • A: ["L", "y", "d", "i", "a"]
  • B: ["Lydia"]
  • C: [[], "Lydia"]
  • D: [["L", "y", "d", "i", "a"]]

答案


答案: A

字符串是可迭代的。 擴展運算符將迭代的每個字符映射到一個元素。


小結

文中如有錯誤,歡迎在評論區指正,如果這篇文章幫助到了你,歡迎點贊和關注。

想閱讀更多優質文章、可關注我的github博客,你的star✨、點贊和關注是我持續創作的動力!


github : https://github.com/ConardLi/ConardLi.github.io

原鏈接:https://juejin.im/post/5d0644976fb9a07ed064b0ca


分享到:


相關文章: