最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

JS基礎(chǔ)知識

2023-05-19 18:47 作者:小老虎Tigger  | 我要投稿

繼承和原型鏈

每個實例對象的__proto__屬性都指向它的構(gòu)造函數(shù)的prototype(原型對象),按照這種方式,層層向上,直到null。

new運算符

創(chuàng)建一個空對象,將__proto__屬性指向構(gòu)造函數(shù)的prototype屬性,將對象作為構(gòu)造函數(shù)的this去執(zhí)行,返回對象。

Object.create

用Object.create改寫上面的例子,其實就是創(chuàng)建一個空對象,將空對象的__proto__屬性指向傳入的參數(shù)。

經(jīng)常會看到Object.create(null)這種操作,其實就是將創(chuàng)建的對象__proto__屬性指向了null,但是并不建議,可以使用Map代替。

call,apply,bind

call、apply都是改變調(diào)用函數(shù)的this值,區(qū)別在于參數(shù)類型不同,apply使用數(shù)組傳參。bind方法會創(chuàng)建一個新函數(shù),將this綁定到新函數(shù)上面,其余參數(shù)作為新函數(shù)的參數(shù)。

instanceof運算符

object instanceof constructor,其實就是判斷實例的原型鏈上有沒有構(gòu)造函數(shù)的prototype。

相等(==)

如果操作數(shù)具有相同類型,直接進行對比,操作數(shù)是對象,則判斷兩邊操作數(shù)引用的對象是否為同一個;如果存在NaN,則直接返回false。

如果其中一個操作數(shù)是null或者undefined,則只有另外一個操作數(shù)也是null或者undefined的時候,才為true

如果其中一個操作數(shù)是對象,兩外一個是基本類型,會按照對象的Symbol.toPrimitive,valueOf,toString方法將對象轉(zhuǎn)換為基本類型進行對比。

如果操作數(shù)都是基本類型,但兩邊類型不一樣。會嘗試將兩邊轉(zhuǎn)化為同一種類型再進行比較。大致按照 boolean轉(zhuǎn)換為數(shù)字,string轉(zhuǎn)換為數(shù)字進行比較。


執(zhí)行上下文、作用域鏈、閉包

js引擎在執(zhí)行js代碼之前,需要先解析源碼生成AST和創(chuàng)建執(zhí)行上下文,這時執(zhí)行上下文中會根據(jù)當(dāng)前代碼信息創(chuàng)建LexicalEnvironment和VariableEnvironment,其中包含this、outer、EnvironmentRecord(變量、參數(shù)等)等信息。

通過let、const、function、class等聲明的變量會存儲于LexicalEnvironment,let、const聲明的變量被初始化為uninitialized,并禁止訪問,形成暫時性死區(qū)。

通過var聲明的變量會存儲在VariableEnvironment,初始化為undefined。

解析完成后,就可以根據(jù)AST和執(zhí)行上下文來生成、執(zhí)行字節(jié)碼。在執(zhí)行階段,會將標(biāo)識符和實際的變量進行綁定,也就是賦值過程。

我們其實可以簡單將LexicalEnvironments理解成一個字典,保存著代碼執(zhí)行需要的所有變量、參數(shù)、this等信息,代碼執(zhí)行階段,對變量的讀取賦值,都是對這個字典的操作。

作用域是當(dāng)前的執(zhí)行上下文,值和表達式在其中“可見”或可被訪問。

JavaScript 的作用域分以下三種:全局作用域,模塊作用域,函數(shù)作用域。

此外,用 let 或 const 聲明的變量屬于額外的作用域:塊級作用域。

作用域也可以堆疊成層次結(jié)構(gòu),子作用域可以訪問父作用域,這個時候就形成了作用域鏈。

閉包,簡單來講,就是指函數(shù)執(zhí)行完后,依然有變量保持著對其作用域的引用,導(dǎo)致其并未被釋放。

我們現(xiàn)在來看一下這個經(jīng)典的例子。

這個時候i的定義是在外層,定時器內(nèi)部的函數(shù)創(chuàng)建的作用域中沒有i這個變量,到時間后訪問的是外層作用域的變量i,循環(huán)完成后外層作用域中的i已經(jīng)被修改為5,所以打印出來全是5。

稍微修改一下

因為在每一次循環(huán)中,立即執(zhí)行函數(shù)都會創(chuàng)建自身的函數(shù)作用域,將變量i保存在VariableEnvironment中,因為定時器中的函數(shù)一直保持著對i的引用,所以外層立即執(zhí)行函數(shù)創(chuàng)建的作用域并不會在每一次循環(huán)完成后立即釋放,最終打印出0,1,2,3,4。

而把var換成let的方式,原理其實是一樣的。

基本數(shù)據(jù)類型

undefined,null,String,Number,Boolean,Symbol,Object。

