成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript 進(jìn)階問(wèn)題列表,你掌握了多少?

ethernet / 2662人閱讀

摘要:在第四次調(diào)用時(shí),回調(diào)函數(shù)依然沒(méi)有返回值。累加器再次為,當(dāng)前值為。

經(jīng)常寫(xiě)業(yè)務(wù)就容易忽視對(duì)基礎(chǔ)知識(shí)的補(bǔ)充和加強(qiáng),但在面試中,基礎(chǔ)知識(shí)點(diǎn)是非常重要的考核部分。本文要分享的是,一位開(kāi)發(fā)者每天都會(huì)發(fā)布的 JavaScript 問(wèn)題。有的容易,有的會(huì)有難度,對(duì)基礎(chǔ)知識(shí)的查缺補(bǔ)漏非常有幫助,也是你進(jìn)階路上必然要掌握的知識(shí)。

以下挑選了10個(gè)問(wèn)題,緊跟其后的就是對(duì)這道題的詳細(xì)解答。如果你想看所有的題目,最后有鏈接直達(dá)。

1. for循環(huán)中套定時(shí)器
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 20 1 2

B: 0 1 23 3 3

C: 3 3 30 1 2

答案: C

由于 JavaScript 的事件循環(huán),setTimeout 回調(diào)會(huì)在遍歷結(jié)束后才執(zhí)行。因?yàn)樵诘谝粋€(gè)遍歷中遍歷 i 是通過(guò) var 關(guān)鍵字聲明的,所以這個(gè)值是全局作用域下的。在遍歷過(guò)程中,我們通過(guò)一元操作符 ++ 來(lái)每次遞增 i 的值。當(dāng) setTimeout 回調(diào)執(zhí)行的時(shí)候,i 的值等于 3。

在第二個(gè)遍歷中,遍歷 i 是通過(guò) let 關(guān)鍵字聲明的:通過(guò) letconst 關(guān)鍵字聲明的變量是擁有塊級(jí)作用域(指的是任何在 {} 中的內(nèi)容)。在每次的遍歷過(guò)程中,i 都有一個(gè)新值,并且每個(gè)值都在循環(huán)內(nèi)的作用域中。

2. 標(biāo)記模板字面量
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

如果使用標(biāo)記模板字面量,第一個(gè)參數(shù)的值總是包含字符串的數(shù)組。其余的參數(shù)獲取的是傳遞的表達(dá)式的值!

3. typeof 運(yùn)算符返回值
function sayHi() {
  return (() => 0)()
}

typeof sayHi()

A: "object"

B: "number"

C: "function"

D: "undefined"

答案: B

sayHi 方法返回的是立即執(zhí)行函數(shù)(IIFE)的返回值.此立即執(zhí)行函數(shù)的返回值是 0, 類(lèi)型是 number

參考:只有7種內(nèi)置類(lèi)型:null,undefined,booleannumber,stringobjectsymbol。 function 不是一種類(lèi)型,函數(shù)是對(duì)象,它的類(lèi)型是object。

4. 對(duì)象作為key值的問(wèn)題
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

對(duì)象的鍵被自動(dòng)轉(zhuǎn)換為字符串。我們?cè)噲D將一個(gè)對(duì)象 b 設(shè)置為對(duì)象 a 的鍵,且相應(yīng)的值為 123。

然而,當(dāng)字符串化一個(gè)對(duì)象時(shí),它會(huì)變成 "[object Object]"。因此這里說(shuō)的是,a["[object Object]"] = 123。然后,我們?cè)僖淮巫隽送瑯拥氖虑椋?b>c 是另外一個(gè)對(duì)象,這里也有隱式字符串化,于是,a["[object Object]"] = 456。

然后,我們打印 a[b],也就是 a["[object Object]"]。之前剛設(shè)置為 456,因此返回的是 456。

5. call和bind的使用
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 關(guān)鍵字引用的對(duì)象。但是,.call立即執(zhí)行的。

.bind 返回函數(shù)的副本,但帶有綁定上下文!它不是立即執(zhí)行的。

6. reduce 方法的使用
[1, 2, 3, 4].reduce((x, y) => console.log(x, y));

A: 1 2 and 3 3 and 6 4

B: 1 2 and 2 3 and 3 4

C: 1 undefined and 2 undefined and 3 undefined and 4 undefined

D: 1 2 and undefined 3 and undefined 4

答案: D

reducer 函數(shù)接收4個(gè)參數(shù):

Accumulator (acc) (累計(jì)器)

Current Value (cur) (當(dāng)前值)

Current Index (idx) (當(dāng)前索引)

Source Array (src) (源數(shù)組)

