JavaScript

Javascript

  1. 數(shù)據(jù)類型

    基本數(shù)據(jù)類型:string咪笑、number、boolean娄涩、symbol窗怒、undefined、null;

    引用類型:Object扬虚、Array努隙、Function、Map等孔轴;

  2. 判斷數(shù)據(jù)類型方法

    typeof:能夠快速區(qū)分基本數(shù)據(jù)類型剃法,但是引用類型判斷都返回object(eg: console.log(typeof function(){}); // function);

    instanceof:能夠快速區(qū)分引用類型路鹰,適合判斷自定義類實(shí)例對(duì)象贷洲,但是基本數(shù)據(jù)類型不能判斷(eg:console.log(2 instanceof Number); // false);

    Object.prototype.toString.call:精準(zhǔn)判斷所有數(shù)據(jù)類型(eg:console.log(toString.call(null)); //[object Null])晋柱;

  3. 原型优构、原型鏈

    原型:實(shí)例對(duì)象上有__proto__隱式原型、構(gòu)造函數(shù)上有prototype原型對(duì)象雁竞;__proto__指向構(gòu)造函數(shù)的prototype钦椭。

    原型鏈:原型與原型層層相連接的過程就是原型鏈。

    原型鏈
  1. var碑诉、let彪腔、const

    var:聲明的變量,其作用域?yàn)樵撜Z句所在的函數(shù)內(nèi)进栽,且存在變量提升現(xiàn)象德挣,可重復(fù)定義;

    let:聲明的變量快毛,其作用域?yàn)樵撜Z句所在的代碼塊內(nèi)格嗅,不存在變量提升;

    const:聲明的變量不允許修改唠帝;

  2. 閉包

    假如一個(gè)函數(shù)能訪問外部的變量屯掖,那么這個(gè)函數(shù)它就是一個(gè)閉包,而不是一定要返回一個(gè)函數(shù)襟衰;

  3. 閉包使用場(chǎng)景

    • 在全局作用域中讀取內(nèi)部函數(shù)的變量贴铜;

    • 防止函數(shù)內(nèi)部的變量執(zhí)行完成后被銷毀,使其一直保存在內(nèi)存中瀑晒;

    • 封裝私有變量阀湿;

  4. 繼承

    原型鏈繼承:將函數(shù)prototype指向新的對(duì)象,基于原型鏈瑰妄,既是父類的實(shí)例陷嘴,也是子類的實(shí)例;缺點(diǎn)是無法實(shí)現(xiàn)多繼承间坐,所有實(shí)例都會(huì)共享父類實(shí)例的屬性灾挨;

    構(gòu)造繼承:將函數(shù)call綁定this邑退,可以實(shí)現(xiàn)多繼承(call多個(gè)),解決了所有實(shí)例共享父類實(shí)例屬性的問題劳澄;缺點(diǎn)是只能繼承父類實(shí)例的屬性和方法地技,不能繼承原型上的屬性和方法;

    組合繼承:將上面兩種組合使用秒拔,可以繼承實(shí)例屬性/方法莫矗,也可以繼承原型屬性/方法;缺點(diǎn)是調(diào)用了兩次父類構(gòu)造函數(shù)砂缩,生成了兩份實(shí)例作谚;

  5. 淺拷貝、深拷貝

    淺拷貝:只拷貝對(duì)象里面的數(shù)據(jù)庵芭,不拷貝對(duì)象里面的子對(duì)象妹懒;淺拷貝可以通過assign和三點(diǎn)擴(kuò)展運(yùn)算符方式實(shí)現(xiàn)

    深拷貝:克隆出一個(gè)新的對(duì)象,數(shù)據(jù)相同双吆,但引用地址不同眨唬;深拷貝可以通過loadash.cloneDeep實(shí)現(xiàn),或者遞歸拷貝好乐,或者轉(zhuǎn)json字符串再轉(zhuǎn)json(會(huì)忽略u(píng)ndefined匾竿、symbol,不能序列化函數(shù)和解決循環(huán)引用對(duì)象)蔚万;

  6. call岭妖、apply、bind

    三個(gè)函數(shù)的作用都是將函數(shù)綁定到上下文中笛坦,用來改變函數(shù)中this的指向区转,借用已實(shí)現(xiàn)的方法苔巨,減少重復(fù)代碼版扩,節(jié)省內(nèi)存。

    call:改變函數(shù)的this上下文后馬上執(zhí)行該函數(shù)侄泽,接收參數(shù)若干個(gè)參數(shù)列表礁芦;

Function.prototype.myCall = function(context, ...args) {
  context = context || window
  let fn = Symbol()
  context[fn] = this
  let result = context[fn](...args)
  delete context[fn]
  return result
}

apply:改變函數(shù)的this上下文后馬上執(zhí)行該函數(shù),接收參數(shù)是數(shù)組悼尾;

Function.prototype.myApply = function(context) {
  context = context || window
  let fn = Symbol()
  context[fn] = this
  let result
  if (arguments[1]) {
    result = context[fn](...arguments[1])
  } else {
    result = context[fn]()
  }
  delete context[fn]
  return result
}

bind:返回改變了上下文后的函數(shù)柿扣,不執(zhí)行該函數(shù),接收參數(shù)若干個(gè)參數(shù)列表闺魏;

Function.prototype.myBind = function (context) {
  var _this = this
  var args = [...arguments].slice(1)
  // 返回一個(gè)函數(shù)
  return function F() {
    // 因?yàn)榉祷亓艘粋€(gè)函數(shù)未状,我們可以 new F(),所以需要判斷
    if (this instanceof F) {
      return new _this(...args, ...arguments)
    }
    return _this.apply(context, args.concat(...arguments))
  }
}
  1. ==和===區(qū)別

==:兩邊值類型不同的時(shí)候析桥,要先進(jìn)行類型轉(zhuǎn)換司草,再比較

  • 如果類型不同艰垂,進(jìn)行類型轉(zhuǎn)換

  • 判斷比較的是否是 null 或者是 undefined, 如果是, 返回 true .

  • 判斷兩者類型是否為 string 和 number, 如果是, 將字符串轉(zhuǎn)換成 number

  • 判斷其中一方是否為 boolean, 如果是, 將 boolean 轉(zhuǎn)為 number 再進(jìn)行判斷

  • 判斷其中一方是否為 object 且另一方為 string、number 或者 symbol , 如果是, 將 object 轉(zhuǎn)為原始類型再進(jìn)行判斷

===:不做類型轉(zhuǎn)換埋虹,類型不同的一定不等

  1. 防抖和節(jié)流

防抖:防止函數(shù)多次調(diào)用猜憎,將多次執(zhí)行變?yōu)樽詈笠淮螆?zhí)行;