除了?Object?以外,所有類型都定義了表示在語言最低層面的不可變值。我們將這些值稱為原始值。除了?null?和?undefined,所有原始類型都有它們相應(yīng)的對象包裝類型,這為處理原始值提供可用的方法。

數(shù)組扁平化、去重

會修改原數(shù)組內(nèi)容的一些操作

splice,sort,reverse,push,unshifit,pop,shift,fill,如果不想改變原數(shù)組,可使用toReversed,toSorted,toSpliced。

Promise

pending為初始狀態(tài),fulfilled為已兌現(xiàn),rejected為已拒絕。只有reslove和reject方法可以改變Promise狀態(tài)。then,any,race,all,allSettled,catch,finally都會返回一個新的Promise。

Promise本質(zhì)上是提供了一個可以控制回調(diào)函數(shù)執(zhí)行時機的控制器。

我們實現(xiàn)一個最簡單的Promise(只考慮resolve在異步程序中執(zhí)行的情況)

Generator函數(shù)

Generator函數(shù)會生成一個Generator對象,并且它符合可迭代協(xié)議和迭代器協(xié)議。

迭代器和迭代器協(xié)議。對象必須部署Symbol.iterator方法,且部署方法需滿足返回一個帶了next方法的對象,調(diào)用next方法,返回一個包含了done屬性的對象,在使用迭代語句進行迭代時,首先從Symbol.iterator獲取到迭代器,然后再不斷調(diào)用迭代器知道done為true為止。

Generator對象符合可迭代協(xié)議和迭代器協(xié)議,所以它可以被for...of等迭代語句迭代。

而Generator函數(shù)最重要的其實就是可以控制函數(shù)的執(zhí)行流程。

其實就是根據(jù)yield關(guān)鍵字將函數(shù)分片執(zhí)行。

Generator函數(shù)與Promise結(jié)合起來,非常容易實現(xiàn)異步流程自動化執(zhí)行。

稍加改造,我們可以獲得一個自動執(zhí)行器,基本類似于async/await

我們有一點需要注意的是yield語句的特性,我們在下面代碼中定義的a,其實和右側(cè)的yield執(zhí)行結(jié)果無關(guān),next方法會返回右側(cè)表達式的執(zhí)行結(jié)果,如果我們想要在之后的語句中使用,不僅需要定義變量保存,而且需要手動傳入。

事件循環(huán)

瀏覽器的主線程以其事件循環(huán)隊列為中心。此代碼渲染?Document?上待更新展示的內(nèi)容,執(zhí)行頁面待運行的 JavaScript 腳本,接收來自輸入設(shè)備的事件,以及分發(fā)事件給需要接收事件的元素。事件循環(huán)負責(zé)執(zhí)行代碼、收集和處理事件以及執(zhí)行隊列中的子任務(wù)。

任務(wù) vs 微任務(wù)

一個任務(wù)就是指計劃由標(biāo)準(zhǔn)機制來執(zhí)行的任何 JavaScript,如程序的初始化、事件觸發(fā)的回調(diào)等。除了使用事件,還可以使用?setTimeout()?或者?setInterval()?來添加任務(wù)。

任務(wù)隊列和微任務(wù)隊列的區(qū)別很簡單,但卻很重要:

  • 當(dāng)執(zhí)行來自任務(wù)隊列中的任務(wù)時,在每一次新的事件循環(huán)開始迭代的時候運行時都會執(zhí)行隊列中的每個任務(wù)。在每次迭代開始之后加入到隊列中的任務(wù)需要在下一次迭代開始之后才會被執(zhí)行.

  • 每次當(dāng)一個任務(wù)退出且執(zhí)行上下文為空的時候,微任務(wù)隊列中的每一個微任務(wù)會依次被執(zhí)行。不同的是它會等到微任務(wù)隊列為空才會停止執(zhí)行——即使中途有微任務(wù)加入。換句話說,微任務(wù)可以添加新的微任務(wù)到隊列中,并在下一個任務(wù)開始執(zhí)行之前且當(dāng)前事件循環(huán)結(jié)束之前執(zhí)行完所有的微任務(wù)。


JS基礎(chǔ)知識的評論 (共 條)

分享到微博請遵守國家法律
札达县| 深泽县| 天等县| 上虞市| 庆元县| 介休市| 迭部县| 琼结县| 田林县| 于都县| 阜城县| 洛隆县| 江西省| 海口市| 云龙县| 方城县| 莫力| 炉霍县| 玉环县| 昭苏县| 西林县| 苏尼特左旗| 华安县| 平利县| 安吉县| 香格里拉县| 威远县| 天津市| 桑植县| 乐都县| 樟树市| 毕节市| 香河县| 晋江市| 乐业县| 常德市| 墨竹工卡县| 漠河县| 焦作市| 安塞县| 和平区|