精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

字節跳動最愛考的前端面試題:JavaScript 基礎

開發 前端
本篇給大家介紹字節跳動最愛考的前端面試題:JavaScript 基礎,希望對你有所幫助。

[[379885]]

 注意:每道題前面出現的 (xx) 數字代表這道題出現的頻次,此 JS 基礎是基于 30+ 篇前端面經整理出的問題和對應的回答、參考鏈接等。

(2)問:0.1 + 0.2 === 0.3 嘛?為什么?

JavaScirpt 使用 Number 類型來表示數字(整數或浮點數),遵循 IEEE 754 標準,通過 64 位來表示一個數字(1 + 11 + 52)

  • 1 符號位,0 表示正數,1 表示負數 s
  • 11 指數位(e)
  • 52 尾數,小數部分(即有效數字)

最大安全數字:Number.MAX_SAFE_INTEGER = Math.pow(2, 53) - 1,轉換成整數就是 16 位,所以 0.1 === 0.1,是因為通過 toPrecision(16) 去有效位之后,兩者是相等的。

在兩數相加時,會先轉換成二進制,0.1 和 0.2 轉換成二進制的時候尾數會發生無限循環,然后進行對階運算,JS 引擎對二進制進行截斷,所以造成精度丟失。

所以總結:精度丟失可能出現在進制轉換和對階運算中

參考鏈接

https://juejin.im/post/5b90e00e6fb9a05cf9080dff

(4)問:JS 數據類型

基本類型:Number、Boolean、String、null、undefined、symbol(ES6 新增的),BigInt(ES2020) 引用類型:Object,對象子類型(Array,Function)

參考鏈接

  • https://juejin.im/post/5b2b0a6051882574de4f3d96
  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures

問:JS 整數是怎么表示的?

通過 Number 類型來表示,遵循 IEEE754 標準,通過 64 位來表示一個數字,(1 + 11 + 52),最大安全數字是 Math.pow(2, 53) - 1,對于 16 位十進制。(符號位 + 指數位 + 小數部分有效位)

問:Number() 的存儲空間是多大?如果后臺發送了一個超過最大自己的數字怎么辦

Math.pow(2, 53) ,53 為有效數字,會發生截斷,等于 JS 能支持的最大數字。

(4)寫代碼:實現函數能夠深度克隆基本類型

