摘要:對(duì)于,其默認(rèn)大小一般是本地存儲(chǔ)和都保存在瀏覽器端,且都是同源的。把變量放在閉包中和放在全局作用域,對(duì)內(nèi)存的影響是一致的,這里并不能說成是內(nèi)存泄露。將新的樹和之前的虛擬樹進(jìn)行相比較,根據(jù)結(jié)果對(duì)進(jìn)行精準(zhǔn)響應(yīng)。
1. JavaScript 1. JavaScript文件在什么情況下會(huì)放在html哪個(gè)位置
https://zhuanlan.zhihu.com/p/...
對(duì)于必須要在DOM加載之前運(yùn)行的JavaScript腳本,我們需要把這些腳本放置在頁面的head中,而不是通過外部引用的方式,因?yàn)橥獠康囊梅绞皆黾恿司W(wǎng)絡(luò)的請(qǐng)求次數(shù);
2. async和defer區(qū)別async表示異步加載JavaScript文件,它的下載過程可以在HTML的解析過程中運(yùn)行,加載完成之后立即執(zhí)行這個(gè)文件的代碼,執(zhí)行文件代碼的過程中會(huì)阻塞HTML的解析,它不保證文件加載的順序。
defer表示在HTML文檔解析之后再執(zhí)行加載完成JavaScript文件,JavaScript文件的下載過程可以在HTML的解析過程中進(jìn)行,它是按照script標(biāo)簽的先后順序來加載文件的。
map返回一個(gè)新數(shù)組
forEach遍歷數(shù)組,返回值為undefined
reduce累加器,遍歷時(shí)避開創(chuàng)建新數(shù)組減少冗(rong)余,返回值由參數(shù)callback決定
session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多時(shí),會(huì)占用服務(wù)器的資源,所以考慮服務(wù)器性能方面,可以使用cookie
cookie存儲(chǔ)容量有限制,單個(gè)cookie保存數(shù)據(jù)不能超過4k,且很多瀏覽器限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。對(duì)于seesion,其默認(rèn)大小一般是1024k
localStorage本地存儲(chǔ)和cookie都保存在瀏覽器端,且都是同源的。每個(gè)域5MB
apply
接受2個(gè)參數(shù):一個(gè)是在其中運(yùn)行的函數(shù)作用域(Scope),另一個(gè)可以是arguments也可以是Array的實(shí)例,經(jīng)典案例:#獲取數(shù)組中最大的值#;#使用push合并數(shù)組#;
call
和apply用法相同,只是除了第一個(gè)都是作用域之外,其余參數(shù)必須逐個(gè)列舉出來。經(jīng)典用例:#使用call調(diào)用匿名函數(shù)#
bind
接受1個(gè)參數(shù),返回一個(gè)新函數(shù),這個(gè)新函數(shù)的this值來自bind(context)函數(shù)傳遞的context
Function.prototype.bind = function(context){ var self = this; //原函數(shù) return function(){ //返回一個(gè)新函數(shù) return self.apply(context, arguments) } }6. 事件綁定有哪幾種,分別在什么情況下使用 7. 請(qǐng)解釋一下事件委托或事件代理 8. 異步編程有哪些 9. 異步編程中如何捕獲異常 10. 數(shù)組去重你會(huì)怎么寫
https://segmentfault.com/a/11...
思路一:
1.雙層循環(huán),外層循環(huán)元素,內(nèi)存循環(huán)時(shí)比較值
2.如果有相同的值則跳過(break),不相同則push近數(shù)組
思路二:利用splice直接在原數(shù)組進(jìn)行操作(刪除元素時(shí),需要更新數(shù)組長度)
思路三:利用對(duì)象的屬性不能相同的特點(diǎn)進(jìn)行去重
思路四:數(shù)組遞歸去重
1.運(yùn)用遞歸的思想
2.先排序,然后從最后開始比較,遇到相同,則刪除
思路五:利用indexOf以及forEach
思路六:利用indexOf以及sort
思路七:利用ES6的set
當(dāng)在函數(shù)內(nèi)搜索一個(gè)變量時(shí),如果函數(shù)內(nèi)沒有這個(gè)變量,那么此次搜索過程會(huì)隨著代碼執(zhí)行環(huán)境創(chuàng)建的作用域鏈往外逐層搜索
2.變量的生存周期全局變量的生存周期是永久的
對(duì)于函數(shù)內(nèi)var聲明的局部變量,當(dāng)退出函數(shù)時(shí),這些局部變量會(huì)隨著函數(shù)調(diào)用結(jié)束而被摧毀
局部變量所在的執(zhí)行環(huán)境還能被外界訪問,那么這個(gè)局部變量就有了不被摧毀的理由
4.閉包與內(nèi)存管理使用閉包的動(dòng)機(jī):主動(dòng)將一些變量封裝在閉包中,以便未來還需要使用到它們。
把變量放在閉包中和放在全局作用域,對(duì)內(nèi)存的影響是一致的,這里并不能說成是內(nèi)存泄露。如果將來需要回收這些變量,我們可以手動(dòng)把這些變量設(shè)為null
包裝函數(shù)嵌套太深,且被不推薦使用mixins模式
2.huge component組件太大,學(xué)習(xí)成本太高,高度集中化無法將細(xì)化功能抽離出來
3.confusing classes有時(shí)候不知道使用classes還是function創(chuàng)建函數(shù)
有時(shí)在lifecycle內(nèi)注冊完事件后,又需要在摧毀階段手動(dòng)注銷事件
注冊監(jiān)聽事件后,又需要在組件變化時(shí)手動(dòng)發(fā)布事件
let string = ""; Boolean(string) //false function return (1. redux和mobx區(qū)別{string&& //會(huì)報(bào)錯(cuò) )前面的不會(huì)進(jìn)行bool類型轉(zhuǎn)換 }
具體參考:https://www.robinwieruch.de/r...
Redux受函數(shù)式編程影響,它總是返回一個(gè)新狀態(tài),而不是改變狀態(tài)。
//不要在Redux這樣做,因?yàn)檫@樣會(huì)改變數(shù)組 function addAuthor(state, action) { return state.authors.push(action.author) } //保持不變,總是返回一個(gè)新對(duì)象 function addAuthor(state, action) { return [...state.authors, action.author] }
state數(shù)據(jù)遵照標(biāo)準(zhǔn)化數(shù)據(jù)格式,可以保持state數(shù)據(jù)扁平化(flat state)和單一(身份)信息源(single source of truth) 。
{ post: { id: "a", authorId: "b", ... }, author: { id: "b", postIds: ["a", ...], ... } }
Mobx既有面向?qū)ο缶幊蹋灿蟹磻?yīng)式編程。它將你的state包裹在可觀察(Observable)的狀態(tài)中。因此,你可以在state中獲得所有可觀察的功能。
在Mobx里state是可變。因此可以直接改變state:
function addAuthor(author){ this.authors.push(author) }
數(shù)據(jù)結(jié)構(gòu)state可以保持深層嵌套
在Redux中,狀態(tài)是只讀的,只能使用顯示操作actions來更改狀態(tài)。相反,在Mobx中,狀態(tài)允許讀寫,可以直接改變狀態(tài)without actions2. redux的缺點(diǎn)
https://stackoverflow.com/que...
例如:
//state內(nèi)的list引用redux中的list this.state={ list:this.props.list||[] } //component內(nèi)修改list值 this.setState({list:[1,2,3]}) //此時(shí)redux中的list也被改變,只是沒有將變化傳遞到action console.log(this.props.list) //[1,2,3]
redux的核心概念之一是 #state是不可變的#;使用Object.assign()合并對(duì)象無法實(shí)現(xiàn)深拷貝
3. mobx的缺點(diǎn)https://stackoverflow.com/que...
無法知道數(shù)據(jù)是在什么時(shí)候改變(或update)的,并且很難跟蹤(參照redux-logger和mobx-logger)
4. setState為什么是異步的why is setState asynchronous?
回答這個(gè)問題首先要闡述:調(diào)用setState時(shí)會(huì)發(fā)生什么?
調(diào)用setState時(shí),React會(huì)將setState()的對(duì)象以“和解”(reconciliation)的過程合并到組件的當(dāng)前狀態(tài)()并以此創(chuàng)建一個(gè)新的React元素樹(我理解為虛擬DOM樹)。
將新的DOM樹和setState之前的虛擬DOM樹進(jìn)行相比較(diff),根據(jù)結(jié)果對(duì)UI進(jìn)行精準(zhǔn)響應(yīng)。
因此個(gè)人理解為:對(duì)比過程需要消耗一定時(shí)間,為了防止阻塞所以將setState設(shè)置為異步
另一篇文章:從 setState promise 化的探討 體會(huì) React 團(tuán)隊(duì)設(shè)計(jì)思想
5. Virtual DOM (diff)算法https://github.com/livoras/bl...
算法實(shí)現(xiàn)
步驟一:用JS對(duì)象模擬DOM樹
步驟二:比較兩棵虛擬DOM樹的差異
這兩個(gè)樹的完全diff算法是一個(gè)時(shí)間復(fù)雜度O(n^3)的問題,但是在前端當(dāng)中,很少會(huì)跨越層級(jí)地移動(dòng)DOM元素。所以Virtual DOM只會(huì)對(duì)同一個(gè)層級(jí)的元素進(jìn)行對(duì)比:
1.深度優(yōu)先遍歷,記錄差異
2.可能會(huì)有的差異類型
2.1 替換掉原來的節(jié)點(diǎn)
2.2 移動(dòng)、刪除、新增子節(jié)點(diǎn)
2.3 修改節(jié)點(diǎn)的屬性
2.4 文本節(jié)點(diǎn)被改變
var REPLACE = 0 var REORDER = 1 var PROPS = 2 var TEXT = 3
3.列表對(duì)比算法
關(guān)鍵算法:#字符串的最小編輯距離#(Edition Distance); #Levenshtein Distance#; O(M * N)
步驟三:把差異應(yīng)用到真正的DOM樹上
?
7. 在react中如何使用jQuery???
8. 在xx版本之后更新了哪些https://reactjs.org/versions/
收到這個(gè)問題前我還從來沒關(guān)心過每次發(fā)布新版本更新了哪些,這個(gè)問題讓我成長很多。
9. react做過哪些性能優(yōu)化 10. React Native手機(jī)端適配function scaleSize(size) { let screenW = Dimensions.get("window").width>Dimensions.get("window").height?Dimensions.get("window").height:Dimensions.get("window").width; const defaultWidth =375; // 在UI圖上的基礎(chǔ)寬度 const _scaleWidth = screenW / defaultWidth; return size * _scaleWidth; }4. vue 1. vue雙向綁定原理
https://www.jianshu.com/p/e42...
基本原理:
1.利用Object.defineProperty監(jiān)聽對(duì)象賦值動(dòng)作
2.遍歷所有節(jié)點(diǎn)
3.使用觀察者模式對(duì)擁有v-model屬性的DOM節(jié)點(diǎn)訂閱上述時(shí)間
4.對(duì)擁有v-bind屬性的DOM節(jié)點(diǎn)進(jìn)行發(fā)布事件
5.對(duì)表單標(biāo)簽使用`addEventListener("input",function(e){/.../})監(jiān)聽事件
Object.defineProperty(vModelList, key, { enumerable: true, configurable: true, set: function (newVal) { // 發(fā)布 _observer.trigger(key, newVal) } });2. 正則貪婪匹配實(shí)現(xiàn)數(shù)據(jù)綁定(模板字符串)
https://segmentfault.com/a/11...
String.prototype.render = function(context){ return this.replace(/{{([^}]+)}}/g, (match, key) => (context[key]||match)); } "你好,{{name}},我們會(huì)在{{day}}天之內(nèi)通知面試結(jié)果。".render({name:"Niko",day:3})5. http 1. 什么是jsonp
https://www.zhihu.com/questio...
很簡單,就是利用 并提供一個(gè)回調(diào)函數(shù)來接收數(shù)據(jù)(函數(shù)名可約定,或通過地址參數(shù)傳遞)。 第三方產(chǎn)生的響應(yīng)為json數(shù)據(jù)的包裝(故稱之為jsonp,即json padding),形如: callback({"name":"hax","gender":"Male"}) 這樣瀏覽器會(huì)調(diào)用callback函數(shù),并傳遞解析后json對(duì)象作為參數(shù)。本站腳本可在callback函數(shù)里處理所傳入的數(shù)據(jù)。 補(bǔ)充:“歷史遺跡”的意思就是,如果在今天重新設(shè)計(jì)的話,也許就不會(huì)允許這樣簡單的跨域了嘿,比如可能像XHR一樣按照CORS規(guī)范要求服務(wù)器發(fā)送特定的http頭。
從輸入U(xiǎn)RL到頁面加載發(fā)生了什么https://segmentfault.com/a/11...
1.DNS解析
2.TCP連接
3.發(fā)生HTTP請(qǐng)求
4.服務(wù)器處理請(qǐng)求并返回HTTP報(bào)文
5.瀏覽器解析渲染頁面
6.連接結(jié)束
禁止使用flexflex彈性布局
請(qǐng)使用flex完成
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99063.html
摘要:對(duì)于,其默認(rèn)大小一般是本地存儲(chǔ)和都保存在瀏覽器端,且都是同源的。把變量放在閉包中和放在全局作用域,對(duì)內(nèi)存的影響是一致的,這里并不能說成是內(nèi)存泄露。將新的樹和之前的虛擬樹進(jìn)行相比較,根據(jù)結(jié)果對(duì)進(jìn)行精準(zhǔn)響應(yīng)。 1. JavaScript 1. JavaScript文件在什么情況下會(huì)放在html哪個(gè)位置 https://zhuanlan.zhihu.com/p/... 對(duì)于必須要在DOM加載...
摘要:接下來,我會(huì)檢查每個(gè)頁面以確保它使用有用的標(biāo)簽,包括標(biāo)題標(biāo)簽。這個(gè)問題讓面試官有機(jī)會(huì)了解潛在員工對(duì)工作難以勝任的部分。面試官可能需要考慮這種弱點(diǎn)對(duì)團(tuán)隊(duì)的影響。面試官可能會(huì)發(fā)現(xiàn)自己公司的計(jì)劃與未來員工的職業(yè)目標(biāo)是否保持一致。 翻譯:瘋狂的技術(shù)宅原文:https://www.indeed.com/hire/i... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)注,每天都給你...
摘要:詳解十大常用設(shè)計(jì)模式力薦深度好文深入理解大設(shè)計(jì)模式收集各種疑難雜癥的問題集錦關(guān)于,工作和學(xué)習(xí)過程中遇到過許多問題,也解答過許多別人的問題。介紹了的內(nèi)存管理。 延遲加載 (Lazyload) 三種實(shí)現(xiàn)方式 延遲加載也稱為惰性加載,即在長網(wǎng)頁中延遲加載圖像。用戶滾動(dòng)到它們之前,視口外的圖像不會(huì)加載。本文詳細(xì)介紹了三種延遲加載的實(shí)現(xiàn)方式。 詳解 Javascript十大常用設(shè)計(jì)模式 力薦~ ...
閱讀 943·2021-09-07 09:58
閱讀 1494·2021-09-07 09:58
閱讀 2888·2021-09-04 16:40
閱讀 2508·2019-08-30 15:55
閱讀 2416·2019-08-30 15:54
閱讀 1374·2019-08-30 15:52
閱讀 438·2019-08-30 10:49
閱讀 2610·2019-08-29 13:21