節(jié)流:防止函數(shù)多次調(diào)用搔课,將多次執(zhí)行變?yōu)槊扛粢欢螘r(shí)間執(zhí)行胰柑;

  1. 宏任務(wù)和微任務(wù)

宏任務(wù)(Task):同步代碼、setTimeout 回調(diào)爬泥、setInteval 回調(diào)柬讨、IO、UI 交互事件急灭、postMessage姐浮、MessageChannel;

微任務(wù)(MicroTask):Promise 狀態(tài)改變以后的回調(diào)函數(shù)(then 函數(shù)執(zhí)行葬馋,如果此時(shí)狀態(tài)沒變卖鲤,回調(diào)只會(huì)被緩存,只有當(dāng)狀態(tài)改變畴嘶,緩存的回調(diào)函數(shù)才會(huì)被丟到任務(wù)隊(duì)列)蛋逾、Mutation observer 回調(diào)函數(shù)、queueMicrotask 回調(diào)函數(shù)(新增的 API)窗悯;

宏任務(wù)會(huì)被丟到下一次事件循環(huán)区匣,并且宏任務(wù)隊(duì)列每次只會(huì)執(zhí)行一個(gè)任務(wù);微任務(wù)會(huì)被丟到本次事件循環(huán)蒋院,并且微任務(wù)隊(duì)列每次都會(huì)執(zhí)行任務(wù)直到隊(duì)列為空亏钩;假如每個(gè)微任務(wù)都會(huì)產(chǎn)生一個(gè)微任務(wù),那么宏任務(wù)永遠(yuǎn)都不會(huì)被執(zhí)行了欺旧;

  1. EventLoop
  • 執(zhí)行?同步代碼

  • 執(zhí)行完所有同步代碼后且執(zhí)行棧為空姑丑,判斷是否有微任務(wù)需要執(zhí)行

  • 執(zhí)行所有微任務(wù)且微任務(wù)隊(duì)列為空

  • 是否有必要渲染頁(yè)面

  • 執(zhí)行一個(gè)宏任務(wù)

  1. localStorage、sessionStorage辞友、cookie栅哀、indexDB

