久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網運營的一線實戰(zhàn)洞察。

前端面試12大考點:閉包、this、事件循環(huán)與原型鏈全解析

前端面試12大考點:閉包、this、事件循環(huán)與原型鏈全解析 前端面試前臨時抱佛腳背了五十道題結果面試官隨口一句“那你講講閉包到底閉的是什么”就把人問懵了——這種場面我見過太多次了。作為在前端崗位干了些年、也坐在面試官這側篩過不少候選人的人說實話90%的面試翻車都不是死在框架 API 上而是死在 JS 語言本身的這幾個核心點上。誰也沒真統(tǒng)計過“90%”這個數字但以我觀察到的面試記錄來看反復出現(xiàn)的大概率就是這 12 個點作用域與閉包、this 指向、原型鏈與繼承、手寫 new、事件循環(huán)、Promise 與異常處理、setTimeout 的坑、深淺拷貝、數組方法、字符串與 URL 處理、事件委托、防抖與節(jié)流。這篇文章我按底層邏輯把它們歸成六組來聊每組解決一類問題。你會發(fā)現(xiàn)很多題表面問法不同本質上考的卻是同一套東西作用域鏈、調用棧、對象模型、事件機制。下面直接開講。1. 作用域、閉包與 this 指向面試第一階段最常翻車的三道連環(huán)題1.1 作用域鏈與閉包從計數器題看本質先看一段幾乎所有前端都寫過的代碼function createCounter() { let count 0; return function () { count; return count; }; } const counter createCounter(); console.log(counter()); // 1 console.log(counter()); // 2面試官問你“為什么兩次執(zhí)行結果不一樣count 明明在函數內部怎么沒被重置”這就是閉包在起作用。要解釋清楚得分三層說。第一JS 里作用域分全局、函數、塊級三種而且變量的可訪問范圍在代碼編寫時就確定了這叫詞法作用域。第二函數 createCounter 執(zhí)行時內部 return 的函數雖然沒立即執(zhí)行但它把 createCounter 的整個作用域鏈“打包帶走”了。第三count 變量并不會在 createCounter 執(zhí)行結束后被銷毀因為還有另一個函數在引用它這個引用關系讓 count 一直活在內存里。我面試時特別喜歡追問一句“你覺得閉包是閉住了什么”很多人答“閉住了變量”其實更準確的說法是“閉住了對變量所在詞法環(huán)境的引用”。同一份作用域可以被多個閉包共享這才是后面 for 循環(huán)坑的根源。比如這個經典題for (var i 0; i 3; i) { setTimeout(function () { console.log(i); }, 0); } // 輸出3 3 3var 聲明的 i 是函數級變量三個 setTimeout 回調閉住的不是 i 的值而是同一個 i 的引用。等到定時器執(zhí)行時循環(huán)早跑完了i 已經變成 3。解決方案不外乎兩種把 var 改成 let讓每一輪循環(huán)生成獨立的塊級作用域或者用 IIFE 把 i 作為參數傳進一個獨立的函數作用域。閉包的實際應用場景比很多人想象的多防抖節(jié)流函數內部的狀態(tài)保存、模塊化隔離私有變量、組件庫中讓數據對外只讀等。面試官讓你“寫一個實際使用的閉包場景”最穩(wěn)妥的回答不是背定義而是直接寫一個防抖或節(jié)流函數把閉包對持久狀態(tài)的控制展示出來。還有一個追問頻率很高的點“閉包會不會造成內存泄漏”答案是“不合理使用才會”。閉包真正持有的不是變量值而是整個作用域鏈如果你不小心把一個超大對象掛在閉包能訪問的位置該對象就一直不會被回收。我之前排查過一個后臺系統(tǒng)卡頓的問題最后定位就是一個可以無限滾動的表格里事件回調閉包了整行數據對象表格數據列表在內存里越攢越多。1.2 this 指向的四條綁定規(guī)則與箭頭函數的例外this 是秋招面試第二高發(fā)區(qū)的重災區(qū)。很多人喜歡背口訣“誰調用指向誰”這口訣只對了一半真正標準說法是“看調用位置的綁定模式”一共有四種。默認綁定函數直接調用this 指向全局對象嚴格模式下是 undefined。function say() { console.log(this); } say(); // window嚴格模式下是 undefined隱式綁定通過對象屬性調用時this 指向該對象。這里有個經典陷阱——把方法拆出來單獨調用綁定就丟了const obj { name: obj, getName: function () { console.log(this.name); }, }; const fn obj.getName; fn(); // undefined因為此時是普通函數調用 obj.getName(); // obj符合隱式綁定顯式綁定call、apply、bind 都能強制指定 this。區(qū)別在于 call 和 apply 會立即執(zhí)行函數bind 只返回一個綁定了 this 的新函數。new 綁定構造函數通過 new 調用時this 指向新建的對象優(yōu)先級最高。四條規(guī)則的優(yōu)先級順序是new 顯式綁定 隱式綁定 默認綁定。箭頭函數是最大的例外它自己沒有 thisthis 是在定義時從外層作用域繼承的。這個特性非常容易被組合進面試題里const obj { name: obj, wait: function () { setTimeout(function () { console.log(this.name); // undefined普通函數有自己的 this }, 0); }, waitArrow: function () { setTimeout(() { console.log(this.name); // obj箭頭函數從 waitArrow 的詞法作用域拿到 this }, 0); }, }; obj.wait(); obj.waitArrow();為什么普通函數會輸出 undefined因為 setTimeout 內部對回調是直接調用this 落入默認綁定瀏覽器環(huán)境下指向 windowwindow.name 不是 obj。箭頭函數則是“我不管 setTimeout 怎么調我我的 this 在定義時就固定為外層 waitArrow 的 this”。React 類組件里事件回調丟失 this 的經典坑本質就是隱式綁定丟失解法也是箭頭函數或 bind。1.3 面試官追問模式閉包 this 的組合輸出題單獨的閉包題和單獨的 this 題都難不倒大家組合起來就容易翻車。比如我面試時經常給候選人出這樣的題目let count 0; const obj { count: 10, fn: function () { let count 100; const inner () { console.log(this.count, count); }; inner(); }, }; obj.fn(); // 輸出什么先看箭頭函數 inner它沒有自己的 thisthis 從定義它的外層函數 fn 那里繼承。fn 由 obj.fn() 調用是隱式綁定所以 fn 的 this 是 obj于是 this.count 是 10。再看 count 變量inner 自身沒有局部變量 count沿作用域鏈向上找先找到 fn 里的 let count 100所以輸出 100。結果就是 10 100。這道題一次性考了三個知識點箭頭函數 this 的詞法傳導、隱式綁定規(guī)則、作用域鏈查找順序。多數背答案的候選人會在這里卡住因為他們可能把 this 和變量查找混為一談誤以為 inner 里訪問 this.count 也應該先看 fn 內部。我的建議是準備面試時多做這種組合型的輸出題并且養(yǎng)成“先畫作用域鏈再畫 this 綁定最后再執(zhí)行”的習慣而不是憑直覺寫答案。另一道常見組合題是“構造函數里 setTimeout 里用 function 和箭頭函數補 this”本質上和圖里的邏輯一樣只是換了一層殼。2. 原型鏈、繼承與 ES6 class背熟和真正理解的差別2.1 原型鏈的本質與 instanceof 的實現(xiàn)原理JS 的對象繼承機制和 Java 的類繼承完全是兩碼事。每個普通函數都有 prototype 屬性這個屬性指向一個對象通過該函數 new 出來的實例會有一個內部原型指針指向這個 prototype 對象。這個指針在瀏覽器里可以通過proto訪問但更規(guī)范的說法是 Object.getPrototypeOf。所謂原型鏈就是從一個對象出發(fā)沿proto一路往上找的過程。比如數組 arrarr.proto是 Array.prototypeArray.prototype.proto是 Object.prototypeObject.prototype.proto是 null鏈條結束。instanceof 運算符的底層邏輯就是沿原型鏈找a instanceof B等價于“B.prototype 是否出現(xiàn)在 a 的整條原型鏈上”。我經常讓候選人手寫一個 instanceof目的是看他是否理解原型鏈function myInstanceof(left, right) { let proto Object.getPrototypeOf(left); while (proto) { if (proto right.prototype) return true; proto Object.getPrototypeOf(proto); } return false; }注意一個很容易鉆進去的彎數組實例直接測 instanceof Object 也會返回 true因為鏈條沒斷能一路摸到 Object.prototype。這恰恰說明 JS 里“一切皆對象”不是一句口號而是由原型鏈這個物理結構保證的。hasOwnProperty 和 in 是原型鏈上一組容易混的兄弟hasOwnProperty 只看自身屬性in 會連原型鏈上的屬性一起算。面試題經常問“for...in 遍歷對象如何只拿自身屬性”答案就是配合 hasOwnProperty 做過濾。Object.keys 則天生只返回自身可枚舉屬性不需要過濾。2.2 組合繼承、寄生組合繼承與 class 語法糖原型鏈繼承本身有個大坑就是引用類型屬性會被所有實例共享。經典例子function Parent() { this.list []; } function Child() {} Child.prototype new Parent(); const a new Child(); a.list.push(1); const b new Child(); console.log(b.list); // [1]被影響了這題考過無數次原因在于 Child.prototype 指向了一個 Parent 實例而 list 是掛在實例上的屬性被所有 Child 實例共享。解決方案是組合繼承function Parent(name) { this.name name; this.list []; } Parent.prototype.say function () { console.log(this.name); }; function Child(name, age) { Parent.call(this, name); this.age age; } Child.prototype new Parent(); Child.prototype.constructor Child;組合繼承的問題在于 Parent 被調用了兩次一次在 Parent.call(this)一次在 new Parent() 作為 Child.prototype。第一次把屬性放到了子實例上第二次把屬性放到了原型上。結果子實例同時擁有自己的屬性原型上還殘留一份共享的屬性副本雖然訪問沒問題但冗余了。現(xiàn)代面試題更喜歡問寄生組合繼承因為它的思路和 class extends 編譯出來的 ES5 結果非常接近function Child(name, age) { Parent.call(this, name); this.age age; } Child.prototype Object.create(Parent.prototype); Child.prototype.constructor Child;Object.create(Parent.prototype) 創(chuàng)建一個以父類原型為原型的新對象子類實例沿原型鏈既能找到 Parent.prototype 的方法又不會觸發(fā)父構造函數去生成冗余屬性。class 的 extends、super、static 關鍵字本質都是這套原型邏輯之上的語法糖而不是什么新機制。我在面試時一般不會問“你背一下寄生組合繼承的代碼”而是直接給一段 class 繼承代碼問它在 ES5 環(huán)境下大概被編譯成什么結構。能答出“子類原型通過 Object.create 關聯(lián)父類原型實例屬性通過 super() 里的函數調用完成”這句話就說明真的把原型鏈和繼承打通了。2.3 手寫 new 的過程一道很多人卡住的送分題手寫 new 是面試里被點單率極高的題因為它能同時考察 this、原型鏈和對象操作三類知識。new 一個構造函數發(fā)生的四件事分別是創(chuàng)建一個空對象把空對象內部原型指向構造函數的 prototype讓構造函數內部的 this 指向這個新對象并執(zhí)行構造函數根據構造函數返回值類型決定最終返回什么。編碼實現(xiàn)function myNew(fn, ...args) { const obj Object.create(fn.prototype); const result fn.apply(obj, args); return result (typeof result object || typeof result function) ? result : obj; }最后一步是關鍵。JavaScript 語言規(guī)范規(guī)定如果構造函數返回的是對象類型new 表達式會返回那個對象如果返回的是基本類型或沒有返回值則忽略它返回創(chuàng)建出來的 obj。這一條也直接解釋了為什么構造函數里如果主動 return 一個對象會導致 new 出來的實例不是你的預期對象。還有一種追問方式是“如果不寫 new直接用構造函數會怎樣”。比如function Person(name) { this.name name; } Person(張三); // 在嚴格模式下 this 是 undefined直接報錯不寫 new 時Person 就是普通函數調用this 落入默認綁定。嚴格模式下是 undefined試圖給 undefined 掛 name 屬性直接拋錯非嚴格模式下 this 指向 windowname 會被掛到 window 上。這種題在團隊代碼 review 場景里很常見所以答案要背得清清楚楚構造函數必須用 new 調用或者內部加 instanceof 判斷做保護。3. 異步編程事件循環(huán)、Promise 與 setTimeout 的那些坑3.1 宏任務與微任務的執(zhí)行順序現(xiàn)在幾乎每面必問事件循環(huán)。我怎么把這事講得讓新手也能記住一句話先同步再微任務最后宏任務整個隊列一輪一輪跑。JS 是單線程語言同一時刻主線程只能干一件事。遇到 setTimeout、DOM 事件回調這些異步任務時瀏覽器會先把它們交給對應的線程或隊列等到當前調用??樟嗽倩貋硖幚怼5惒饺蝿諆炔窟€要分類Promise.then、queueMicrotask 這類屬于微任務優(yōu)先級比 setTimeout、事件回調這類宏任務更高。執(zhí)行規(guī)則是每一次宏任務跑完后先把當前所有微任務隊列清空再取下一個宏任務。經典輸出題console.log(script start); setTimeout(() { console.log(setTimeout); }, 0); Promise.resolve() .then(() { console.log(promise 1); }) .then(() { console.log(promise 2); }); console.log(script end);輸出順序是 script start、script end、promise 1、promise 2、setTimeout。processconsole.log 是同步任務按順序執(zhí)行setTimeout 被放進了宏任務隊列Promise.then 進入了微任務隊列主線程同步代碼跑完調用棧清空瀏覽器開始清空微任務隊列promise 1 和 promise 2 依次輸出微任務清空后才從宏任務隊列里取出 setTimeout。還有一個小細節(jié)promise 2 的 then 是在 promise 1 的回調執(zhí)行中才注冊進去的但因為它還是微任務仍然排在宏任務前面。關于 async/await 也有個高頻誤區(qū)。請記住await 后面的代碼相當于被包進了 Promise.then 的回調里屬于微任務。所謂“await 會讓出線程”不是指去執(zhí)行宏任務而是指先把控制權還給事件循環(huán)讓微任務有機會先行。小技巧面試被問輸出順序時直接拿“同步代碼 → 整條微任務鏈 → 下一個宏任務”這個順序推演比死記例子穩(wěn)得多。我還建議自己動手跑幾個 Node 環(huán)境的輸出題注意 Node 的 process.nextTick 比 Promise.then 還優(yōu)先這是瀏覽器環(huán)境沒有的差異也是 Node 方向面試的潛在考點。3.2 Promise 鏈式調用與異常處理Promise 的本質是一個狀態(tài)機只有三種狀態(tài)pending、fulfilled、rejected。狀態(tài)一旦從 pending 轉換出去就不可逆這是設計上最重要的特性也是“為什么 Promise 只能被 resolve 一次”的答案。then 方法永遠返回一個新的 Promise這是鏈式調用的基礎。如果你在 then 里返回一個普通值它會作為下一個 then 的入參如果你返回一個 Promise下一個 then 會等待這個 Promise 落定后再取它的值。返回值穿透是很多新人的盲區(qū)Promise.resolve(a) .then() .then((v) console.log(v)); // a中間的 then 沒有傳回調值會被原樣透傳到下一個 then。這在小冊子題里出現(xiàn)過不止一次。異常處理是另一個高頻考點。常見的誤解是“加了 catch 就萬事大吉”其實要看你把 catch 放在哪里Promise.reject(err);注意一個沒有被捕獲的 rejected Promise 在某些環(huán)境下會直接報 UnhandledPromiseRejection。更隱蔽的是鏈式里的 catch 位置promise .then(fn1) .catch(fn2) .then(fn3);如果 fn1 拋錯fn2 能捕獲到并且捕獲后返回 undefined后續(xù)的 fn3 依然會執(zhí)行。如果 fn2 也拋錯那么 fn3 不會執(zhí)行。這跟 try/catch 的“捕獲后繼續(xù)往下走”直覺是一致的但很多人面試時會答錯。Promise 靜態(tài)方法里Promise.all 是“全部成功才算成功一個失敗立即失敗”Promise.race 是“第一個落定的結果獲勝不管成功失敗”Promise.allSettled 是“等所有都落定逐個返回狀態(tài)和值永遠不 reject”。實際開發(fā)中并行請求用 all超時控制用 race批量上報不關心成敗用 allSettled這個選擇能直接體現(xiàn)工程經驗。手寫 Promise.all 也是常見題核心邏輯實現(xiàn)一下function promiseAll(promises) { return new Promise((resolve, reject) { const result []; let count 0; promises.forEach((p, index) { Promise.resolve(p) .then((value) { result[index] value; count; if (count promises.length) resolve(result); }) .catch(reject); }); }); }注意兩點不能用數組 push 直接收集結果因為并發(fā)完成順序不確定必須按 index 占位空數組要直接 resolve否則永遠卡在 pending。3.3 setTimeout 返回值與異步陷阱setTimeout 這個 API 表面簡單但面試能挖出的坑一點都不少。第一個是返回值問題瀏覽器環(huán)境下setTimeout 返回一個正整數 ID從 1 開始遞增同一頁面中不會重復用于傳給 clearTimeout 取消定時器。所以熱搜里“setTimeout 返回值的范圍有 0 存在么”的答案是瀏覽器環(huán)境中 ID 從 1 開始取循環(huán)回繞前不會有 0一般情況下拿不到 0。Node.js 環(huán)境則不太一樣返回的是一個 Timeout 對象不是數字這也是區(qū)分瀏覽器和 Node 環(huán)境的一個細節(jié)點。第二個高頻坑是 setTimeout(0) 并不等于立即執(zhí)行。它的真實含義是“當前任務執(zhí)行完后再把這個回調推進任務隊列”只要當前調用棧里還有同步代碼它就得排隊。把 setTimeout 和前面的事件循環(huán)放在一起理解這就是“最少等 4ms”這個民間說法的來源——瀏覽器對嵌套層級過高的 setTimeout 還會做額外的時間鉗制。第三個坑是大延時問題。setTimeout 的延時參數最大臨界值大約是 2147483647ms差不多是 24.8 天。如果超過這個值定時器會立刻執(zhí)行相當于延時失效。我確實在業(yè)務中見過有人給一個自動刷新邏輯寫了 30 天的定時器結果 setTimeout 沒按預期工作排查了半天才想到是這個原因。第四個是 this 陷阱和回調陷阱這在業(yè)務代碼中經常踩。寫法類似const obj { name: obj, init() { setTimeout(function () { console.log(this.name); // undefined }, 100); }, }; obj.init();普通函數在 setTimeout 內部調用時this 指向全局對象或 undefined。解決方法和之前說的一樣用箭頭函數或提前 const self this。工程上我還有一個習慣需要在組件銷毀時清理的定時器務必把 id 存起來離開頁面時 clearTimeout。否則定時器回調里如果引用了 DOM 或組件狀態(tài)輕則內存泄漏重則報錯。高頻地創(chuàng)建 setTimeintervals 而不清理是我排查線上內存問題時見過最多的模式之一。4. 數據操作能力深淺拷貝、數組高階方法與字符串實用判斷4.1 深拷貝為什么 JSON.parse(JSON.stringify()) 只能拿來湊合如果面試官問深淺拷貝最常見的回答是“淺拷貝只拷貝第一層深拷貝全部層用 JSON.parse(JSON.stringify()) 就行了”。這個答案最多拿及格分因為 JSON 方案有一堆你未必意識到的坑。先看代碼const obj { name: test, age: 30, address: { city: beijing, }, fn: function () {}, date: new Date(), regex: /test/, symbol: Symbol(s), }; const jsonCopy JSON.parse(JSON.stringify(obj)); console.log(jsonCopy); // fn、symbol、regex 丟失date 變成字符串JSON.stringify 在遇到 undefined、函數、Symbol 時會把它們丟棄Date 會被轉成字符串正則會被轉成空對象NaN 和 Infinity 會變成 null。最致命的是循環(huán)引用一構造對象就拋 “Converting circular structure to JSON” 錯誤。面試官讓你手寫深拷貝時核心點在于實現(xiàn)“遞歸 處理多數據類型 解決循環(huán)引用”。一個能拿高分的版本function deepClone(target, map new WeakMap()) { if (target null || typeof target ! object) return target; if (map.has(target)) return map.get(target); const result Array.isArray(target) ? [] : {}; map.set(target, result); for (const key of Reflect.ownKeys(target)) { result[key] deepClone(target[key], map); } return result; }用 WeakMap 記錄拷貝過的源對象遇到同一個引用直接取回既解決了循環(huán)引用也保證了“兩個屬性指向同一個對象時拷貝后仍然指向同一個對象”的結構一致性?,F(xiàn)代瀏覽器也提供了原生 structuredClone API它支持 ArrayBuffer、Map、Set、Date 等類型也能處理循環(huán)引用。但面試時手寫是為了看你是否理解對象模型不要拿“我用 structuredClone”當萬能答案。順帶說說深淺拷貝的邊界使用場景不同。淺拷貝適合那些只有一層數據的配置對象展開運算符就夠了深拷貝適合復雜嵌套的響應式數據。但深拷貝有成本能淺則淺是我做性能優(yōu)化時的一個重要原則。4.2 數組高頻方法map、filter、find、reduce 及手寫實現(xiàn)數組方法是前端面試里性價比最高的一類題它能很直接地區(qū)分“會寫業(yè)務”和“理解數據處理”兩種候選人。mmp、filter、find、reduce 這四個是出鏡率最高的面試官一般先問區(qū)別再讓你手寫。map 和 forEach 的區(qū)別是第一道關卡。map 返回一個新數組forEach 返回 undefinedmap 適合做數據變形forEach 適合執(zhí)行副作用。很多人面試時還會把 forEach 當遍歷萬能工具其實當你想中途退出循環(huán)時forEach 是做不到的它沒有 break 機制。正確的做法是用 some 返回 true 來提前結束或者直接改 for 循環(huán)。reduce 是地基。手寫一個 reduce 能看懂你對數組協(xié)議、初始值、空數組邊界是否清楚Array.prototype.myReduce function (callback, initialValue) { const arr this; let acc initialValue; let startIndex 0; if (initialValue undefined) { if (arr.length 0) { throw new TypeError(Reduce of empty array with no initial value); } acc arr[0]; startIndex 1; } for (let i startIndex; i arr.length; i) { acc callback(acc, arr[i], i, arr); } return acc; };注意兩個考察點第一不傳初始值時reduce 會把數組第一個元素作為初始值并從下標 1 開始遍歷第二數組為空且不傳初始值時reduce 會直接拋 TypeError這也是模型里規(guī)定的行為。實際面試題里reduce 常見的應用有數組求和、統(tǒng)計次數、扁平化嵌套數組、按某字段分組、map 和 filter 組合實現(xiàn)等。我建議你熟練到可以閉眼寫出來這些場景因為很多公司面試不只問一遍 reduce面試官會順著你寫的代碼繼續(xù)追問“如果數組有空洞呢”。JS 的數組方法對稀疏數組的處理各有不同map 會保留空洞forEach 會跳過空洞reduce 同樣跳過。能把這個差異講清楚屬于加分項。4.3 字符串處理包含判斷、忽略大小寫、URL 驗證熱搜詞里“js 判斷字符串是否包含”和“js 忽略大小寫”出現(xiàn)頻率非常高說明即使是基礎 API在實際業(yè)務里也存在大量使用誤區(qū)。判斷包含最常用的四個方法indexOf、includes、startsWith、endsWith。用表格看得更清楚方法判斷語義返回值大小寫敏感indexOf(a)查找子串位置找到返回下標否則 -1是includes(a)是否包含子串booleantrue / false是startsWith(a)是否以子串開頭boolean是endsWith(a)是否以子串結尾boolean是很多新人還用 indexOf ! -1 判斷包含其實 includes 就是更語義化的替代還不會出現(xiàn)“indexOf 找不到時返回 -1但 -1 也是 falsy 之外的數導致條件判斷出錯”的混淆。忽略大小寫判斷的核心原則是“統(tǒng)一比對標準”。最簡單可靠的做法是比對前把兩個字符串都轉成大寫或小寫function includesIgnoreCase(str, search) { return str.toUpperCase().includes(search.toUpperCase()); }不建議用 toLowerCase 還是 toUpperCase 糾結只要兩邊一致就行。如果想做更精細的規(guī)則比如只忽略 ASCII 大小寫而保留非英文字符差異可以用正則加 /i 標志/hello/i.test(str)。但正則方案要小心特殊字符轉義日常場景統(tǒng)一大小寫是更穩(wěn)妥的選擇。URL 驗證是另一個高頻需求。最省事的方案是用 URL 構造函數function isValidUrl(url) { try { new URL(url); return true; } catch { return false; } }new URL 能在解析失敗時拋錯所以用 try/catch 包一層就能完成基本校驗。但要注意它比較寬松像http://這樣有協(xié)議頭但不完整的地址也能通過解析。正則方案更可控比如常見的return /^https?:\/\/([\w-]\.)[\w-]/i.test(url)。實際業(yè)務中我一般按需求拆只想判斷“是不是合法 URL”用 URL 構造函數想要“必須是 http/https 且?guī)в蛎庇谜齽t。5. 高頻業(yè)務場景事件委托、防抖節(jié)流實戰(zhàn)細節(jié)5.1 事件委托從冒泡聊到動態(tài)列表性能優(yōu)化事件機制在 JS 里分兩個方向理解傳播三階段和綁定方式。標準規(guī)定事件傳播分捕獲、目標、冒泡三個過程捕獲是從 window 往下走到目標元素冒泡是從目標元素往上走回到 window。addEventListener 的第三個參數設為 true 就會讓回調在捕獲階段觸發(fā)設為 false 則在冒泡階段觸發(fā)默認是 false。事件委托利用的就是冒泡機制與其給子元素逐個綁定事件不如把事件綁定在它們的共同父元素上讓事件通過冒泡到達父元素再統(tǒng)一處理。典型場景是動態(tài)列表const list document.getElementById(list); list.addEventListener(click, (e) { const target e.target.closest(li); if (!target) return; console.log(target.dataset.id); });e.target 是真正點擊的元素e.currentTarget 是綁定事件的元素也就是父容器。很多人把兩者混用導致事件委托里判斷失效。還有一個高頻細節(jié)children 節(jié)點是動態(tài)渲染的如果給每個子節(jié)點都綁定事件每次增刪都要重新綁定用委托就只要綁定父節(jié)點一次新節(jié)點自動繼承事件性能和代碼維護成本都更優(yōu)。也別忘了 JS 里有些事件根本不冒泡。scroll、resize、mouseenter、blur 這類事件無法通過委托方式統(tǒng)一處理。如果遇到用 mouseover 替代 mouseenter 的舊代碼還要額外處理“子元素進出導致誤觸發(fā)”的問題。這個點我在業(yè)務 review 時經常強調。順便說一句React 17 之前的事件系統(tǒng)是在根容器上統(tǒng)一委托的17 之后改為向原生事件對齊委托點從 document 換到了 root 容器。面試如果聊到 React 事件機制能補上這段演變會很明顯體現(xiàn)出你讀過源碼或者至少跟蹤過技術動態(tài)。5.2 防抖與節(jié)流原理、場景、手寫與區(qū)別防抖和節(jié)流是面試手寫題里命中率最高的兩道之一而且經常放在一起問因為兩者都涉及高頻觸發(fā)場景的頻控。先用一個生活中的類比區(qū)分防抖像電梯關門。有人進來電梯門就重新打開直到最后一個人進來后等了一會兒再關。節(jié)流像水龍頭滴水。不管水流多大滴水頻率固定每過一段時間必然會滴下一滴。防抖是“高頻觸發(fā)中只執(zhí)行最后一次”。典型的場景是搜索框輸入用戶連續(xù)打字時不需要每敲一個字就請求一次接口而是在用戶停下來后的 300ms 內再發(fā)請求。實現(xiàn)如下function debounce(fn, wait, immediate) { let timer null; return function (...args) { const callNow immediate !timer; clearTimeout(timer); timer setTimeout(() { timer null; if (!immediate) fn.apply(this, args); }, wait); if (callNow) fn.apply(this, args); }; }immediate 參數控制“首次觸發(fā)是否立即執(zhí)行”。如果你在做提交按鈕防重復點擊immediate 為 true 更合適第一次點擊立即執(zhí)行后續(xù)點擊被攔截直到 wait 過后才恢復。節(jié)流是“固定時間間隔內只執(zhí)行一次”保證最小執(zhí)行頻率。常見場景是滾動加載、拖拽、縮放。實現(xiàn)也有兩種模式// 時間戳版 function throttle(fn, delay) { let last 0; return function (...args) { const now Date.now(); if (now - last delay) { last now; fn.apply(this, args); } }; }時間戳版保證首次執(zhí)行能立即生效但最后一次觸發(fā)可能被“吃掉”定時器版則會在最后一次補執(zhí)行兩者各有取舍。業(yè)務中做滾動加載一般用時間戳版做動畫末尾收尾則定時器版更好。兩個版本都建議親手寫一遍因為面試官很可能會追問“節(jié)流結束前最后一次觸發(fā)你們怎么處理”。手寫防抖節(jié)流時最容易翻車的地方有兩個一是忘記在內部函數里用 fn.apply(this, args) 保證上下文否則外部通過對象調用時會丟失 this二是事件對象 e 的透傳如果不把參數轉發(fā)給 fn拿不到 event 對象做 stopPropagation 之類操作。這兩點我在代碼 review 里幾乎每次都能看到。5.3 ES Module 與 CommonJS模塊化的核心差異模塊化雖然不在上面 12 個點清單里卻是任何現(xiàn)代前端項目都繞不開的面試題。ES Module 和 CommonJS 的差異本質上體現(xiàn)了兩種設計哲學靜態(tài) vs 動態(tài)。ES Module 的 import/export 是靜態(tài)的寫在代碼頂層在解析階段就能確定依賴關系所以工具可以在打包時做 tree shaking刪除沒被引用的導出。CommonJS 的 require 是動態(tài)的可以在 if 條件里寫 require也可以把 require 寫在函數內部因為它是運行時執(zhí)行的函數調用。這就是“為什么 import 不能寫在條件塊里而 require 可以”的原因。依賴循環(huán)的問題也有體現(xiàn)。CommonJS 遇到循環(huán)依賴時某個模塊可能拿到另一個模塊未執(zhí)行完的部分導出ES Module 則通過“活綁定”的方式在模塊間保持引用有效性最終執(zhí)行時拿到的值可能已更新。這個差異在前端筆試題里反復被考到給一個循環(huán)依賴代碼執(zhí)行并輸出運行時結果。想保證答對關鍵是要能畫出模塊的執(zhí)行順序先執(zhí)行誰、打印誰、exports 里此刻有誰。Tree shaking 還有一個日常相關的體現(xiàn)從組件庫里按需引入。像 antd 這類大型組件庫用import { Button } from antd配合打包器的 tree shaking只打包用到的部分如果項目用了 CommonJS 格式的第三方庫tree shaking 往往失效。這也是為什么現(xiàn)在新庫都優(yōu)先輸出 ESM 產物。面試官如果追問“那 Node.js 現(xiàn)在支持 ESM 嗎”答案是支持但 package.json 的 type 字段和 .mjs / .cjs 后綴決定了解析方式Node 環(huán)境下兩者可以共存。能把“為什么需要 babel 和打包器”到“Node 原生如何處理這兩種規(guī)范”串起來講一遍就是一道很完整的模塊化大通關。6. 加分題新語法邊界、內存管理與工程細節(jié)6.1 可選鏈、空值合并、解構與展開的實戰(zhàn)邊界ES6 新語法也是面試常青樹但考的是使用邊界不是你見過哪些 API。這幾個最容易踩坑的點值得單獨拿出來說。可選鏈操作符 ?. 很香但用多了會產生“防御性編程副作用”。比如user?.address?.city一旦 user 為 null 就不會拋錯直接返回 undefined。問題在于本該暴露的 bug 也被吞掉了。比如調用一個對象的方法合理預期對象一定存在如果它不存在應該立刻報錯而不是讓后面所有邏輯靜默失效。我在團隊里定的規(guī)則是外部不可控數據接口返回值、localStorage 解析結果可以用 ?.內部業(yè)務代碼里不要濫用??罩岛喜⑦\算符 ?? 和 || 的區(qū)別是面試官非常愛挖的點。||對 falsy 值生效也就是遇到 0、、NaN、false 都取右邊??只對 null 和 undefined 生效。比如const a 0; console.log(a || 10); // 10 console.log(a ?? 10); // 0業(yè)務中如果你有一個“count 為 0 時也要展示 0”的需求用||做兜底就會把 0 替換成默認值這就是 bug 源。寫出“dont use || when you mean ??”這個意識比記住語法更重要。解構賦值默認值有隱藏陷阱默認值只在屬性值是 undefined 時生效null 不會被默認值覆蓋const { name 默認 } { name: null }; console.log(name); // null不是 默認展開運算符的邊界是“它只淺拷貝一層”。{ ...obj }復制完第一層后嵌套對象依然是同一引用。這正好呼應深淺拷貝那節(jié)deep clone 的需求永遠不能被展開運算符替代。很多新人寫完const newObj { ...oldObj }就以為 newObj 完全獨立了結果修改 newObj.a.b 時把 oldObj.a.b 也改了。6.2 垃圾回收與內存泄漏低頻但能拉開差距的題這一組題出現(xiàn)頻率不高但一旦出現(xiàn)面試官往往想通過它篩掉多數人。JS 引擎的垃圾回收主流算法是標記清除從根對象出發(fā)遍歷所有可達對象打上標記剩下的沒標記的就是垃圾統(tǒng)一回收。老一代瀏覽器里的引用計數算法已經被淘汰因為沒法解決循環(huán)引用。面試常見的四個內存泄漏場景每個都很具體第一個是隱式全局變量。在函數內給未聲明變量賦值它會變成全局變量永遠留在 window 上。嚴格模式能防住這個。第二個是定時器未清理。setInterval 的回調里如果引用了大量數據又沒在生命周期銷毀時 clearInterval數據會一直駐留。第三個是事件監(jiān)聽器泄漏。SPA 頁面頻繁銷毀和掛載組件如果組件銷毀時沒有 removeEventListener舊組件就通過事件回調被長期持有。第四個是分離的 DOM 節(jié)點。你移除了一個 DOM 節(jié)點但 JS 變量還持有它的引用節(jié)點就無法被回收。怎么規(guī)避記憶一個簡單原則誰創(chuàng)建、誰回收。在 useEffect 里設置的定時器和綁定的監(jiān)聽器都在清理函數里取消解綁。閉包里的臨時數據只要不再被引用就能釋放問題往往出在“引用沒斷”而不是“閉包本身有毒”。WeakMap 和 WeakSet 的存在本來就是為了解決內存回收問題WeakMap 的 key 是弱引用不阻止垃圾回收。做對象級的存取時比如給 DOM 元素掛緩存數據用 WeakMap 能避免緩存數據跟著元素一起殘留。最后提一個和性能相關的延伸場景前端用 Web Worker 做大文件上傳其實就是把耗時任務放到獨立線程避免主線程阻塞。這個方向在面試中經常被作為“異步優(yōu)化”的進階題背后邏輯還是事件循環(huán)和內存管理那套體系主線程空閑才能保證 UI 流暢復雜的計算任務外包給 Worker數據交換通過 postMessage 完成。把這套思路講清楚比背十個 API 更能證明你的工程基礎扎實。真到面試的時候我自己的習慣是每題先想“這次面試官真正想問的是什么”再組織回答。閉包問的是引用關系this 問的是調用點Promise 問的是任務隊列原型鏈問的是對象模型。把這幾個底層模型在腦子里串成一張網比硬背一百道題都有用。這也是我平時帶新人時最常強調的一點——碰到不會的題別慌先把它往已懂的原理上靠從根上推理八九不離十。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五十路熟女人妻一区二区三区四区五| 伊人991| 亚洲激情在线| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 亚洲精品人妻在线| 久久永久无码人妻视频| 老鸭窝在线视频播放| 九九英色视频| 五月天丁香欧洲日韩| 欧美性生活免费网| 中日韩免费看男女操逼大全| 91M一社| 日韩精品99久久久久久中文字幕 | 午夜舔阴达高潮视频免费看| 国产老太乱伦一区| 有码专区最新中文字幕有码| 使劲用力艹少妇视频一区二区| 婷婷91| 91福利网在线观看| 99婷婷一区二区| 床上啊啊啊一区二区三区| 操比国产| 一二区在线观看视频| 精品人体无圣光凹凸| A啊啊在线观看| 亚洲国产尤物yw在线观看| 欧美日韩人妻婷婷一区| 啊啊啊啊啊啊啊啊啊在线观看| 国产馆极品诱惑| **一级毛片国产| 国产吹潮女在线观看| 五月开心久久AV官网| 超碰人人超在线观看| 97在线精品观看视频| 精品国产乱码久久| 亚洲动态色图| 粉嫩av平台| 91伊人| 久久久亚洲熟妇资源| 日本高清熟女久久一区| 久久天堂网| 五十路熟女,国产欧美精品区一区二区三区| 欧美一二三| 国产女人高潮视频| A 在线网址| 亚洲精品97p| 日韩无码AB| 九一屌逼| 日韩欧美成人午夜福利| 国产av又色又爽又黄| 国产女人与拘做受视频免费| 天天操天天干一区二区| 色官网在线| 久久产精品一区二区三区电影| 思思热免费视频观看| 91观看 国产白丝| 东北女人av| 亚洲免费成人在线高清无码视频 | 狠狠干综合| 97碰碰色| 尤物网址| 91综合色噜噜| TS人妖另类精品视频系列| 人人摸人人入| 操逼操网| 花野真衣| 97国产|免费| 亚洲全色网| 亚洲本色精品一区二区久久| 久久一区二区高清免费| 好淫网一二三视区| 欧美青青草视频| 女人香蕉久久毛毛片精品| 欧美丝袜中文字幕07在线| 亚洲少妇在线观看| 91丨九色丨国产打屁股| 欧美韩国你懂得在线 | 亚洲色图加勒比| 国外91| 亚洲在饯| 91成人在线免费视频| 久久人妻精品| 欧美日韩亚洲电影| 日韩欧美大力操| 爱做久久久久久| 色妹子A V| 男人的天堂久久狠| 色婷婷六月丁香七月婷婷| 婷婷视频在线免费观看| 国产视频一区二区三区久久亚洲天堂 | 日韩资源网| 啊啊啊爽爽| 国产毛片在线| 欧美精品在线观看| 91色宗合| 午夜大香蕉| silk lablo在线观看一区二区| 欧亚成人在线视频| 麻豆 欧美 日韩| 99操碰| 国产区在线| 精品999999| 99re在线视频国产| 色网在线视频观看免费| 中文字幕丝袜人妻| 中文字幕蜜乳av| 精品少妇一区二区三区在线视频| 曰本91情色| 天天视频黄| 99热这里只有精| 免费毛片在线播放| 秋霞欧美性爰视频| 婷婷丁香五月激情啪啪| 欧美第一页性| 久久尹人大香焦视| 嗯啊抽插大香蕉网页| 丝袜狠狠草尤物人妻av91| 国产精品午夜精品| aaa一级黄片| 97操97干| 色婷婷电影网| 女优大全 - 91n| 亚洲激情网一二三四区| 草草草视频| 国产欧美亚洲精品a第2页| 久久精9| 无码人妻一区二区三区色欲aⅴ| 伊色综合天堂色97| 欧美偷拍区| xxx亚洲午夜天堂| 国产美女在线精品免费看| 久久少妇| 大香蕉在线视频15| 免费?级毛片无码?∨蜜芽试看| 夜夜嗨AV蜜臀av| 亚洲爽图| 我爱搞逼综合网| 免费观看啪视频| 91高清欧美| 色色国产| 国产主播福利| 免费97视频| 色小视频蜜乳| 69一区二区| 亚洲aw毛茸茸在线 | 久久国产精品一级二级三级| 伊人网综合在线视频| 亚洲se电影| www.狠狠| 蜜桃无码AV一区二区| 欧美色图99| 久久精品亚洲东京热色播| 黄色香蕉视频网站一区| 91 国产丝袜在线播放-百度| 天天天天干| 97超碰磁| 综合色久欲| 夂久色| 亚洲色香| 久久五月份| 一区二区免费电影久久| 九九九只有精品| 青青草在线成人视频| 大香蕉黄色一级片免费看| …中文字幕亚洲乱,97人妻无码费视…| 日韩av乱伦| 国产在线视频午夜精华在| 肉丝无码中文高清| 精品久久大胆人体| 玖玖视频在线资源一区二区三区| 不卡av在线中文字幕| 人妻蜜桃臀| 东北女人的毛片| 六月婷婷色综合| 精品成人无码| 中文字幕在线2| 国产午夜精品一区二区三区牛牛| 国内毛片婷婷六月色| 婷婷三区| 色综合91好| hd成人一区二区在线| 国产一线二线三线av| 操91| 国产92麻豆天美精品色欲5| 97干97色| 伊人大香蕉在线| 青青久久手机线视频| 亚洲另类春色| 久久精品久久久久久久| 亚洲麻豆18发?| 狠狠操一区二区| 99热这里| 亚洲色图久久成人| 久久99热这里只频精品6学生| 无码国产Av| 亚洲美女av无码| 老鸭窝成人免费毛片视频| 久久日本熟女精品一区| 男人的天堂成人的社区| 青青国产精品在线| 殴美牲| 99色色| 色婷婷综合网| 一区二区激情国产熟女| 亚洲欧美国产日本一区二区三区| 秋霞视频一区二区| 男人的天堂不卡一区二区| 欧美日韩性爱视屏免费看了| 亚洲欧美一区二区三区一猛片| 亚洲色欲天天天堂色欲网女| 91av一区二区在线观看| 啪啪资源网| 久久毛卡| 久久激情视频| av在线人气| 日本女厕偷拍| 丁香婷婷激情五月天无毒不卡| 亚洲日本男人天堂网 | 毛片久久| 久久91精品国产9丨久久分亭| 亚洲囯产精品女人久久久| 日韩特一级久久| 亚洲激情综合另类男同| 91激情国产| 国产欧美美女免费观看视频| 久久精品国产精品亚洲艾通辽熟妇 | 3PAV乱伦视频| 五十路六十路七十路熟婆| 无码不卡亚洲成?人片| 91色人妻| 久操热线| 婷婷丁香一区二区三区| 人妻大香蕉| 天天天干977| 78久久| 亚洲日韩人妻中文字幕一区| 九九无码视频| 久久久亚洲精品电影免费看| 亚洲图片 激情小说| x97av| 91美女小视频| 黄片色区软件| 久久天天摸| 九九亚洲精品| 久久久久九九九| 免费黄色片。| 国产精品一二三区福利| 污污污8888| 激情内射| 最新av网站在线观看| 女人喷水视频在线观看| 久久熟妇五十路一区| 91国精产品| 91夜色| 青娱乐国产精品| 中文字幕av色| 91美女视频直播| 被窝影院午夜看片无码| 国产乱伦性爱AV| 精久久久91| 久久久久99999| 精品国产91av一区二区三区| 亚洲黑丝在线| 久久久久久人| 精品国产一区二区三区四区在线看 | 伊人97色天使| 亚洲动态色图| 天天干天天爽| 91精品操美女| 无码天天操| 精品少妇后入一区二区三区四区人妻巨乳| 亚洲欧美激情小说| 欧美性爱中文字幕无线码| 色综合98| 97资源亚洲| 色色色天美视频| 伊人丝袜美腿高跟在线观看高清| 色欧洲| 久久精品99| 黄色片G G G| 人人人干干人人干| 五月天丁香欧洲日韩| 国产激情在线| 色婷久久| 人人妻人人爽一区二区三区| 91|九色|国产熟女| 色欧美在线| 久久久久久精品免费看A级| 美女的肌被草喷水视频| 草草电影院| 日韩AV电影网站| 亚洲欧美综合图片| 爽爽淫人网| 欧美亚洲特P| 国产久久久久久久久一区二区| 亚码人妻| 欧美,日韩,亚洲视频| 亚洲欧洲久久天堂| 乱伦图av| 伊人欧美大香蕉视频| 黄片www.| 久久 精品| 国产天天骚| 97在线免费观看视频| 97资源制服丝袜| 亚洲欧美首页| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 91蜜桃婷婷狠狠久久综合9色| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 天天干18禁| 97天天爽| 亚洲图片日本AⅤ欧美在线| 精品乱子一区二区三区99| 国产亚洲99久久精品熟| 99黄页网站| 日本在线播放不卡一区| 亚洲天堂男人网| 天天淫人人妻日日色| 亚洲不卡三级手机播放| 91美女看B| 另类一区| 欧美色999| 久插综合| 国产按摩一区二区三区| 伊人专区一区二区三区| 操逼操操操91| 亚洲天堂日本| 一直超碰| 天天色播亚洲综合网站| 综合亚洲网| 91大胆欧美| 无码 黑人一区二区三区| Aa东京男人的天堂| 欧美一区91大爱| 午夜.DJ高清在线观看免费7| 超碰在线在公开超碰在线在公开| 婷婷国产精品九区| 九月丁香综合网| 97超碰欧美手机| 鸥美插入视频| 精品一区二区三区蜜桃臀赵总 | 亚洲美女色图| 99热超碰| 色久桃花影院在线观看| 国产9区| 热久久无毒不卡| 91精品电影18| 欧美中出1| 影音先锋每日最新资源在线观看 | 日本成人电影资源网| 超碰97COm中文| 欧美夜色| 啊啊啊啊啊在线观看网址 | 综合网久久| 狠狠干狠狠色| 日本人人操人人操| 亚洲好看强奸乱伦| 欧美片第一页| 亚洲色图欧洲| 日韩欧美三级| 亚洲欧美91√| 久污| 亚洲精品国产熟女久久久| 91+欧美| 欧美1727免费观看视频| 国产高清无码一区二区三区四区皇冠| 岛国激情视频在线观看| 亚欧性爱无码| 国产精品永久免费10000| 日韩无码一级黄色av片| 91网站18| 啊啊啊啊啊啊好多水| 熟女高潮精品一区二区| 久久成人精品| 成人日本片久久久蜜桃| 成人日本片久久久蜜桃| 春色综合免费| 亚洲欧美天| 亚洲素人综合| 67914在线兔费成人视频| 亚洲男人的天堂网| 亚洲丰满很很操| 校园春色宗合网| 91久久国产综合精品| 97er欧美性| 欧美色日| 无码粉嫩白虎一线天b区| 妇女乱色二区| 激情综合 婷婷五月 红杏| 国产夫妻性生活视频| 亚洲精品人伦一区二区| 色色青青久久| 国产丝袜啪啪| 精品国产Av无码久久久伦古装| 草草草视频| 欧美中文字幕精品人妻| 999久久久免费精品国产牛牛| 人妻9117c| 福利社区午夜一区二区| 国产精品激情久久久久久久| 最新日韩黄片| 日韩免费人妻色情网站| 亚洲色图欧洲| 亚洲无992tv| 自拍偷拍草一草| 日韩无码黄色片| 在线精品福利免费播放| 亚洲天堂性爱| 国产青青美女玩逼视频| 亚洲色图8| 久久久久夜夜夜夜| 久思思热视频在线观看| 亚洲欧美国产日本一区二区三区| 少妇 综合| 日韩av色图综合| 国偷自 一区二区| 欧美激情 亚洲色图| 可免费观看的av毛片中日美韩| 天天视频网站黄| 亚洲AV成人无码久久精品播放| 日本污ww视频网站| 神马午夜久久久| 午夜操操操| 国产精品黑人一区二区三区| 日人妻视频91| 97激情97激情| 日韩内| 国产精品 久久久精品一牛| 99re久久| 国产东北女人在线视频| 久久午夜伦| 色综合20p| 91bbb| 女人喷水视频在线观看| 宗合情欲网| 麻豆色99999| 激情抓乳插进去啪啪啪日韩| 黑操B| 九久久精品| 操屄日韩| 欧日韩不卡视.频| 久久精品91| 色在线综合| 精品久久視頻在线| 免费视频观看60秒| 国产精品无码论坛| 无码操逼天堂| 最新三级网址| 欧美色图 人妻| 操逼操2| 激情五月综合网| 很狠操| 园内精品自拍视频在线播放| 国产高清1234区| 久久精品国产亚洲粉嫩| 激情四射五月天| 91女优在线观看| 国产日逼视频| 国精综合一二三区影视| heyZO天然素人无码AⅤ专区| 五月天色图| 免费精品无码一级毛片牛牛影视| 92福利社视频| 精品在线蜜臀| 九九久久久久久爱| 亚洲影院365| 久久9亚洲| 国产又粗又大硬免费色网视频| 美女诱惑爱爱| 国内亚洲高清无码| 懂色AV中文| 天堂亚洲精品| 国产成人亚洲精品自产在线| 99re视频这里只有精品| 另类综合另类| 国内毛片热久久思思热| 操香逼| 91丨九色丨国产丨人妻在线 | 91五十路| 99re这里只有精品3| 极品白嫩美少妇在地板上位骑射淫水泛滥| 男人的天堂2019AV| 免费成人在线观看91| 欧美无圣光在线| 人妻啪| 日本超碰色精品| 国语av最新自产拍在线观看| 夜夜精品视频一区二区| 日韩人妻少妇 一区二区三区| 国产91美女视频| 欧美日日网| 日韩丨制服丨中文|在线| 欧美色三级片91| 亚洲欧美情色| 久久精品老司| 丰满高潮18xxxx| 啊啊啊啊嗯嗯在线久久久| 欧美激情五月天| 在线日韩精品一区二区三区| 国产高清不卡视频| 亚洲性爱无码乱伦av| 国产精品成人午夜福利| 香蕉久久精品| 可以免费观看的av| 老子午夜伦不卡影院| 激情五月天校园春色网| 性爱综合网| 日韩欧美午夜一区二区| 青青草色AV| 国产怡红院| 久久久国产亚洲精品系列| 亚洲人妻色图| 欧美大香蕉97| 桃色五月天| 人妻一区二区三区视频| 欧美自拍网| 国产性刺激| 玖玖爱免费观看视频| 国产熟妇 码视频户外直播| 热的中文 热的有码 热的国产| 激情五月综合网| 夜夜操青青草| 国产强奸乱伦欧美| 人人妻人人澡人人爽久久av| 国产女人9999| yiren97| 久热无码| 天天看,天天做| 欧美不卡在线一区二区| 九九久久玖玖| 国产sv美女内射| 热热色色综合| 精品国产国产AV| 2010男人的天堂| 日本日皮视频逼| 国产精品爽爽v| 一区二区乱码福利| 97资源久久| 91亚洲黄色网| 大香蕉手机在线| 国产一区二区久久| 91久久18禁| 国产区在线| 五十路人妻在线| 在线观看A啊啊啊| 插入综合网| 中文字幕黑人大片| 成人婷婷丁香| 色婷婷av在线观看| 这里有精品| 久热久| 免费一级毛片在线视频观看| 色综合久久88色综合久久天天| 91在线|亚| 久久精品无码不卡| 国产91丝袜在线播放蜜月| 91性高| 久久、1234| 9 7超碰在线免费观看| 91扒丝袜综合在线| 97超碰无码网| 激情露脸爱| 少妇人妻精品| 丰满人妻一区二区中文| 欧美体内射精| 91亚洲黄色网| 国产精品96| 91人妻少妇| 亚洲国产成人精品久久久国产成人一区二区 | 5252色欧美在线| 亚洲丝袜天堂| 伊人aaa| 久久视频,这里只有精品| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 日韩BBN| 97在线免费公开视频| 亚洲精品九九九九九九| 91久久婷婷| 秋霞网无码| 国产亚洲深夜激情| 人人看人人摸人人色| 人人操AV| 欧美激情超碰777| 91天天爱| 99少妇内射| 亚洲欧美国产va在线播放频| 亚欧免费| 五月婷婷六月丁香| 四虎国产成人精品免费一女五男| 色综合久久夜色精品国产天堂| 欧亚韩国999| 丰满人妻一区二区三区| 奇米四色影视777久久久| 日韩激情啪啪| 91在线免费观看处女| 五十路人妻在线| 91综合网在线| 特级毛片特黄久久免费看| 天天做天天爱| 蜜桃久久精品一区二区三区| 欧美激情高清性猛交| 中国农村熟妇毛片视频| 久久香蕉影院| 久久久久78| 久久香蕉国产线看观看亚洲女人 | 唯美清纯 妖精视频| 激情熟女12P| 操人91| 使劲用力艹少妇视频一区二区| 桑老女人九区| 国产精品极品美女视频| www老逼91| 婷婷精品久久av影视| 五月丁香六月综合缴清无码| 蜜桃臀av在线观看| 成人网站 免费观看| 日韩不卡av一二三| 日韩78m视频| 极品白嫩美少妇在地板上位骑射淫水泛滥| 国产白嫩漂亮KTV在线| 中文字幕第页| 骚货操死你| 啪啪AV导航| 中美日韩毛片| 欧美一区二区三区不卡高清视频| 高清无码国产亚洲| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 日韩亚洲美女一区久久| 四虎影视国产精品| 黄片aaaaa一区| 加勒比AV网| 试看日韩黄片| wwwxxx日本爽| 大香蕉伊在线久草麻豆天堂故事| 97超碰中文字幕| WWW操逼| 国产在线76页| 好涩综合| 久久xx| 亚洲综合嫩| 大地资源在线观看中文第二页| 免费AV中文网在线观看| 黄页大片在线观看| 亚洲欧美另类图片| 亚洲中文字幕噜噜噜久久久| 蜜臀久久99精品久久久久久酒店| 97最新在线播放视频| 亚洲天天精品| 中日高清无码操逼视频| 亚洲色图8| 国产精品三级视频网站| 中文字幕第二页| 日韩免费性爱视频在线观看| 欧美96交| www.久久| 日韩在线国产字幕| 亚洲男人的天堂V| 日本成人免费一区二区三区| 日日橹狠狠爱欧美超碰| 国产精品嫩草久久久久| 亚洲九九爱| 国产视频一区二区免费| 激情小说激情视频| 色妹子A V| 亚洲精品乱码线路中文字幕| 97超碰精品成| 国产精品亚洲一区二区三区四区| 啊啊啊啊好疼| 亚洲熟女国产综合另类| 性爱乱伦视频免费| 九九热午夜欧亚国产视频| 在线v中文字幕一区二区三区| 色欧美色交综合| 日日夜夜干| 欧美一区二区一级岛国大片| 久草男人天堂| www.久久99| 久久久久亚洲熟妇熟女| 超碰伊人在线| 嗯啊不要啊在线 | 成人AV在线网站| 98一区二区精品| 在线观看不卡一区二区三区| 91无摭挡| 亚洲国产精品无码AV久久| 日本大香蕉| 久操不卡视频| 日韩偷拍一区二区三区| 国产乱不卡| 91女网站| 国产女人成人精品视频| 欧美夜夜草视频| 中文无线日韩一区| 爱干爱射网啊啊啊| **一级毛片国产| 日本成人免费一区二区三区| 亚洲性综合11| 久久 亚洲 日韩 人妻| 久99热| 国产毛片在线| 中文字幕欧美丝袜07资源| 午夜后入| 用力操死我| 一区二区三区精品视频| 人妻干天天| 亚洲 在线| 亚洲熟妇综合久久久久久| 天美国产精品| 99热在线观看| 操逼操网| 操逼视频色| 九九综合九九综合| 国产激情在线| 嗯~啊~快点 死我视频免费看网站| 97精品国产97久久久久久户外免费| 91小视频| 欧美精品99久久久**| 国产91影院| 色九久| 97资源站国产精品| 国产精品久久久久久夜夜夜夜| 男人天堂.AB| 情色AV电影| 久热91| 操屄不卡视频| 人人摸人人摸人人干| 亚洲日韩视频二区| 很很操在线| 黄色无码高清黄色无码网站| 91亚洲欧美激情| 国产国产亚洲一二三久久| 另类专区加勒比| 在线情色电影 91大 | 色妇91| 夜夜操一区二区| 77国产精品| 婷婷精品国产一区二区三区日韩| 91色黑人少妇| 伊人丝袜美腿高跟在线观看高清| 超碰爽人妻熟女Av| 欧洲Au麻豆| 99re不伦| 久久m| 亚洲日韩乱码中文无码蜜桃臀网站| 久久蜜色情在线视频xxx免费观看| 人妻精品综合中文字幕在线 | 超碰97首页| 久久精品99久久久久久| 久久久久久裸体| 国产97综合| 校园春色 亚洲| 激情在线青青操| 国产又黄又爽| 中文字幕人成乱码熟女香港| 日本成人A片免费看| 国产精品久久久久久久黄无码| www.99中文字幕| 入口操逼网站| 香蕉在线一区二区三区| 欧美激情亚洲色图| 97网址97| 极品色综合| av在线浏览| 伊人网在线观看| 91黑丝操| 欧美激情区| 永久免费av无码网站国产app| 女同女同恋久久级三级| 一区二区三区欧美激情| 天天操狠狠日夜夜干超碰撸com视频在线观看| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 国产高清自拍视频| 奇米四色影视777久久久| 91精品国产高清久久久久久,亚洲成人| 午夜一区| 操香逼| 人人妻天天做天天爽| 2017天天插| 国产精品4p在线观看| 午夜精品探花| www.四虎在线| 肉丝中文无码高清| 欧美色亚洲| 国产综合永久精品日韩鬼片| 亚洲丝袜色| 婷婷15月天青娱乐| 色综合91好| 色色色色日本| 亚洲天天艹| 亚洲综合 欧美| 神马久久久久久| 亚乱色| 人妻美腿丝袜制服诱惑综合天堂-| 鸥美极品| 国内毛片欧美香蕉精品| 久草大| 四季AV一区二区凹凸精品小说| 欧美综合色图片| 欧美日韩黄片精品在线| 五月天大香蕉| 欧美国产操逼| 无码人妻精品一区二区三区99不卡| 爽 好舒服 无码刺激久久| 国产美脚女优尤物在线观看| 国产97av| 日韩欧美亚洲一区二区三区影院| 欧美老熟另类| 超碰美国| 国产久久久久久久久一区二区| 韩国女主播青草在线| 熟女人妻一区二区三区| 国产情侣自拍在线播放| 好舒服视频| 免费久久一级毛片大黄| 欧洲天天在线| 97超碰香蕉| JULIA一区二区三区在线播放| 久久色一区二区| 亚洲国产成人精品久久久国产成人一区二区 | 中文字幕在线高清男人的天堂| 嗯嗯啊好大| 久久精品 六十路 熟女 欧美| 青青久操| 女色视频社区| 青青久草| 极品尤物在线观看| 91处女在线视频| 久久黄色性爱视频| 国产精品。| PMv在线观看| 旡码电影特区| 欧美精品三级黄片| 久久久久性熟视频| 精品九九| 一道本东京热加勒比一区二区三区| 97色综合中文网| 极品色社| 91欧美大片| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 女沟厕偷窥piss小便| 亚州精品一区二区三区香中文字幕在线| 久久久999国产精品| 久久婷婷精品| 天天综合青苹果| 伊人成人中文字幕久久网| 91色花堂| 厕所偷拍在线| 国产Av超碰| 欧美韩日精品资源| 破苞ⅩXXX性无码动漫无码| 综合大香蕉美。| www.色综合| 九九九九久久久久| 欧美日韩免费专区在线| 国产精品爽爽v| 亚洲九九视频在线观看| 女人爽到高潮潮喷18禁网站| juliaann欧美丝袜办公室| 91N欧美| 日韩性爱免费观看视频| 国产第二页| 大香蕉人妻| 女人天堂av在线播放| 超碰精品| 国产成人自拍视频在线| 亚洲欧美另类小说| 97碰碰日本乱偷人妻中文的| 国产亚洲精品玖玖玖在线观看| 哈哈操 大香蕉| 亚州操操穴网| 亚洲无码?第一页| 亚洲中文字幕熟女少妇一区二区| 国产在线不卡导航| 亚洲中文国际强奸字幕| 精品一区二区三区蜜桃| 精品v1区| 99日精品欧美国产| 蜜臀一区二区三区在线 | jk白丝没脱就开始啪啪| 精品人妻久久久久一区二区三区| 偷拍网站久久男女男| 久久美女国产| 99re98| 久久久久久久久久久久欧美日| 久99久视频| 人妻丰满熟妇一区二区三| 怡红院久久老司机| 国产盗摄美女如厕大神作品在线观看 | 95精品在线| 九月丁香综合网| av黄图片在线观看| 天美传媒精品一区二区三区| 精品久久在线区一区| 人人操人人摸人| 亚洲97成人在线观看| 欧美后入式| 日韩久久艹| 日本久久久久久久久| 1禁看欧美黄片免费看| 日韩欧美亚洲自拍偷拍| 久热这里| 久久精品中文| 男人的天堂激情| 天天日天天爽| 久久久国产亚洲精品系列| 精品人妻一区二区三区四区石在线| 日日玩天天干| 美女黄码视频午夜| 久久视网78| 日韩在线视频1234| 婷色五月天| 亚洲精品国产精品乱码不99| 国产女乱淫真高清免费视频| 亚洲欧美日韩免费观看| 天天干18禁| 久9爱精品| 欧美天天在线| 9999亚洲精品| 久久99999| 大香蕉国产中文自拍| 91亚洲精品青草| 精品久久一区二区三区四区五区| 国产精品成人无码av| 在线观看亚洲专区| 国产成年精品高清在线观看91| 国产 日韩 欧美一区| 超碰在线一区| 国产精品女aA片爽爽视频| juliaann丝袜| 91日韩国产欧美亚洲另类精盘州至城都| 女人天堂网| 一区二区播放| 高清孕妇孕交 交孕妇| 加勒比久久av| 黄站在线免费观看| 欧美在线|亚洲| 亚洲精品乱码久久久久久蜜桃麻豆| 囯产精品强| 麻豆a'v电影| 超碰97综合网| 精品免费囯产一区二区三区| 亚91网| 97爱综合| 亚洲色图综合| a片在线播放| 国产丝袜美女在线一区| 欧美的性爱网站免费| 在线岛国新天堂8| 手机在线中文字幕国产 | 亚洲玖玖爱| 婷婷丁香人妻 | 亚洲αv一区二区三区| 粉嫩av在线一区二区| 黄片在线免费在线观看| www.狠狠操| 日韩中字av一区| 怡春苑东京热| 亚洲男人天堂视频| juliaann丝袜| 999久久久免费精品国产牛牛| 日韩中文字幕国产| 在线v中文字幕一区二区三区| 综合啪啪| 67194无码不卡| www.男人天堂| 欧美激情精品| 国产三级在线现体验区| 亚欧Av| 亚洲 图片 综合91| 亚洲欧洲色情高清| 高清无码学生妹高潮| 在线亚洲欧美| 美女极品一区二区三区| 99热这里只有精品8| 99国产在线绯色一区| 任你干在线视频| 蜜臀久久99精品久久久久久-DVD | 青草视频人妻在线观看| 青草精品视频一日本久久久久网站| 97色亚洲| 日本性爱少妇| 欧美亚洲激情小说| 97久久国产精品| 热99这里有精品综合久久| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 日本在线伊人啪啪| 黄色激情电影在线观看| 深爱激情五月天| 91五月天| 日本精品一区二区三区四区的功能| 一级特黄aaa大片在线观看成人一级片在线观看 | 一级特黄aaa大片在线观看成人一级片在线观看| 深夜国产一区二区三区在线看| 久久黄黄| 超碰偷拍| 国产成人综合在线播放| 色蜜AV| 亚洲在线观看| 亚洲成aⅴ人片不卡无码| 发朗少妇买婬全视频中文| 强奸熟女一区二区三区| 亚洲av噜噜噜噜噜噜| 国产成人自拍视频在线| 国产美女精品| 97欧美超碰| 99操视频| 夜夜操夜夜高潮夜夜爽国产精品区| 中文字幕天堂在线| 99国产人成精品| 99这里只有精品| 国产亚洲精品美女久久久久久2021| 啊啊啊啊啊啊啊国| 91性网| 爽 好舒服 无码刺激久久| 一区二区蜜臀| 日韩av在线精品观看| 日本欧美成人片AAAA| 高清孕妇孕交 交孕妇| 久久国产免费激情视频| 欧美色图中文字幕| 亚洲人妻在线精品| 精品国产乱码久久久久久久久1 | 国产精品无码论坛| 亚洲视频二区 | 骚熟女吞| 91影库| 99xav| 韩国手机不卡无码三级视频| 77777亚洲蜜臀精品久久综合蜜臀| 久久久久久加勒比| 婷婷五月天色色| 午夜福利合集| 97人人模人人爽人人| 99精品综合久久久久五月天| 亚州AV无码国产精品| 天天操天天日天天干| 亚洲五码一区二区三区| 色臀aV| 日本亚洲熟女视频| 日韩欧美中文字亚洲慕| 操婷婷逼| 亚洲区 欧美区| 欧美亚性天堂| 91狠狠| 欧洲乱码一区二区| 亚洲无码太久| 国产女人9999| 丁香六月东京热| 欧美色91| 精品女人999| 色牛aV| 国产精品久久久777| 无码国产Av| 一区二区播放| 婷婷五月天av| 啪啪性爱免费视频| 欧美色图下一页| 尤物国产一区在线观看| 欧美图片校园春色| 中文字幕一区 二区三四五 区日 日骚| 激情小说亚洲| 天堂在线一区二区| 久久婷婷综合国际产色怕| 久久久女人| 欧美一区二区情色| 一牛影视成人片免费| 久久久久久人| 久草久热| av绯色| 加勒比99999| 欧美日韩淫加| 午夜精品探花| 综合夜夜| 欧美在线中M| 天天摸,夜夜摸| 亚洲免费成人在线高清无码视频 | 色婷婷电影网| 黄色大片免费在线| 91精品在线播放| 国模限制级电影| 国产大学生口爆吞精合集| 99re黄 | 国产人妖视频一区在线观看| 一区二区三区麻豆| 91美女在线视频| 香蕉久久国产AV一区二区| 久久久久亚洲熟妇熟女| 亚洲97网站| 熟妇熟女一区二三区| 精品在线观看视频在线| 久久精品国产Aⅴ| 青青青草伊人精品| 嗯嗯啊啊用力视频免费| 国产欧美亚洲精品a第2页| 日本淫乱女一区二区三区视频| 久久久久久久久国产| 好淫网一二三视区| 久久欧美性爱视频| 色在线综合| 亚洲国产精品无石码久久| 超碰97欧美日韩| 高树玛利亚无码流出| 99热综合| 国产乱码精品一区二区三区四川| 国产精品美女视频诱惑| 蜜臀在线看片| 日韩电影天堂视频二区三区| 日韩成人色图| 婷婷亚洲综合| 成人午夜小视频手机在线看| 国产1024在线播放| 亚洲欧美97| 青青草原成人| 涩涩久久精品| 色五月天AV| 婷婷三区| 天美AV片| 色婷婷电影| 在线观看黄色电话| 天天看天天在线精品| 中日韩免费看男女操逼大全| 78精品在线| 夜夜爽夜夜摸夜夜操免费视频| 欧美日韩亚洲高清不卡一区二区三区| 淫妻综合网| 亚洲色五月| 大香蕉五月天| 国产又操| 国产女生在线| 操逼操网| 人人操,操人人| 无码精品人妻一区二区三区妖精| 亚洲在线网站| 精品无码欧美三级| 免费啪啪一级视频| 精品毛片av一区二区| 啪啪综合网| 色欧洲| 久久久久久久| 后入精品| 中文有码9| 久久久久成人网| 日韩欧视频| 亚洲综合伊人无码久久| 欧美亚州综合网图片| 国产综合久| 一区二区三区麻豆| 久久久久久久久女黄| 久久影视二区三区行押| 极品久久久久久久久久久久久久| 亚洲色图加勒比| 中文97国产| 福利天堂| 欧美在线综合| 亚洲影视高清第一页| 亚洲欧美国产精品久久久久久久| 女人被男人桶爽视频网站| 久久首页| 欧美亚洲日本激情在线| 国内自拍 日韩激情 99|