淺克隆:

  1. function shallowClone(obj) { 
  2.   let cloneObj = {}; 
  3.    
  4.   for (let i in obj) { 
  5.     cloneObj[i] = obj[i]; 
  6.   } 
  7.    
  8.   return cloneObj; 

深克隆:

  • 考慮基礎類型
  • 引用類型

RegExp、Date、函數 不是 JSON 安全的

會丟失 constructor,所有的構造函數都指向 Object

破解循環引用

  1. function deepCopy(obj) { 
  2.   if (typeof obj === 'object') { 
  3.     var result = obj.constructor === Array ? [] : {}; 
  4.      
  5.     for (var i in obj) { 
  6.       result[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i]; 
  7.     } 
  8.   } else { 
  9.     var result = obj; 
  10.   } 
  11.    
  12.   return result; 

問:事件流

事件流是網頁元素接收事件的順序,"DOM2級事件"規定的事件流包括三個階段:事件捕獲階段、處于目標階段、事件冒泡階段。首先發生的事件捕獲,為截獲事件提供機會。然后是實際的目標接受事件。最后一個階段是時間冒泡階段,可以在這個階段對事件做出響應。雖然捕獲階段在規范中規定不允許響應事件,但是實際上還是會執行,所以有兩次機會獲取到目標對象。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>事件冒泡</title> 
  6. </head> 
  7. <body> 
  8.     <div> 
  9.         <p id="parEle">我是父元素    <span id="sonEle">我是子元素</span></p> 
  10.     </div> 
  11. </body> 
  12. </html> 
  13. <script type="text/javascript"
  14. var sonEle = document.getElementById('sonEle'); 
  15. var parEle = document.getElementById('parEle'); 
  16.  
  17. parEle.addEventListener('click'function () { 
  18.     alert('父級 冒泡'); 
  19. }, false); 
  20. parEle.addEventListener('click'function () { 
  21.     alert('父級 捕獲'); 
  22. }, true); 
  23.  
  24. sonEle.addEventListener('click'function () { 
  25.     alert('子級冒泡'); 
  26. }, false); 
  27. sonEle.addEventListener('click'function () { 
  28.     alert('子級捕獲'); 
  29. }, true); 
  30.  
  31. </script> 

 當容器元素及嵌套元素,即在捕獲階段又在冒泡階段調用事件處理程序時:事件按DOM事件流的順序執行事件處理程序:

  • 父級捕獲
  • 子級冒泡
  • 子級捕獲
  • 父級冒泡

且當事件處于目標階段時,事件調用順序決定于綁定事件的書寫順序,按上面的例子為,先調用冒泡階段的事件處理程序,再調用捕獲階段的事件處理程序。依次alert出“子集冒泡”,“子集捕獲”。

IE 兼容

  • attchEvent('on' + type, handler)
  • detachEvent('on' + type, handler)

參考鏈接

https://juejin.im/entry/5826ba9d0ce4630056f85e07

問:事件是如何實現的?

基于發布訂閱模式,就是在瀏覽器加載的時候會讀取事件相關的代碼,但是只有實際等到具體的事件觸發的時候才會執行。

比如點擊按鈕,這是個事件(Event),而負責處理事件的代碼段通常被稱為事件處理程序(Event Handler),也就是「啟動對話框的顯示」這個動作。

在 Web 端,我們常見的就是 DOM 事件:

  • DOM0 級事件,直接在 html 元素上綁定 on-event,比如 onclick,取消的話,dom.onclick = null,同一個事件只能有一個處理程序,后面的會覆蓋前面的。
  • DOM2 級事件,通過 addEventListener 注冊事件,通過 removeEventListener 來刪除事件,一個事件可以有多個事件處理程序,按順序執行,捕獲事件和冒泡事件
  • DOM3級事件,增加了事件類型,比如 UI 事件,焦點事件,鼠標事件

參考鏈接

https://zhuanlan.zhihu.com/p/73091706

問:new 一個函數發生了什么

構造調用:

  • 創造一個全新的對象
  • 這個對象會被執行 [[Prototype]] 連接,將這個新對象的 [[Prototype]] 鏈接到這個構造函數.prototype 所指向的對象
  • 這個新對象會綁定到函數調用的 this
  • 如果函數沒有返回其他對象,那么 new 表達式中的函數調用會自動返回這個新對象

問:new 一個構造函數,如果函數返回 return {} 、 return null , return 1 , return true 會發生什么情況?

如果函數返回一個對象,那么new 這個函數調用返回這個函數的返回對象,否則返回 new 創建的新對象

問:symbol 有什么用處

可以用來表示一個獨一無二的變量防止命名沖突。但是面試官問還有嗎?我沒想出其他的用處就直接答我不知道了,還可以利用 symbol 不會被常規的方法(除了 Object.getOwnPropertySymbols 外)遍歷到,所以可以用來模擬私有變量。

主要用來提供遍歷接口,布置了 symbol.iterator 的對象才可以使用 for···of 循環,可以統一處理數據結構。調用之后回返回一個遍歷器對象,包含有一個 next 方法,使用 next 方法后有兩個返回值 value 和 done 分別表示函數當前執行位置的值和是否遍歷完畢。

Symbol.for() 可以在全局訪問 symbol

(3)問:閉包是什么?

閉包是指有權訪問另外一個函數作用域中的變量的函數

JavaScript代碼的整個執行過程,分為兩個階段,代碼編譯階段與代碼執行階段。編譯階段由編譯器完成,將代碼翻譯成可執行代碼,這個階段作用域規則會確定。執行階段由引擎完成,主要任務是執行可執行代碼,執行上下文在這個階段創建。


image.png

什么是作業域?

ES5 中只存在兩種作用域:全局作用域和函數作用域。在 JavaScript 中,我們將作用域定義為一套規則,這套規則用來管理引擎如何在當前作用域以及嵌套子作用域中根據標識符名稱進行變量(變量名或者函數名)查找

什么是作用域鏈?

首先要了解作用域鏈,當訪問一個變量時,編譯器在執行這段代碼時,會首先從當前的作用域中查找是否有這個標識符,如果沒有找到,就會去父作用域查找,如果父作用域還沒找到繼續向上查找,直到全局作用域為止,,而作用域鏈,就是有當前作用域與上層作用域的一系列變量對象組成,它保證了當前執行的作用域對符合訪問權限的變量和函數的有序訪問。

閉包產生的本質

當前環境中存在指向父級作用域的引用

什么是閉包

閉包是一種特殊的對象,它由兩部分組成:執行上下文(代號 A),以及在該執行上下文中創建的函數 (代號 B),當 B 執行時,如果訪問了 A 中變量對象的值,那么閉包就會產生,且在 Chrome 中使用這個執行上下文 A 的函數名代指閉包。

一般如何產生閉包

  • 返回函數
  • 函數當做參數傳遞

閉包的應用場景

  • 柯里化 bind
  • 模塊

參考文章

https://segmentfault.com/a/1190000012646221

問:NaN 是什么,用 typeof 會輸出什么?

Not a Number,表示非數字,typeof NaN === 'number'

(2)問:JS 隱式轉換,顯示轉換一般非基礎類型進行轉換

時會先調用 valueOf,如果 valueOf 無法返回基本類型值,就會調用 toString

字符串和數字

  • "+" 操作符,如果有一個為字符串,那么都轉化到字符串然后執行字符串拼接
  • "-" 操作符,轉換為數字,相減 (-a, a * 1 a/1) 都能進行隱式強制類型轉換
  1. [] + {} 和 {} + [] 

布爾值到數字

  • 1 + true = 2
  • 1 + false = 1

轉換為布爾值

  • for 中第二個
  • while
  • if
  • 三元表達式
  • || (邏輯或) && (邏輯與)左邊的操作數

符號

  • 不能被轉換為數字
  • 能被轉換為布爾值(都是 true)
  • 可以被轉換成字符串 "Symbol(cool)"

寬松相等和嚴格相等

寬松相等允許進行強制類型轉換,而嚴格相等不允許

字符串與數字

轉換為數字然后比較

其他類型與布爾類型

  • 先把布爾類型轉換為數字,然后繼續進行比較

對象與非對象

  • 執行對象的 ToPrimitive(對象)然后繼續進行比較

假值列表

  • undefined
  • null
  • false
  • +0, -0, NaN
  • ""

(2)問:了解 this 嘛,bind,call,apply 具體指什么

它們都是函數的方法

call: Array.prototype.call(this, args1, args2])apply: Array.prototype.apply(this, [args1, args2]) :ES6 之前用來展開數組調用, foo.appy(null, []),ES6 之后使用 ... 操作符

  • New 綁定 > 顯示綁定 > 隱式綁定 > 默認綁定
  • 如果需要使用 bind 的柯里化和 apply 的數組解構,綁定到 null,盡可能使用 Object.create(null) 創建一個 DMZ 對象

四條規則:

  • 默認綁定,沒有其他修飾(bind、apply、call),在非嚴格模式下定義指向全局對象,在嚴格模式下定義指向 undefined
  1. function foo() { 
  2.   console.log(this.a);  
  3.  
  4. var a = 2; 
  5. foo(); 
  • 隱式綁定:調用位置是否有上下文對象,或者是否被某個對象擁有或者包含,那么隱式綁定規則會把函數調用中的 this 綁定到這個上下文對象。而且,對象屬性鏈只有上一層或者說最后一層在調用位置中起作用
  1. function foo() { 
  2.   console.log(this.a); 
  3.  
  4. var obj = { 
  5.   a: 2, 
  6.   foo: foo, 
  7.  
  8. obj.foo(); // 2 
  • 顯示綁定:通過在函數上運行 call 和 apply ,來顯示的綁定 this
  1. function foo() { 
  2.   console.log(this.a); 
  3.  
  4. var obj = { 
  5.   a: 2 
  6. }; 
  7.  
  8. foo.call(obj); 

顯示綁定之硬綁定

  1. function foo(something) { 
  2.   console.log(this.a, something); 
  3.    
  4.   return this.a + something; 
  5.  
  6. function bind(fn, obj) { 
  7.   return function() { 
  8.     return fn.apply(obj, arguments); 
  9.   }; 
  10.  
  11. var obj = { 
  12.   a: 2 
  13.  
  14. var bar = bind(foo, obj); 

New 綁定,new 調用函數會創建一個全新的對象,并將這個對象綁定到函數調用的 this。

  • New 綁定時,如果是 new 一個硬綁定函數,那么會用 new 新建的對象替換這個硬綁定 this,
  1. function foo(a) { 
  2.   this.a = a; 
  3.  
  4. var bar = new foo(2); 
  5. console.log(bar.a) 

(4)問:手寫 bind、apply、call

  1. // call 
  2.  
  3. Function.prototype.call = function (context, ...args) { 
  4.   context = context || window; 
  5.    
  6.   const fnSymbol = Symbol("fn"); 
  7.   context[fnSymbol] = this; 
  8.    
  9.   context[fnSymbol](...args); 
  10.   delete context[fnSymbol]; 

  1. // apply 
  2.  
  3. Function.prototype.apply = function (context, argsArr) { 
  4.   context = context || window; 
  5.    
  6.   const fnSymbol = Symbol("fn"); 
  7.   context[fnSymbol] = this; 
  8.    
  9.   context[fnSymbol](...argsArr); 
  10.   delete context[fnSymbol]; 

  1. // bind 
  2.  
  3. Function.prototype.bind = function (context, ...args) { 
  4.   context = context || window; 
  5.   const fnSymbol = Symbol("fn"); 
  6.   context[fnSymbol] = this; 
  7.    
  8.   return function (..._args) { 
  9.     _args = _args.concat(args); 
  10.      
  11.     context[fnSymbol](..._args); 
  12.     delete context[fnSymbol];    
  13.   } 
  14.      

(3)問:setTimeout(fn, 0)多久才執行,Event Loop

setTimeout 按照順序放到隊列里面,然后等待函數調用棧清空之后才開始執行,而這些操作進入隊列的順序,則由設定的延遲時間來決定

手寫題:Promise 原理

  1. class MyPromise { 
  2.   constructor(fn) { 
  3.     this.resolvedCallbacks = []; 
  4.     this.rejectedCallbacks = []; 
  5.      
  6.     this.state = 'PENDING'
  7.     this.value = ''
  8.      
  9.     fn(this.resolve.bind(this), this.reject.bind(this)); 
  10.      
  11.   } 
  12.    
  13.   resolve(value) { 
  14.     if (this.state === 'PENDING') { 
  15.       this.state = 'RESOLVED'
  16.       this.value = value; 
  17.        
  18.       this.resolvedCallbacks.map(cb => cb(value));    
  19.     } 
  20.   } 
  21.    
  22.   reject(value) { 
  23.     if (this.state === 'PENDING') { 
  24.       this.state = 'REJECTED'
  25.       this.value = value; 
  26.        
  27.       this.rejectedCallbacks.map(cb => cb(value)); 
  28.     } 
  29.   } 
  30.    
  31.   then(onFulfilled, onRejected) { 
  32.     if (this.state === 'PENDING') { 
  33.       this.resolvedCallbacks.push(onFulfilled); 
  34.       this.rejectedCallbacks.push(onRejected); 
  35.        
  36.     } 
  37.      
  38.     if (this.state === 'RESOLVED') { 
  39.       onFulfilled(this.value); 
  40.     } 
  41.      
  42.     if (this.state === 'REJECTED') { 
  43.       onRejected(this.value); 
  44.     } 
  45.   } 
  46.        

問:js腳本加載問題,async、defer問題

  • 如果依賴其他腳本和 DOM 結果,使用 defer
  • 如果與 DOM 和其他腳本依賴不強時,使用 async

參考資料

https://mp.weixin.qq.com/s/pw5lfFeNagmjFj45ygl2dQ

問:如何判斷一個對象是不是空對象?

Object.keys(obj).length === 0

問: <script src=’xxx’ ’xxx’/>外部js文件先加載還是onload先執行,為什么?
onload 是所以加載完成之后執行的

問:怎么加事件監聽,兩種
onclick 和 addEventListener

問:事件傳播機制(事件流)
冒泡和捕獲

(4)問:說一下原型鏈和原型鏈的繼承吧

  • 所有普通的 [[Prototype]] 鏈最終都會指向內置的 Object.prototype,其包含了 JavaScript 中許多通用的功能
  • 為什么能創建 “類”,借助一種特殊的屬性:所有的函數默認都會擁有一個名為 prototype 的共有且不可枚舉的屬性,它會指向另外一個對象,這個對象通常被稱為函數的原型
  1. function Person(name) { 
  2.   this.name = name
  3.  
  4. Person.prototype.constructor = Person 
  • 在發生 new 構造函數調用時,會將創建的新對象的 [[Prototype]] 鏈接到 Person.prototype 指向的對象,這個機制就被稱為原型鏈繼承
  • 方法定義在原型上,屬性定義在構造函數上
  • 首先要說一下 JS 原型和實例的關系:每個構造函數 (constructor)都有一個原型對象(prototype),這個原型對象包含一個指向此構造函數的指針屬性,通過 new 進行構造函數調用生成的實例,此實例包含一個指向原型對象的指針,也就是通過 [[Prototype]] 鏈接到了這個原型對象
  • 然后說一下 JS 中屬性的查找:當我們試圖引用實例對象的某個屬性時,是按照這樣的方式去查找的,首先查找實例對象上是否有這個屬性,如果沒有找到,就去構造這個實例對象的構造函數的 prototype 所指向的對象上去查找,如果還找不到,就從這個 prototype 對象所指向的構造函數的 prototype 原型對象上去查找
  • 什么是原型鏈:這樣逐級查找形似一個鏈條,且通過 [[Prototype]] 屬性鏈接,所以被稱為原型鏈
  • 什么是原型鏈繼承,類比類的繼承:當有兩個構造函數 A 和 B,將一個構造函數 A 的原型對象的,通過其 [[Prototype]] 屬性鏈接到另外一個 B 構造函數的原型對象時,這個過程被稱之為原型繼承。

標準答案更正確的解釋
什么是原型鏈?

當對象查找一個屬性的時候,如果沒有在自身找到,那么就會查找自身的原型,如果原型還沒有找到,那么會繼續查找原型的原型,直到找到 Object.prototype 的原型時,此時原型為 null,查找停止。這種通過 通過原型鏈接的逐級向上的查找鏈被稱為原型鏈

什么是原型繼承?

一個對象可以使用另外一個對象的屬性或者方法,就稱之為繼承。具體是通過將這個對象的原型設置為另外一個對象,這樣根據原型鏈的規則,如果查找一個對象屬性且在自身不存在時,就會查找另外一個對象,相當于一個對象可以使用另外一個對象的屬性和方法了。

參考鏈接
https://zhuanlan.zhihu.com/p/35790971
問:說下對 JS 的了解吧
是基于原型的動態語言,主要獨特特性有 this、原型和原型鏈。

JS 嚴格意義上來說分為:語言標準部分(ECMAScript)+ 宿主環境部分

語言標準部分
2015 年發布 ES6,引入諸多新特性使得能夠編寫大型項目變成可能,標準自 2015 之后以年號代號,每年一更

宿主環境部分
在瀏覽器宿主環境包括 DOM + BOM 等
在 Node,宿主環境包括一些文件、數據庫、網絡、與操作系統的交互等
問:數組能夠調用的函數有那些?

  • push
  • pop
  • splice
  • slice
  • shift
  • unshift
  • sort
  • find
  • findIndex
  • map/filter/reduce 等函數式編程方法
  • 還有一些原型鏈上的方法:toString/valudOf

問:如何判斷數組類型
Array.isArray

問: 函數中的arguments是數組嗎?類數組轉數組的方法了解一下?
是類數組,是屬于鴨子類型的范疇,長得像數組,

... 運算符
Array.from
Array.prototype.slice.apply(arguments)
問:用過 TypeScript 嗎?它的作用是什么?
為 JS 添加類型支持,以及提供最新版的 ES 語法的支持,是的利于團隊協作和排錯,開發大型項目

問:PWA使用過嗎?serviceWorker的使用原理是啥?
漸進式網絡應用(PWA)是谷歌在2015年底提出的概念。基本上算是web應用程序,但在外觀和感覺上與原生app類似。支持PWA的網站可以提供脫機工作、推送通知和設備硬件訪問等功能。

Service Worker是瀏覽器在后臺獨立于網頁運行的腳本,它打開了通向不需要網頁或用戶交互的功能的大門。現在,它們已包括如推送通知和后臺同步等功能。將來,Service Worker將會支持如定期同步或地理圍欄等其他功能。本教程討論的核心功能是攔截和處理網絡請求,包括通過程序來管理緩存中的響應。

參考鏈接
https://juejin.im/post/5e26aa785188254c257c462d#heading-8
問:ES6 之前使用 prototype 實現繼承
Object.create() 會創建一個 “新” 對象,然后將此對象內部的 [[Prototype]] 關聯到你指定的對象(Foo.prototype)。Object.create(null) 創建一個空 [[Prototype]] 鏈接的對象,這個對象無法進行委托。

  1. function Foo(name) { 
  2.   this.name = name
  3.  
  4. Foo.prototype.myName = function () { 
  5.   return this.name
  6.  
  7. // 繼承屬性,通過借用構造函數調用 
  8. function Bar(name, label) { 
  9.   Foo.call(this, name); 
  10.   this.label = label; 
  11.  
  12. // 繼承方法,創建備份 
  13. Bar.prototype = Object.create(Foo.prototype); 
  14.  
  15. // 必須設置回正確的構造函數,要不然在會發生判斷類型出錯 
  16. Bar.prototype.constructor = Bar; 
  17.  
  18.  // 必須在上一步之后 
  19. Bar.prototype.myLabel = function () { 
  20.   return this.label; 
  21.  
  22. var a = new Bar("a""obj a"); 
  23.  
  24. a.myName(); // "a" 
  25. a.myLabel(); // "obj a" 

問:如果一個構造函數,bind了一個對象,用這個構造函數創建出的實例會繼承這個對象的屬性嗎?為什么?
不會繼承,因為根據 this 綁定四大規則,new 綁定的優先級高于 bind 顯示綁定,通過 new 進行構造函數調用時,會創建一個新對象,這個新對象會代替 bind 的對象綁定,作為此函數的 this,并且在此函數沒有返回對象的情況下,返回這個新建的對象

(3)箭頭函數和普通函數有啥區別?箭頭函數能當構造函數嗎?

  1. 普通函數通過 function 關鍵字定義, this 無法結合詞法作用域使用,在運行時綁定,只取決于函數的調用方式,在哪里被調用,調用位置。(取決于調用者,和是否獨立運行)
  2. 箭頭函數使用被稱為 “胖箭頭” 的操作 => 定義,箭頭函數不應用普通函數 this 綁定的四種規則,而是根據外層(函數或全局)的作用域來決定 this,且箭頭函數的綁定無法被修改(new 也不行)。
  • 一個函數內部有兩個方法:[[Call]] 和 [[Construct]],在通過 new 進行函數調用時,會執行 [[construct]] 方法,創建一個實例對象,然后再執行這個函數體,將函數的 this 綁定在這個實例對象上
  • 當直接調用時,執行 [[Call]] 方法,直接執行函數體
  • 箭頭函數沒有 [[Construct]] 方法,不能被用作構造函數調用,當使用 new 進行函數調用時會報錯。
  • 箭頭函數常用于回調函數中,包括事件處理器或定時器
  • 箭頭函數和 var self = this,都試圖取代傳統的 this 運行機制,將 this 的綁定拉回到詞法作用域
  • 沒有原型、沒有 this、沒有 super,沒有 arguments,沒有 new.target
  • 不能通過 new 關鍵字調用
  1. function foo() { 
  2.   return (a) => { 
  3.     console.log(this.a); 
  4.   } 
  5.  
  6. var obj1 = { 
  7.   a: 2 
  8.  
  9. var obj2 = { 
  10.   a: 3  
  11.  
  12. var bar = foo.call(obj1); 
  13. bar.call(obj2); 

參考資料
https://segmentfault.com/a/1190000015162781
問:知道 ES6 的 Class 嘛?Static 關鍵字有了解嘛
為這個類的函數對象直接添加方法,而不是加在這個函數對象的原型對象上

(3)問:事件循環機制 (Event Loop)
事件循環機制從整體上告訴了我們 JavaScript 代碼的執行順序Event Loop即事件循環,是指瀏覽器或Node的一種解決javaScript單線程運行時不會阻塞的一種機制,也就是我們經常使用異步的原理。

先執行宏任務隊列,然后執行微任務隊列,然后開始下一輪事件循環,繼續先執行宏任務隊列,再執行微任務隊列。

  • 宏任務:script/setTimeout/setInterval/setImmediate/ I/O / UI Rendering
  • 微任務:process.nextTick()/Promise

上訴的 setTimeout 和 setInterval 等都是任務源,真正進入任務隊列的是他們分發的任務。

優先級

  • setTimeout = setInterval 一個隊列
  • setTimeout > setImmediate
  • process.nextTick > Promise
  1. for (const macroTask of macroTaskQueue) {   
  2.   handleMacroTask();     
  3.   for (const microTask of microTaskQueue) {     
  4.    handleMicroTask(microTask);   
  5.   } 

參考鏈接
https://juejin.im/post/59e85eebf265da430d571f89
(2)手寫題:數組扁平化

  1. function flatten(arr) { 
  2.   let result = []; 
  3.  
  4.   for (let i = 0; i < arr.length; i++) { 
  5.     if (Array.isArray(arr[i])) { 
  6.       result = result.concat(flatten(arr[i])); 
  7.     } else { 
  8.       result = result.concat(arr[i]); 
  9.     } 
  10.   } 
  11.  
  12.   return result; 
  13.  
  14. const a = [1, [2, [3, 4]]]; 
  15. console.log(flatten(a)); 

 手寫題:實現柯里化
預先設置一些參數

柯里化是什么:是指這樣一個函數,它接收函數 A,并且能返回一個新的函數,這個新的函數能夠處理函數 A 的剩余參數

  1. function createCurry(func, args) { 
  2.   var argity = func.length; 
  3.   var args = args || []; 
  4.    
  5.   return function () { 
  6.     var _args = [].slice.apply(arguments); 
  7.     args.push(..._args); 
  8.      
  9.     if (args.length < argity) { 
  10.       return createCurry.call(this, func, args); 
  11.     } 
  12.      
  13.     return func.apply(this, args); 
  14.   } 

手寫題:數組去重

  1. Array.from(new Set([1, 1, 2, 2])) 

問:let 閉包
let 會產生臨時性死區,在當前的執行上下文中,會進行變量提升,但是未被初始化,所以在執行上下文執行階段,執行代碼如果還沒有執行到變量賦值,就引用此變量就會報錯,此變量未初始化。

問:變量提升
函數在運行的時候,會首先創建執行上下文,然后將執行上下文入棧,然后當此執行上下文處于棧頂時,開始運行執行上下文。

在創建執行上下文的過程中會做三件事:創建變量對象,創建作用域鏈,確定 this 指向,其中創建變量對象的過程中,首先會為 arguments 創建一個屬性,值為 arguments,然后會掃碼 function 函數聲明,創建一個同名屬性,值為函數的引用,接著會掃碼 var 變量聲明,創建一個同名屬性,值為 undefined,這就是變量提升。

instance 如何使用
左邊可以是任意值,右邊只能是函數

  1. 'hello tuture' instanceof String // false 

參考資料

  • https://juejin.im/post/5d79ccf85188254bf34fd9d1
  • https://mp.weixin.qq.com/s/pw5lfFeNagmjFj45ygl2dQ
  • https://mp.weixin.qq.com/s/bHclDpsGdfaZQT8u9VRAAw
  • https://www.jianshu.com/p/cd3fee40ef59

 

責任編輯:姜華 來源: 圖雀社區
相關推薦

2021-03-15 09:53:37

計算機網絡面試題

2024-02-26 15:35:44

2022-01-18 08:16:52

Web 前端JavaScript

2022-07-27 08:27:34

Call前端

2022-02-09 07:40:42

JavaScript前端面試題

2023-05-19 08:21:40

MarginCSS

2019-02-21 14:12:26

前端面試題Vue

2023-08-27 15:57:28

前端開發

2024-01-01 15:30:59

JavaScriptWeb 應用程序開發

2022-07-08 08:21:26

JSbind 方法

2023-06-26 08:24:23

JavaScriptAJAX

2020-09-16 14:17:42

flat方法

2018-03-08 18:40:47

Java百度面試題

2010-12-02 11:31:24

2025-01-09 12:00:00

JavaScript前端數組

2019-09-02 15:06:16

面試字節跳動算法

2013-01-05 14:51:34

JavaScriptjQuery面試

2024-06-04 14:52:28

2017-09-06 09:13:24

2023-12-12 07:40:52

JavaScript面試題前端
點贊
收藏

51CTO技術棧公眾號

av最新在线观看| aaa毛片在线观看| 日本黄色一区二区三区| 国产精品久久久久久模特| 亚洲视频在线免费观看| 久久久精品高清| 97蜜桃久久| 国产欧美精品在线观看| 亚洲最大成人网色| 麻豆成人免费视频| 重囗味另类老妇506070| 精品视频在线观看日韩| 6080国产精品| 88xx成人永久免费观看| 夜夜嗨av一区二区三区四季av| 日韩av电影免费播放| 亚洲国产精品久久久久爰性色 | 亚洲欧美日韩一区二区三区四区| 91高清一区| 亚洲最新av在线| 国产十八熟妇av成人一区| 成年永久一区二区三区免费视频| 岛国av在线不卡| 国产成人三级视频| 岛国在线视频| 91亚洲精华国产精华精华液| 亚洲在线一区二区| 在线观看国产黄| 丝袜美腿高跟呻吟高潮一区| 久久免费少妇高潮久久精品99| 精品国产视频在线观看| 国产精品探花在线观看| 日韩精品高清在线| 最新国产精品自拍| 欧美高清一级片| 欧美日韩精品久久久| 激情五月开心婷婷| 国产乱码精品一区二三赶尸艳谈| 亚洲精品国产第一综合99久久| 亚洲精品二区| 酒色婷婷桃色成人免费av网| 91碰在线视频| 精品国产福利| 人妻一区二区三区免费| 丰满放荡岳乱妇91ww| 亚洲一区久久久| 91精品国产色综合久久不8| 日韩激情中文字幕| 国产精品爱久久久久久久| 国产又大又黄又粗| 亚洲欧美日本视频在线观看| 欧美中文字幕在线| 国产黄色免费观看| 久久久综合网| 国产精品久久久91| 无码人妻精品一区二区50| 免费在线观看成人av| 日本精品在线视频 | 欧美视频在线观看一区| 乌克兰美女av| 日日狠狠久久| 欧美一级精品在线| 91福利视频免费观看| 999久久久久久久久6666| 精品国产污网站| 在线观看免费视频黄| 狼人精品一区二区三区在线| 精品无码久久久久久国产| 麻豆av免费观看| 久久福利影院| 欧美黄色片视频| 99久在线精品99re8热| 国产一区二区三区久久久久久久久 | 污污的视频在线观看| 亚洲午夜精品在线| 日韩精品视频久久| 成人精品高清在线视频| 欧美一区二区在线播放| 韩国三级视频在线观看| 亚洲精品蜜桃乱晃| xvideos国产精品| 久久久久免费看| 国产美女精品| 国产精品自拍视频| 亚洲欧美黄色片| 久久久久久久久久久黄色| 亚洲精品乱码久久久久久蜜桃91| 最新黄网在线观看| 欧美日韩视频免费播放| 亚洲一区二区三区四区五区xx| 91麻豆精品国产综合久久久 | 国产黄频在线观看| 欧美动物xxx| 337p亚洲精品色噜噜狠狠| 手机在线观看日韩av| 欧美影院天天5g天天爽| 在线中文字幕日韩| 精品午夜福利视频| 日本成人在线电影网| 国产精品一 二 三| a视频网址在线观看| 亚洲午夜视频在线| 一个色综合久久| 婷婷成人在线| 欧美成人国产va精品日本一级| 在线观看免费av片| 国产成人免费xxxxxxxx| 日本欧美精品久久久| 国产精品偷拍| 88在线观看91蜜桃国自产| 欧美老熟妇乱大交xxxxx| 亚洲91精品| 国产精品久久久久7777婷婷| 亚洲免费国产视频| 最新国产精品久久精品| 欧美韩国日本在线| 成人av影音| 久久婷婷国产麻豆91天堂| 一区二区三区福利视频| 国产91色综合久久免费分享| 夜夜爽99久久国产综合精品女不卡 | 蜜臀久久99精品久久久| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 免费成人黄色网| 日韩av在线网| 国产亚洲精品成人| 国产精品一二三四五| 夜夜爽www精品| 国产精品.xx视频.xxtv| 亚洲欧美在线一区二区| 欧美一级特黄视频| 99热精品一区二区| 日本福利视频一区| 成人中文字幕视频| 欧美激情视频一区| 精品人妻aV中文字幕乱码色欲| 亚洲天堂免费看| 中文字幕天天干| 日韩在线观看| 国产精品自产拍高潮在线观看| 成人免费在线电影| 91国偷自产一区二区三区成为亚洲经典 | 精品色999| 国产精品1234| 成人免费黄色网页| 欧美日韩一区二区电影| 日韩影视一区二区三区| 奇米精品一区二区三区四区| 日韩精品伦理第一区| 蜜桃精品在线| 在线观看视频亚洲| 又骚又黄的视频| 国产精品成人午夜| 在线播放黄色av| 欧美激情第10页| 国产一区自拍视频| 韩国视频一区二区三区| 好吊日视频在线观看| 欧美妇女性影城| 粉嫩av性色av蜜臀av网站| 国产自产视频一区二区三区| 在线视频一二三区| 国产日韩三级| 青青久久av北条麻妃黑人| 国产三级视频在线| 666欧美在线视频| 成人免费看片98| 99久久精品国产毛片| 日韩 欧美 高清| 日韩欧美视频在线播放| 亚洲a一级视频| caoprom在线| 国产一区二区动漫| 国产色片在线观看| 亚洲国产aⅴ天堂久久| 亚洲蜜桃精久久久久久久久久久久| 久久精品一区二区三区中文字幕 | 欧美日韩一区自拍| 久久草视频在线看| 欧美性www| 久久免费高清视频| 成人jjav| 精品国产91洋老外米糕| 免费的毛片视频| 亚洲视频一区二区免费在线观看| 妖精视频一区二区| 视频一区视频二区中文字幕| 中文字幕在线乱| 无码日韩精品一区二区免费| 国产精品久久久久久影视| 亚洲电影视频在线| 亚洲欧美日韩成人| 亚洲一区二区三区四区在线播放| 亚洲一卡二卡在线| 亚洲va韩国va欧美va| 亚洲一区 欧美| 成人激情黄色小说| 91欧美视频在线| 国产日本精品| 无颜之月在线看| 成人在线丰满少妇av| 福利视频久久| 自拍偷拍亚洲| 国产福利成人在线| av中文在线资源库| 日韩视频一区在线| 国产黄在线观看免费观看不卡| 日韩美女一区二区三区四区| 中文在线字幕av| 精品久久在线播放| 青青草激情视频| 国产精品久久久久久久久晋中 | 国产精品久久久久久户外露出| 亚洲一区二区乱码| 国产精品一区不卡| 在线观看国产一级片| 国产九九精品| 9久久9毛片又大又硬又粗| 自拍日韩欧美| www.黄色网址.com| 日韩欧美伦理| 亚洲高清资源综合久久精品| 亚洲精品合集| 久久久久九九九| 成人性生交大片免费看中文视频| 91中文精品字幕在线视频| 国产三级一区| 国产精品扒开腿爽爽爽视频| 美女18一级毛片一品久道久久综合| 久久久久久美女| sm国产在线调教视频| 日韩中文字幕视频| seseavlu视频在线| 亚洲午夜未删减在线观看| 水中色av综合| 精品亚洲精品福利线在观看| 手机在线观看免费av| 精品国产乱码久久久久久闺蜜| 国产sm主人调教女m视频| 678五月天丁香亚洲综合网| 精品国产91亚洲一区二区三区www| 好男人在线视频www| 日韩欧美一二三| 国产成人精品av在线观| 欧美一区二区不卡视频| va婷婷在线免费观看| 欧美一区二区观看视频| 99国产精品一区二区三区 | 2018国产精品视频| 蜜桃视频在线网站| 日本亚洲精品在线观看| 香蕉成人影院| 国产这里只有精品| 精品中文字幕一区二区三区四区| 91老司机精品视频| 欧美午夜网站| 国产一区免费视频| 欧美日韩播放| 亚洲高清资源综合久久精品| 91精品国产91久久久久久密臀| 国产激情在线看| 亚洲精品女人| 蜜臀久久99精品久久久酒店新书| 奇米精品一区二区三区四区| 亚洲综合123| 99视频在线精品| 国产中年熟女高潮大集合| 中文字幕乱码一区二区免费| 三级av在线免费观看| 亚洲综合999| 国产91精品看黄网站在线观看| 欧美少妇bbb| www.四虎在线观看| 亚洲精品日韩欧美| 三级外国片在线观看视频| 色与欲影视天天看综合网| 国产在线观看第一页| 亚洲精品99| 日韩视频在线播放| 欧美在线免费| 91传媒久久久| 久久爱www久久做| 俄罗斯黄色录像| 日本一区二区三区四区| 欧美人与禽zozzo禽性配| 色综合久久久久| 国产精品人妻一区二区三区| 亚洲精品国产精品国自产在线| 免费在线看a| 2019中文在线观看| 99tv成人影院| 久久精品五月婷婷| 日韩欧美字幕| 99爱视频在线| 韩国女主播成人在线观看| av网页在线观看| ...xxx性欧美| 波多野结衣不卡| 精品欧美久久久| 欧美性天天影视| 69久久夜色精品国产69乱青草| 外国成人毛片| 日韩av在线电影观看| 黑丝一区二区| 三上悠亚在线一区二区| 91在线视频在线| 极品久久久久久| 欧洲精品一区二区| 五十路在线视频| 欧美乱人伦中文字幕在线| 国产精品高清乱码在线观看| 国产青春久久久国产毛片| 久久久久久久久久久妇女| 亚洲精品高清无码视频| 成人ar影院免费观看视频| 人妻少妇精品一区二区三区| 欧美日韩一级片在线观看| 日本午夜在线| 性欧美暴力猛交69hd| 亚洲综合色婷婷在线观看| 国产高清免费在线| 美女在线视频一区| 亚洲最大成人综合网| 日韩欧美在线国产| 四虎永久在线精品免费网址| 欧美放荡办公室videos4k| 精品久久免费| 精品一区二区成人免费视频| 日韩av一区二区在线影视| 久久久久亚洲av无码专区桃色| 婷婷综合在线观看| 日本黄色三级视频| 97在线视频免费观看| 国产成人夜色高潮福利影视| 99久久久精品视频| 国产suv精品一区二区883| 国产极品国产极品| 日韩一区二区在线免费观看| 91高清在线观看视频| 91嫩草在线| 欧美性色综合| 日本黄色免费观看| 精品国产户外野外| 水莓100在线视频| 国产91在线播放| 波多野结衣在线播放一区| 91蝌蚪视频在线观看| 欧美经典三级视频一区二区三区| 蜜臀尤物一区二区三区直播| 在线亚洲男人天堂| 91亚洲精品在看在线观看高清| 精品久久免费观看| 国产精品一区二区久久精品爱涩| 少妇久久久久久被弄高潮| 精品捆绑美女sm三区| 草草视频在线| 任我爽在线视频精品一| 捆绑变态av一区二区三区| 日本中文在线视频| 欧美不卡一区二区| 极品视频在线| 五月天综合网| 国产精品99久| 五月婷婷激情网| 国产午夜精品全部视频在线播放 | 国产高清一区二区三区视频| 亚洲综合中文字幕在线| 99伊人成综合| 久久精品三级视频| 日韩一区二区影院| 涩涩视频在线免费看| 欧美色欧美亚洲另类七区| 狠狠v欧美v日韩v亚洲ⅴ| 久久精品视频日本| 亚洲人成亚洲人成在线观看| 色成人综合网| 1024av视频| 国产精品久久久久久一区二区三区 | 在线欧美小视频| 久操视频在线| 久久精品美女| 韩国v欧美v日本v亚洲v| 精品91久久久| 日韩中文理论片| 美国成人xxx| 日日干日日操日日射| 亚洲在线免费播放| www.中文字幕久久久| 国产高清一区视频| 久久精品国产在热久久| 久久久久久久国产视频| 有码中文亚洲精品| 国产精品传媒| 国产原创精品在线| 精品福利在线观看| 免费在线看黄色| 日本一区二区久久精品| 成人激情文学综合网| 国产精品久久久久久久久毛片| 911国产网站尤物在线观看|