這篇文章主要講解了“一些前端基礎(chǔ)知識(shí)整理”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“一些前端基礎(chǔ)知識(shí)整理”吧!
創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、瓊結(jié)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為瓊結(jié)等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
Call, bind, apply實(shí)現(xiàn)
// call Function.prototype.myCall = function (context) { context = context ? Object(context) : window context.fn = this; let args = [...arguments].slice(1); const result = context.fn(...args); delete context.fn; return result; } // apply Function.prototype.myApply = function (context) { context = context ? Object(context) : window; context.fn = this; let args = [...arguments][1]; let result; if (args.length === 0) { result = context.fn(); } else { result = context.fn(args); } delete context.fn; return result; } // bind Function.prototype.myBind = function (context) { let self = this; let args = [...arguments].slice(1); return function() { let newArgs = [...arguments]; return self.apply(context, args.concat(newArgs)); } }
原型與原型鏈
每一個(gè)JavaScript對(duì)象(null除外)在創(chuàng)建的時(shí)候會(huì)關(guān)聯(lián)另一個(gè)對(duì)象,這個(gè)被關(guān)聯(lián)的對(duì)象就是原型。每一個(gè)JavaScript對(duì)象(除了 null)都具有的__proto__屬性會(huì)指向該對(duì)象的原型。JavaScript中所有的對(duì)象都是由它的原型對(duì)象繼承而來,而原型也是一個(gè)對(duì)象,它也有自己的原型對(duì)象,這樣層層上溯,就形成了一個(gè)類似鏈表的結(jié)構(gòu),這就是原型鏈。每一個(gè)對(duì)象都會(huì)從原型"繼承"屬性。
實(shí)例對(duì)象和構(gòu)造函數(shù)都可以指向原型, 原型可以指向構(gòu)造函數(shù),不能指向?qū)嵗?因?yàn)榭梢杂卸鄠€(gè)實(shí)例)。
原型對(duì)象有兩個(gè)屬性,constructor 和 __proto__。
function Person() {} var person = new Person(); // 實(shí)例原型 === 構(gòu)造函數(shù)原型 person.__proto__ === Person.prototype // true // 原型構(gòu)造函數(shù) === 構(gòu)造函數(shù) Person.prototype.constructor === Person // true
react diff
React 通過制定大膽的 diff 策略,將 O(n3) 復(fù)雜度的問題轉(zhuǎn)換成 O(n) 復(fù)雜度的問題;
React 通過分層求異的策略,對(duì) tree diff 進(jìn)行算法優(yōu)化;
對(duì)樹進(jìn)行分層比較,兩棵樹只會(huì)對(duì)同一層次的節(jié)點(diǎn)進(jìn)行比較。
React 通過相同類生成相似樹形結(jié)構(gòu),不同類生成不同樹形結(jié)構(gòu)的策略,對(duì) component diff 進(jìn)行算法優(yōu)化;
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
如果是同一類型的組件,按照原策略繼續(xù)比較 virtual DOM tree。
如果不是,則將該組件判斷為 dirty component,從而替換整個(gè)組件下的所有子節(jié)點(diǎn)。
對(duì)于同一類型的組件,有可能其 Virtual DOM 沒有任何變化,如果能夠確切的知道這點(diǎn)那可以節(jié)省大量的 diff 運(yùn)算時(shí)間,因此 React 允許用戶通過 shouldComponentUpdate() 來判斷該組件是否需要進(jìn)行 diff。
React 通過設(shè)置唯一 key的策略,對(duì) element diff 進(jìn)行算法優(yōu)化;
建議,在開發(fā)組件時(shí),保持穩(wěn)定的 DOM 結(jié)構(gòu)會(huì)有助于性能的提升;
遍歷對(duì)象
對(duì)象遍歷方法總結(jié):
for...in:遍歷對(duì)象自身, 包含繼承, 可枚舉,不含 Symbol 的屬性。
Object.keys(obj):遍歷對(duì)象自身, 不含繼承,可枚舉,不含 Symbol 的屬性。【values, entries】
Object.getOwnPropertyNames(obj):遍歷對(duì)象自身, 不含繼承, 不含 Symbol 的屬性, 不管是否可枚舉
Object.getOwnPropertySymbols(obj): 遍歷對(duì)象自身, 不含繼承, 所有 Symbol 的屬性, 不管是否可枚舉
Reflect.ownKeys(obj): 遍歷對(duì)象自身,不含繼承,所有鍵名,不管是否Symbol 和可枚舉。
對(duì)象其他方法:
JSON.stringify():只串行化對(duì)象自身,不含繼承,可枚舉,不含 Symbol屬性?!緁unction,undefined, Symbol會(huì)丟失, set、map會(huì)處理成空對(duì)象】
Object.assign():只拷貝對(duì)象自身,不含繼承, 可枚舉屬性, 不管是否是Symbol ?!救繑?shù)據(jù)類型屬性值】
異步加載腳本
默認(rèn)情況下,瀏覽器是同步加載 JavaScript 腳本,即渲染引擎遇到