国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JavaScript九大面試問題集錦,助你順利通關!

開發(fā) 前端 開發(fā)工具
本文將介紹一些面試時關于JavaScript的常見問題,以及一些突發(fā)難題。當然,每次面試都是不同的,你也可能不會遇見這類問題。但是知道的越多,準備的就越充分。

人們認為JavaScript是最適合初學者的語言。一部分原因在于JavaScript在互聯(lián)網(wǎng)中運用廣泛,另一部分原因在于其自身特性使得即使編寫的代碼不那么***依然可以運行:無論是否少了一個分號或是內(nèi)存管理問題,它都不像許多其他語言那樣嚴格,但在開始學習之前,要確保你已經(jīng)知道JavaScript的來龍去脈,包括可以自動完成的事情和“幕后”的操作。

本文將介紹一些面試時關于JavaScript的常見問題,以及一些突發(fā)難題。當然,每次面試都是不同的,你也可能不會遇見這類問題。但是知道的越多,準備的就越充分。

JavaScript

***部分:突發(fā)難題

如果在面試中突然問到下列問題,似乎很難回答。即便如此,這些問題在準備中仍發(fā)揮作用:它們揭示了JavaScript的一些有趣的功能,并強調(diào)在提出編程語言時,首先必須做出的一些決定。

了解有關JavaScript的更多功能,建議訪問https://wtfjs.com。

1. 為什么Math.max()小于Math.min()?

Math.max()> Math.min()輸出錯誤這一說法看上去有問題,但其實相當合理。

如果沒有給出參數(shù),Math.min()返回infinity(無窮大),Math.max()返回-infinity(無窮小)。這只是max()和min()方法規(guī)范的一部分,但選擇背后的邏輯值得深議。了解其中原因,請看以下代碼:

  1. Math.min(1) // 1  
  2. Math.min(1, infinity)// 1  
  3. Math.min(1, -infinity)// -infinity 

如果-infinity(無窮小)作為Math.min()的默認參數(shù),那么每個結果都是-infinity(無窮小),這毫無用處! 然而,如果默認參數(shù)是infinity(無窮大),則無論添加任何參數(shù)返回都會是該數(shù)字 - 這就是我們想要的運行方式。

2. 為什么0.1+0.2不等于0.3

簡而言之,這與JavaScript在二進制中存儲浮點數(shù)的準確程度有關。在Google Chrome控制臺中輸入以下公式將得到:

  1. 0.1 + 0.2// 0.30000000000000004   
  2. 0.1 + 0.2 - 0.2// 0.10000000000000003   
  3. 0.1 + 0.7// 0.7999999999999999 

如果是簡單的等式,對準確度沒有要求,這不太可能產(chǎn)生問題。但是如果需要測試相等性,即使是簡單地應用也會導致令人頭疼的問題。解決這些問題,有以下幾種方案。

(1) Fixed Point固定點

例如,如果知道所需的***精度(例如,如果正在處理貨幣),則可以使用整數(shù)類型來存儲該值。因此,可以存儲499而非4.99美元,并在此基礎上執(zhí)行任何等式,然后可以使用類似result =(value / 100).toFixed(2)的表達式將結果顯示給最終用戶,該表達式返回一個字符串。

(2) BCD代碼