reducer 函數(shù)的返回值將會(huì)分配給累計(jì)器,該返回值在數(shù)組的每個(gè)迭代中被記住,并最后成為最終的單個(gè)結(jié)果值。

reducer 函數(shù)還有一個(gè)可選參數(shù)initialValue, 該參數(shù)將作為第一次調(diào)用回調(diào)函數(shù)時(shí)的第一個(gè)參數(shù)的值。如果沒(méi)有提供initialValue,則將使用數(shù)組中的第一個(gè)元素。

在上述例子,reduce方法接收的第一個(gè)參數(shù)(Accumulator)是x, 第二個(gè)參數(shù)(Current Value)是y。

在第一次調(diào)用時(shí),累加器x1,當(dāng)前值“y”2,打印出累加器和當(dāng)前值:12。

例子中我們的回調(diào)函數(shù)沒(méi)有返回任何值,只是打印累加器的值和當(dāng)前值。如果函數(shù)沒(méi)有返回值,則默認(rèn)返回undefined。 在下一次調(diào)用時(shí),累加器為undefined,當(dāng)前值為“3”, 因此undefined3被打印出。

在第四次調(diào)用時(shí),回調(diào)函數(shù)依然沒(méi)有返回值。 累加器再次為 undefined ,當(dāng)前值為“4”。 undefined4被打印出。

7. Promise.race的用法
const firstPromise = new Promise((res, rej) => {
  setTimeout(res, 500, "one");
});

const secondPromise = new Promise((res, rej) => {
  setTimeout(res, 100, "two");
});

Promise.race([firstPromise, secondPromise]).then(res => console.log(res));

A: "one"

B: "two"

C: "two" "one"

D: "one" "two"

答案: B

當(dāng)我們向Promise.race方法中傳入多個(gè)Promise時(shí),會(huì)進(jìn)行 優(yōu)先 解析(注:只要有一個(gè)成功或失敗,就立馬結(jié)束)。在這個(gè)例子中,我們用setTimeoutfirstPromisesecondPromise分別設(shè)定了500ms和100ms的定時(shí)器。這意味著secondPromise會(huì)首先解析出字符串two。那么此時(shí)res參數(shù)即為two,是為輸出結(jié)果。

8. try...catch 捕獲錯(cuò)誤
function greeting() {
  throw "Hello world!";
}

function sayHi() {
  try {
    const data = greeting();
    console.log("It worked!", data);
  } catch (e) {
    console.log("Oh no an error!", e);
  }
}

sayHi();

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!

答案: D

通過(guò)throw語(yǔ)句,我么可以創(chuàng)建自定義錯(cuò)誤。 而通過(guò)它,我們可以拋出異常。異常可以是一個(gè)字符串, 一個(gè) 數(shù)字, 一個(gè) 布爾類(lèi)型 或者是一個(gè) 對(duì)象。在本例中,我們的異常是字符串"Hello world".

通過(guò) catch語(yǔ)句,我們可以設(shè)定當(dāng)try語(yǔ)句塊中拋出異常后應(yīng)該做什么處理。在本例中拋出的異常是字符串"Hello world". e就是這個(gè)字符串,因此被輸出。最終結(jié)果就是"Oh an error: Hello world".

9. import 執(zhí)行順序問(wèn)題
// index.js
console.log("running index.js");
import { sum } from "./sum.js";
console.log(sum(1, 2));

// sum.js
console.log("running sum.js");
export const sum = (a, b) => a + b;

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

答案: B

import命令是編譯階段執(zhí)行的,在代碼運(yùn)行之前。因此這意味著被導(dǎo)入的模塊會(huì)先運(yùn)行,而導(dǎo)入模塊的文件會(huì)后執(zhí)行。

這是CommonJS中require()import之間的區(qū)別。使用require(),您可以在運(yùn)行代碼時(shí)根據(jù)需要加載依賴項(xiàng)。 如果我們使用require而不是import,running index.js,running sum.js3會(huì)被依次打印。

10. JSON.stringify 過(guò)濾需要的字段
const settings = {
  username: "lydiahallie",
  level: 19,
  health: 90
};

const data = JSON.stringify(settings, ["level", "health"]);
console.log(data);

A: "{"level":19, "health":90}"

B: "{"username": "lydiahallie"}"

C: "["level", "health"]"

D: "{"username": "lydiahallie", "level":19, "health":90}"

答案: A

JSON.stringify的第二個(gè)參數(shù)是 _替代者(replacer)_. 替代者(replacer)可以是個(gè)函數(shù)或數(shù)組,用以控制哪些值如何被轉(zhuǎn)換為字符串。