localStorage:一直存在,除非手動(dòng)清理称龙,存儲(chǔ)大小5M留拾;

sessionStorage:tab標(biāo)簽頁(yè)關(guān)閉就自動(dòng)清理,存儲(chǔ)大小5M鲫尊;

cookie:由服務(wù)器生成痴柔、可設(shè)置過期時(shí)間,每次攜帶在請(qǐng)求header中疫向,存儲(chǔ)大小4K咳蔚;

indexDB:一直存在扛施,除非手動(dòng)清理,存儲(chǔ)大小沒有限制屹篓;

  1. 模塊化

AMD:依賴前置疙渣,提前執(zhí)行 (require.js),語法是define堆巧,require

CMD:依賴就近妄荔,延遲執(zhí)行 (sea.js),語法是 define谍肤,seajs.use([],cb)

CommonJS:CommonJS語法 module.exports=fn或者exports.a=1; 通過require('./a1')來引入啦租;CommonJs模塊首次執(zhí)行會(huì)被緩存,再次加載只返回緩存結(jié)果荒揣,require返回的值是輸出值的拷貝(對(duì)于引用類型是淺拷貝)

ES6 Module:es6 module 語法是 export {...}, import ...from..., export輸出的是值得引用

NodeJS篷角、webpack都是基于CommonJS該規(guī)范來實(shí)現(xiàn)的

  1. CommonJS和ES6 Module區(qū)別
  • Commonjs是同步導(dǎo)入,因用于服務(wù)端系任,文件都在本地恳蹲,同步導(dǎo)入即使卡住主線程影響也不大,后者是異步導(dǎo)入俩滥,因?yàn)橛糜跒g覽器端嘉蕾,需下載文件,如果采用同步導(dǎo)入對(duì)渲染會(huì)有很大影響霜旧。

  • CommonJS 在導(dǎo)出時(shí)都是值的拷貝错忱,就算導(dǎo)出的值變了,導(dǎo)入的值也不會(huì)變挂据。如果想更新以清,必須重新導(dǎo)入一回。

  • ES Module 導(dǎo)入導(dǎo)出的值指向同一個(gè)內(nèi)存地址崎逃。所以掷倔,導(dǎo)入值也會(huì)隨著導(dǎo)出值變化。

  • ES Module 會(huì)編譯成 require/exports來執(zhí)行婚脱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末今魔,一起剝皮案震驚了整個(gè)濱河市勺像,隨后出現(xiàn)的幾起案子障贸,更是在濱河造成了極大的恐慌,老刑警劉巖吟宦,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篮洁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡殃姓,警方通過查閱死者的電腦和手機(jī)袁波,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門瓦阐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篷牌,你說我怎么就攤上這事睡蟋。” “怎么了枷颊?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵戳杀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我夭苗,道長(zhǎng)信卡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任题造,我火速辦了婚禮傍菇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘界赔。我一直安慰自己丢习,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布淮悼。 她就那樣靜靜地躺著泛领,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敛惊。 梳的紋絲不亂的頭發(fā)上渊鞋,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音瞧挤,去河邊找鬼锡宋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛特恬,可吹牛的內(nèi)容都是我干的执俩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼癌刽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼役首!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起显拜,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤衡奥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后远荠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矮固,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年譬淳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了档址。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盹兢。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖守伸,靈堂內(nèi)的尸體忽然破棺而出绎秒,到底是詐尸還是另有隱情,我是刑警寧澤尼摹,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布替裆,位于F島的核電站,受9級(jí)特大地震影響窘问,放射性物質(zhì)發(fā)生泄漏辆童。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一惠赫、第九天 我趴在偏房一處隱蔽的房頂上張望把鉴。 院中可真熱鬧,春花似錦儿咱、人聲如沸庭砍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怠缸。三九已至,卻和暖如春钳宪,著一層夾襖步出監(jiān)牢的瞬間揭北,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工吏颖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搔体,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓半醉,卻偏偏與公主長(zhǎng)得像疚俱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缩多,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容