如果精度非常重要,另一種方法是使用二進制編碼的十進制(BCD)格式,可以使用BCD庫(https://formats.kaitai.io/bcd/javascript.html)訪問JavaScript。每個十進制值分別存儲在一個字節(jié)(8位)中。鑒于一個字節(jié)可以存儲16個單獨值,而該系統(tǒng)僅使用0-9位,所以這種方法效率低下。但是,如果十分注重精確度,采用何種方法都值得考量。

3. 為什么018減017等于3?

018-017返回3實際是靜默類型轉換的結果。這種情況,討論的是八進制數(shù)。

(1) 八進制數(shù)簡介

你或許知道計算中使用二進制(base-2)和十六進制(base-16)數(shù)字系統(tǒng),但是八進制(base-8)在計算機歷史中的地位也舉足親重:在20世紀50年代后期和 20世紀60年代間,八進制被用于簡化二進制,削減高昂的制造系統(tǒng)中的材料成本。

不久以后Hexadecimal(十六進制)開始登上歷史舞臺:

1965年發(fā)布的IBM360邁出了從八進制到十六進制的決定性一步。我們這些習慣八進制的人對這一舉措感到震驚!

沃恩·普拉特(Vaughan Pratt)

(2) 如今的八進制數(shù)

但在現(xiàn)代編程語言中,八進制又有何作用呢?針對某些案例,八進制比十六進制更具優(yōu)勢,因為它不需要任何非數(shù)字(使用0-7而不是0-F)。

一個常見用途是Unix系統(tǒng)的文件權限,其中有八個權限變體:

  • 4 2 1
  • 0 - - - no permissions
  • 1 - - x only execute
  • 2 - x - only write
  • 3 - x x write and execute
  • 4 x - - only read
  • 5 x - x read and execute
  • 6 x x - read and write
  • 7 x x x read, write and execute

出于相似的原由,八進制也用于數(shù)字顯示器。

(3) 回到問題本身

在JavaScript中,前綴0將所有數(shù)字轉換為八進制。但是,八進制中不使用數(shù)字8,任何包含8的數(shù)字都將自動轉換為常規(guī)十進制數(shù)。

因此,018-017實際上等同于十進制表達式:18-15,因為017使用八進制而018使用十進制。

第二部分:常見問題

[[271089]]

本節(jié)中,將介紹面試中一些更加常見的JavaScript問題。***次學習JavaScript時,這些問題容易被忽略。但在編寫***代碼時,了解下述問題用處頗大。

4. 函數(shù)表達式與函數(shù)聲明有哪些不同?

函數(shù)聲明使用關鍵字function,后跟函數(shù)的名稱。相反,函數(shù)表達式以var,let或const開頭,后跟函數(shù)名稱和賦值運算符=。請看以下代碼:

  1. // Function Declaration 
  2. function sum(x, y) { 
  3.   return x + y; 
  4. }; 
  5.  
  6. // Function Expression: ES5 
  7. var sum = function(x, y) { 
  8.   return x + y; 
  9. }; 
  10.   
  11. // Function Expression: ES6+ 
  12. const sum = (x, y) => { return x + y }; 

實際操作中,關鍵的區(qū)別在于函數(shù)聲明要被提升,而函數(shù)表達式則沒有。這意味著JavaScript解釋器將函數(shù)聲明移動到其作用域的頂部,因此可以定義函數(shù)聲明并在代碼中的任何位置調(diào)用它。相比之下,只能以線性順序調(diào)用函數(shù)表達式:必須在調(diào)用它之前解釋。

如今,許多開發(fā)人員偏愛函數(shù)表達式有如下幾個原因:

  • 首先,函數(shù)表達式實施更加可預測的結構化代碼庫。當然,函數(shù)聲明也可使用結構化代碼庫; 只是函數(shù)聲明讓你更容易擺脫凌亂的代碼。
  • 其次,可以將ES6語法用于函數(shù)表達式:這通常更為簡潔,let和const可以更好地控制是否重新賦值變量,我們將在下一個問題中看到。

5. var,let和const有什么區(qū)別?

自ES6發(fā)布以來,現(xiàn)代語法已進入各行各業(yè),這已是一個極其常見的面試問題。Var是***版JavaScript中的變量聲明關鍵字。但它的缺點導致在ES6中采用了兩個新關鍵字:let和const。

這三個關鍵字具有不同的分配,提升和域 - 因此我們將單獨討論。

(1) 分配

最基本的區(qū)別是let和var可以重新分配,而const則不能。這使得const成為不變變量的***選擇,并且它將防止諸如意外重新分配之類的失誤。注意,當變量表示數(shù)組或?qū)ο髸r,const確實允許變量改變,只是無法重新分配變量本身。

Let 和var都可重新分配,但是正如以下幾點應該明確的那樣,如果不是所有情況都要求更改變量,多數(shù)選擇中,let具有優(yōu)于var的顯著優(yōu)勢。