如果替代者(replacer)是個(gè) 數(shù)組 ,那么就只有包含在數(shù)組中的屬性將會(huì)被轉(zhuǎn)化為字符串。在本例中,只有名為"level""health" 的屬性被包括進(jìn)來(lái), "username"則被排除在外。 data 就等于 "{"level":19, "health":90}".

而如果替代者(replacer)是個(gè) _函數(shù)_,這個(gè)函數(shù)將被對(duì)象的每個(gè)屬性都調(diào)用一遍。
函數(shù)返回的值會(huì)成為這個(gè)屬性的值,最終體現(xiàn)在轉(zhuǎn)化后的JSON字符串中(譯者注:Chrome下,經(jīng)過(guò)實(shí)驗(yàn),如果所有屬性均返回同一個(gè)值的時(shí)候有異常,會(huì)直接將返回值作為結(jié)果輸出而不會(huì)輸出JSON字符串),而如果返回值為undefined,則該屬性會(huì)被排除在外。

題目來(lái)源:https://github.com/lydiahallie/javascript-questions/blob/master/README-zh_CN.md

如果對(duì)你有幫助,請(qǐng)關(guān)注【前端技能解鎖】:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110265.html

相關(guān)文章

  • Javascript 面試中經(jīng)常被問(wèn)到的三個(gè)問(wèn)題!

    摘要:相反,在討論時(shí),面試中通常會(huì)提到三件事。通過(guò)對(duì)事件對(duì)應(yīng)的回調(diào)函數(shù)進(jìn)行包裹以自由變量的形式緩存時(shí)間信息,最后用來(lái)控制事件的觸發(fā)頻率。而認(rèn)為最后一個(gè)參賽者說(shuō)了算,只要還能吃的,就重新設(shè)定新的定時(shí)器。 showImg(https://segmentfault.com/img/bVboH5x?w=1000&h=750); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 本...

    PrototypeZ 評(píng)論0 收藏0
  • 進(jìn)階1-3期】JavaScript深入之內(nèi)存空間詳細(xì)圖解

    摘要:進(jìn)階期理解中的執(zhí)行上下文和執(zhí)行棧進(jìn)階期深入之執(zhí)行上下文棧和變量對(duì)象但是今天補(bǔ)充一個(gè)知識(shí)點(diǎn)某些情況下,調(diào)用堆棧中函數(shù)調(diào)用的數(shù)量超出了調(diào)用堆棧的實(shí)際大小,瀏覽器會(huì)拋出一個(gè)錯(cuò)誤終止運(yùn)行。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第一期,本周的主題是調(diào)用堆棧,今天是第3天。 本計(jì)劃一共28期,每期重點(diǎn)攻...

    coordinate35 評(píng)論0 收藏0
  • Nodejs進(jìn)階:crypto模塊中需要掌握的安全基礎(chǔ)知識(shí)

    摘要:加解密偽代碼加密解密非對(duì)稱(chēng)加密又稱(chēng)公開(kāi)秘鑰加密。常見(jiàn)的非對(duì)稱(chēng)加密算法。通常來(lái)說(shuō)對(duì)稱(chēng)加密速度要快于非對(duì)稱(chēng)加密。在之后的通訊階段,可以使用對(duì)稱(chēng)加密算法對(duì)數(shù)據(jù)進(jìn)行加密,秘鑰則是握手階段生成的。確認(rèn)信息完整未被篡改。 一、 文章概述 互聯(lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)上的數(shù)據(jù)量每天都在以驚人的速度增長(zhǎng)。同時(shí),各類(lèi)網(wǎng)絡(luò)安全問(wèn)題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開(kāi)發(fā)者,需要加強(qiáng)對(duì)安全的認(rèn)識(shí),并通過(guò)技...

    xzavier 評(píng)論0 收藏0
  • 寫(xiě)一本關(guān)于 React.js 的小書(shū)

    摘要:因?yàn)楣ぷ髦幸恢痹谑褂?,也一直以?lái)想總結(jié)一下自己關(guān)于的一些知識(shí)經(jīng)驗(yàn)。于是把一些想法慢慢整理書(shū)寫(xiě)下來(lái),做成一本開(kāi)源免費(fèi)專(zhuān)業(yè)簡(jiǎn)單的入門(mén)級(jí)別的小書(shū),提供給社區(qū)。本書(shū)的后續(xù)可能會(huì)做成視頻版本,敬請(qǐng)期待。本作品采用署名禁止演繹國(guó)際許可協(xié)議進(jìn)行許可 React.js 小書(shū) 本文作者:胡子大哈本文原文:React.js 小書(shū) 轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...

    Scorpion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<