(2) 提升

與函數(shù)聲明和表達式(如上所述)之間的差異類似,使用var聲明的變量總是被提升到它們各自的頂部,而使用const和let聲明的變量被提升,但是如果你試圖在聲明之前訪問,將會得到一個TDZ(時間死區(qū))錯誤。由于var可能更容易出錯,例如意外重新分配,因此運算是有用的。請看以下代碼:

  1. var x = "global scope"
  2.  
  3. function foo() { 
  4.   var x = "functional scope"
  5.   console.log(x); 
  6.  
  7. foo(); // "functional scope" 
  8. console.log(x); // "global scope" 

這里,foo()和console.log(x)的結果與預期一致。但是,如果去掉第二個變量又會發(fā)生什么呢?

  1. var x = "global scope"
  2.  
  3. function foo() { 
  4.   x = "functional scope"
  5.   console.log(x); 
  6. foo(); // "functional scope" 
  7. console.log(x); // "functional scope" 

盡管在函數(shù)內(nèi)定義,但x =“functional scope”已覆蓋全局變量。需要重復關鍵字var來指定第二個變量x僅限于foo()。

(3) 域

雖然var是function-scoped(函數(shù)作用域),但let和const是block-scoped(塊作用域的:一般情況下,Block是大括號{}內(nèi)的任何代碼,包括函數(shù),條件語句和循環(huán)。為了闡明差異,請看以下代碼:

  1. var a = 0
  2. let b = 0
  3. const c = 0
  4. if (true) { 
  5.   var a = 1
  6.   let b = 1
  7.   const c = 1
  8. console.log(a); // 1 
  9. console.log(b); // 0 
  10. console.log(c); // 0 

在條件塊中,全局范圍的var a已重新定義,但全局范圍的let b和const c則沒有。一般而言,確保本地任務保持在本地執(zhí)行,將使代碼更加清晰,減少出錯。

6. 如果分配不帶關鍵字的變量會發(fā)生什么?

如果不使用關鍵字定義變量,又會如何?從技術上講,如果x尚未定義,則x = 1是window.x = 1的簡寫。

要想完全杜絕這種簡寫,可以編寫嚴格模式,——在ES5中介紹過——在文檔頂部或特定函數(shù)中寫use strict。后,當你嘗試聲明沒有關鍵字的變量時,你將收到一條報語法錯誤:Uncaught SyntaxError:Unexpected indentifier。

7. 面向?qū)ο缶幊?OOP)和函數(shù)式編程(FP)之間的區(qū)別是什么?

JavaScript是一種多范式語言,即它支持多種不同的編程風格,包括事件驅(qū)動,函數(shù)和面向?qū)ο蟆?/p>

編程范式各有不同,但在當代計算中,函數(shù)編程和面向?qū)ο缶幊套顬榱餍?- 而JavaScript兩種都可執(zhí)行。

(1) 面向?qū)ο缶幊?/p>

OOP以“對象”這一概念為基礎的數(shù)據(jù)結構,包含數(shù)據(jù)字段(JavaScript稱為類)和程序(JavaScript中的方法)。

一些JavaScript的內(nèi)置對象包括Math(用于random,max和sin等方法),JSON(用于解析JSON數(shù)據(jù))和原始數(shù)據(jù)類型,如String,Array,Number和Boolean。

無論何時采用的內(nèi)置方法,原型或類,本質(zhì)上都在使用面向?qū)ο缶幊獭?/p>

(2) 函數(shù)編程

FP(函數(shù)編程)以“純函數(shù)”的概念為基礎,避免共享狀態(tài),可變數(shù)據(jù)和副作用。這可能看起來像很多術語,但可能已經(jīng)在代碼中創(chuàng)建了許多純函數(shù)。

輸入相同數(shù)據(jù),純函數(shù)總是返回相同的輸出。這種方式?jīng)]有副作用:除了返回結果之外,例如登錄控制臺或修改外部變量等都不會發(fā)生。

至于共享狀態(tài),這里有一個簡單的例子,即使輸入是相同的,狀態(tài)仍可以改變函數(shù)的輸出。設置一個具有兩個函數(shù)的代碼:一個將數(shù)字加5,另一個將數(shù)字乘以5。

  1. const num = { 
  2.  val: 1 
  3. }; 
  4. const add5 = () => num.val += 5; 
  5. const multiply5 = () => num.val *= 5; 

如果先調(diào)用add5在調(diào)用乘以5,則整體結果為30。但是如果以相反的方式執(zhí)行函數(shù)并記錄結果,則輸出為10,與之前結果不一致。

這違背了函數(shù)式編程的原理,因為函數(shù)的結果因Context調(diào)用方法而異。 重新編寫上面的代碼,以便結果更易預測:

  1. const num = { 
  2.  val: 1 
  3. }; 
  4. const add5 = () => Object.assign({}, num, {val: num.val + 5}); const multiply5 = () => Object.assign({}, num, {val: num.val * 5}); 

現(xiàn)在,num.val的值仍然為1,無論Context調(diào)用的方法如何,add5(num)和multiply5(num)將始終輸出相同的結果。

8. 命令式和聲明性編程之間有什么區(qū)別?

關于命令式編程和聲明式編程的區(qū)別,可以以OOP(面向?qū)ο缶幊?和FP(函數(shù)式編程)為參考。

這兩種是描述多種不同編程范式共有特征的概括性術語。FP(函數(shù)式編程)是聲明性編程的一個范例,而OOP(面向?qū)ο缶幊?是命令式編程的一個范例。

從基本的意義層面,命令式編程關注的是如何做某事。它以最基本的方式闡明了步驟,并以for和while循環(huán),if和switch陳述句等為特征。

  1. const sumArray = array => { 
  2.   let result = 0
  3.   for (let i = 0; i < array.length; i++) { 
  4.      result += array[i] 
  5.   }; 
  6.   return result; 

相比之下,聲明性編程關注的是做什么,它通過依賴表達式將怎樣做抽出來。這通常會產(chǎn)生更簡潔的代碼,但是在規(guī)模上,由于透明度低,調(diào)試會更加困難。

這是上述的sumArray()函數(shù)的聲明方法。

  1. const sumArray = array => { return array.reduce((x, y) => x + y) }; 

9. 是什么基于原型的繼承?

***,要講到的是基于原型的繼承。面向?qū)ο缶幊逃袔追N不同的類型,JavaScript使用的是基于原型的繼承。該系統(tǒng)通過使用現(xiàn)有對象作為原型,允許重復運行。

即使是***遇到原型這一概念,使用內(nèi)置方法時也會遇到原型系統(tǒng)。 例如,用于操作數(shù)組的函數(shù)(如map,reduce,splice等)都是Array.prototype對象的方法。實際上,數(shù)組的每個實例(使用方括號[]定義,或者 -不常見的 new Array())都繼承自Array.prototype,這就是為什么map,reduce和spliceare等方法都默認可用的原因。

幾乎所有內(nèi)置對象都是如此,例如字符串和布爾運算:只有少數(shù),如Infinity,NaN,null和undefined等沒有類或方法。

在原型鏈的末尾,能發(fā)現(xiàn) Object.prototype,幾乎JavaScript中的每個對象都是Object的一個實例。比如Array. prototype和String. prototype都繼承了Object.prototype的類和方法。

要想對使用prototype syntax的對象添加類和方法,只需將對象作為函數(shù)啟動,并使用prototype關鍵字添加類和方法:

  1. function Person() {}; 
  2. Person.prototype.forename = "John"
  3. Person.prototype.surname = "Smith"

是否應該覆蓋或擴展原型運算?

可以使用與創(chuàng)建擴展prototypes同樣的方式改變內(nèi)置運算,但是大多數(shù)開發(fā)人員(以及大多數(shù)公司)不會建議這樣做。

如果希望多個對象進行同樣的運算,可以創(chuàng)建一個自定義對象(或定義你自己的“類”或“子類”),這些對象繼承內(nèi)置原型而不改變原型本身。如果打算與其他開發(fā)人員合作,他們對JavaScript的默認行為有一定的預期,編輯此默認行為很容易導致出錯。

總的來說,這些問題能夠幫助你更好理解JavaScript,包括其核心功能和其他鮮為人知的功能 ,并且望能助你為下次的面試做好準備。

責任編輯:趙寧寧 來源: 讀芯術
相關推薦

2013-05-29 10:47:50

Android開發(fā)Java多線程java面試題

2023-09-13 08:37:56

程序員面試catch

2023-02-26 01:47:13

2019-07-15 11:04:37

Spring BootTomcat開發(fā)

2021-05-12 09:09:06

系統(tǒng)設計開發(fā)軟件工程

2020-03-17 14:53:31

JavaScript面試問題前端

2017-09-15 10:36:17

前端JavaScript面試題

2018-05-04 06:29:27

2009-03-03 09:33:13

面試ORACLE

2024-03-27 08:36:48

JavaScriptWeb開發(fā)前端開發(fā)

2010-06-04 09:08:56

2010-07-08 16:33:31

高薪高職

2009-07-03 17:06:41

面試素質(zhì)

2013-09-30 09:08:30

面試創(chuàng)業(yè)

2018-08-21 13:25:01

編程語言Java面試題

2012-12-26 16:02:00

應屆畢業(yè)生面試策略

2013-12-03 10:11:41

LinuxLinux面試題

2015-05-11 14:02:21

JavaJava集合面試問題答案

2023-09-20 08:03:32

JavaScript編程語言

2018-07-25 14:27:43

Redis數(shù)據(jù)架構存儲
點贊
收藏

51CTO技術棧公眾號

国产精品国产一区二区| 欧美成人在线影院| 北条麻妃一区二区三区在线观看| 久久精品人人做人人综合 | 欧美va天堂在线| 亚洲成人tv网| 欧美第一页在线| 一级毛片在线观| 免费在线观看一区二区三区| 日韩欧美一区二区三区久久| 白嫩少妇丰满一区二区| 国产福利视频一区二区三区| 一本一道久久a久久综合精品| 成人免费图片免费观看| 91在线观看下载| 亚洲熟妇av日韩熟妇在线| 美女国产一区| 欧美日韩成人网| 男女污污视频在线观看| 日本电影一区二区| 欧美一级黄色网| 精品国产一区二区三区久久久蜜臀| 欧美xxxx14xxxxx性爽| 日本美女在线中文版| 91麻豆精品国产自产在线| 亚洲伊人一本大道中文字幕| 欧美另类极限扩张| 欧美在线观看一区二区| 福利小视频在线| 尤物精品国产第一福利三区 | 电影在线观看一区二区| 日韩视频在线免费| 亚洲一区在线| 久久亚洲综合色| 免费高清视频日韩| 欧美不卡视频一区| 黄色大片在线免费观看| 5858s免费视频成人| 亚洲精华国产精华| 欧美日韩国产影片| 视频一区在线免费看| 国产精品久久久久福利| 天堂蜜桃一区二区三区| 久久不射电影网| 国产精品视频一区二区三区四蜜臂| 91免费看片在线| 热久久久久久| av一本久道久久综合久久鬼色| 3atv在线一区二区三区| 精品国产伦一区二区三区观看说明| 欧美午夜无遮挡| 免费人成在线观看播放视频| 尤物yw午夜国产精品视频| 欧美网色网址| 91九色在线观看视频| 欧美性猛交一区二区三区精品| 国产无套粉嫩白浆在线2022年| 日韩精品中文字| gogogo高清在线观看一区二区| 红桃一区二区三区| 欧美精品自拍偷拍动漫精品| 成人免费毛片在线观看| 欧美一区二区视频观看视频| 波多野结衣亚洲| 久久精品中文字幕一区二区三区 | 成人视屏免费看| 国产精品一区二区av| 国产精品久久久久影视| 日韩一区二区三区中文字幕| 久久精品色欧美aⅴ一区二区| 国产精品一区二区三区av麻 | 国产人妻777人伦精品hd| 中文字幕在线官网| 中文字幕在线亚洲| 国产一区二三区| 忘忧草在线日韩www影院| 欧美中文娱乐网| 日韩视频国产视频| 蜜桃视频第一区免费观看| 九义人在线观看完整免费版电视剧| 国内精品模特av私拍在线观看| 欧美成a人片在线观看久| 日韩精品极品在线观看| 激情文学综合插| 色综合桃花网| 色偷偷噜噜噜亚洲男人的天堂| 一区二区三区四区亚洲| 国产精品一区二区三区在线| av一区二区高清| 黄色91av| 黄色av网站在线| 久久国产精品久久久| 杨幂一区二区三区免费看视频| 中文字幕在线观看一区| 人人九九精品| 精品视频—区二区三区免费| 国产视频一区二区在线播放| 97香蕉久久夜色精品国产| 午夜影院日韩| 国模吧精品人体gogo| 一区二区日韩精品| 成人免费黄色在线| 成人看的羞羞网站| 国产a级网站| 97偷自拍亚洲综合二区| 最近2019中文字幕在线高清| 免费高清在线视频一区·| 91精品久久久久久9s密挑 | 日本www在线观看| 精品久久久久久综合日本| 久久久av一区| 亚洲激情自拍偷拍| 视频一区中文| 色哟哟免费在线观看 | 在线视频网站| 成人18视频| 欧美高清第一页| 中文字幕av一区二区三区高| 日韩欧美国产精品综合嫩v| 欧美亚洲国产成人精品| 精品国产91久久久| 麻豆一区二区| 亚洲大胆人体在线| 91伊人久久大香线蕉| 婷婷五月色综合香五月| 日韩中文字幕网址| 99久久婷婷| 久青草视频在线播放| 国内综合精品午夜久久资源| 在线观看的毛片| 8090成年在线看片午夜| 午夜精品久久久久影视| 国产欧美精品| 神马电影久久| 久久看人人摘| 国产成人午夜性a一级毛片| 国产毛片在线| 国产精品自拍片| 国产日韩欧美综合| 久久影院资源网| 色综合男人天堂| 欧美精品色综合| 亚洲成av人片一区二区三区| 成人avav在线| 蜜臀va亚洲va欧美va天堂 | 99久久国产综合精品五月天喷水| 午夜精品免费视频| 在线国产精品视频| 亚洲国产精品人久久电影| 亚洲综合色自拍一区| 欧美经典一区二区| 91在线视频免费91| 香蕉av777xxx色综合一区| 日本成人小视频| 国产成人精品三级高清久久91| 国产精品久久久久久久久免费高清 | aaa在线播放视频| 女人黄色免费在线观看| 亚洲免费专区| 6080亚洲理论片在线观看| 91九色综合| 波多野结衣av在线| 色视频一区二区三区| 色阁综合伊人av| 亚洲国产成人一区| 欧美探花视频资源| 在线观看视频一区二区| 一区二区三区成人| 亚洲va欧美va人人爽午夜| 精品国产成人在线影院| 欧美r级在线观看| 亚洲精品一线二线三线无人区| 日韩欧美在线一区二区三区| 亚洲狼人在线| 欧美激情性做爰免费视频| 久草免费在线观看| 国产精品成人久久久久| 欧美激情影音先锋| 久久手机精品视频| yellow视频在线观看一区二区 | 精品久久久久久久人人人人传媒 | 国产伦精品一区| 久久成人一区二区| 国外成人免费在线播放| 隔壁老王国产在线精品| 日本精品视频在线播放| 岛国视频一区免费观看| 亚洲精品一区二区三区四区五区| 国产精品无码av无码| 国产精品pans私拍| 日本新janpanese乱熟| 亚洲麻豆精品| 国产精品一区二区三区四区在线观看| 猫咪成人在线观看| 久久精品久久99精品久久| 亚洲成人久久网| 97香蕉超级碰碰久久免费软件| 国产精品免费一区二区三区在线观看| 欧美午夜小视频| 成年人黄视频在线观看|