前端知识点总结——JS高级(持续更新中)
前端知識(shí)點(diǎn)總結(jié)——JS高級(jí)(持續(xù)更新中)
1.字符串
什么是: 連續(xù)存儲(chǔ)多個(gè)字符的字符數(shù)組
相同: 1. 下標(biāo) 2. .length 3. 遍歷
不同: 類(lèi)型不同 API不通用
API: 所有字符串API都無(wú)權(quán)修改原字符串,總是返回新字符串
統(tǒng)一轉(zhuǎn)大寫(xiě): str=str.toUpperCase()
統(tǒng)一轉(zhuǎn)小寫(xiě): str=str.toLowerCase()
何時(shí): 不區(qū)分大小寫(xiě)時(shí),都需要先轉(zhuǎn)為一致的大小寫(xiě),再比較。
說(shuō)明: 驗(yàn)證碼本不該客戶(hù)端做,應(yīng)該由服務(wù)器端完成
2.獲取指定位置的字符:
str.charAt(i) => str[i]
獲取指定位置字符的unicode號(hào)
str.charCodeAt(i)
3.獲取子字符串:
str.slice(starti,endi+1)
強(qiáng)調(diào): 如果一個(gè)API,兩個(gè)參數(shù)都是下標(biāo),則后一個(gè)參數(shù)+1(含頭不含尾)
str.substring(starti,endi+1) 用法和slice完全一樣
強(qiáng)調(diào): 不支持負(fù)數(shù)參數(shù)
str.subStr(starti,n) 從starti開(kāi)始,取n個(gè)
強(qiáng)調(diào): 第二個(gè)參數(shù)不是下標(biāo),所以,不用考慮含頭不含尾
4.查找: 4種:
var i=str.indexOf("關(guān)鍵詞"[,fromi])
在str中,fromi位置后,找下一個(gè)"關(guān)鍵詞"出現(xiàn)的位置
如果找到,返回關(guān)鍵詞第一個(gè)字的下標(biāo)位置
如果沒(méi)找到,返回-1
說(shuō)明: fromi可省略,默認(rèn)從0開(kāi)始
var i=str.lastIndexOf("關(guān)鍵詞");
在str中,查找"關(guān)鍵詞"最后出現(xiàn)的位置
問(wèn)題: 只能查找一個(gè)固定的關(guān)鍵詞
臥我草/操/艸/槽
微 信 w x wei xin
解決: 用正則查找:
判斷是否包含關(guān)鍵詞:
var i=str.search(/正則/)
返回值: 如果找到,返回關(guān)鍵詞的位置
問(wèn)題: 默認(rèn),所有正則都區(qū)分大小寫(xiě)
解決: 在第二個(gè)/后加i ignore 忽略
問(wèn)題: 只能獲得位置,無(wú)法獲得本次找到的敏感詞的內(nèi)容
獲得關(guān)鍵詞的內(nèi)容:
var arr=str.match(/正則/i);
2種情況:
強(qiáng)調(diào): 如果找不到,返回null
警告: 凡是一個(gè)函數(shù)可能返回null!都要先判斷不是null,才能用!問(wèn)題: 只能獲得關(guān)鍵詞內(nèi)容,無(wú)法獲得位置
reg.exec()
5.替換:
什么是: 將找到的關(guān)鍵詞替換為指定的內(nèi)容
如何: 2種:
str=str.replace(/正則/,"替換值")
高級(jí)替換: 根據(jù)每個(gè)敏感詞的不同,分別替換不同的值
str=str.replace(/正則/,function(kw){
})
衍生: 刪除關(guān)鍵詞:
str=str.replace(/正則/,"")
6.正則表達(dá)式: Regular Expression
什么是: 描述一個(gè)字符串中字符出現(xiàn)規(guī)律的規(guī)則的表達(dá)式
何時(shí): 2種:
如何: 正則表達(dá)式語(yǔ)法:
7.字符集:
什么是: 規(guī)定一位字符,備選字符列表的集合
何時(shí): 只要一位字符,有多種備選字時(shí)
如何: [備選字符列表]
強(qiáng)調(diào): 一個(gè)[]只能匹配一位字符
簡(jiǎn)寫(xiě): 如果備選字符列表中部分字符連續(xù)
反選: 1 除了4和7都行
8.預(yù)定義字符集: 4種:
d 一位數(shù)字 [0-9]
w 一位數(shù)字,字母或下劃線(xiàn) [0-9A-Za-z_]
強(qiáng)調(diào): 只有100%匹配時(shí),才使用w,如果不允許有_,則使用自定義字符集
s 一位空字符,比如: 空格,Tab,...
. 通配符
問(wèn)題: 字符集只能規(guī)定字符的內(nèi)容,無(wú)法靈活規(guī)定字符的個(gè)數(shù)
9.量詞:
什么是: 專(zhuān)門(mén)規(guī)定一個(gè)字符集出現(xiàn)次數(shù)的規(guī)則
何時(shí): 只要規(guī)定字符集出現(xiàn)的次數(shù),都用量詞
如何: 字符集量詞
強(qiáng)調(diào): 量詞默認(rèn)只修飾相鄰的前一個(gè)字符集
包括: 2大類(lèi):
10.選擇和分組:
規(guī)則1|規(guī)則2
何時(shí): 只要在兩個(gè)規(guī)則中任選其一匹配
分組: (規(guī)則1規(guī)則2...)
何時(shí): 如果希望一個(gè)量詞同時(shí)修飾多個(gè)規(guī)則時(shí),都要先將多個(gè)規(guī)則分為一組,再用量詞修飾分組。
9位數(shù)字
(+86|0086)?s*1[34578]d{9}
15位數(shù)字 2位數(shù)字 一位數(shù)字或X
可有可無(wú),最多一次 \d{15}(\d{2}[0-9X])? 比如: 電子郵件: 鄙視/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
比如: url:
(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
11.匹配特殊位置: 3個(gè):
字符串結(jié)尾: $
比如: 開(kāi)頭的空字符: ^s+
3.單詞邊界: b 包括開(kāi)頭,結(jié)尾,空字符,標(biāo)點(diǎn)符號(hào)
比如: 單詞首字母: \b[a-z] 匹配單詞: \bxxx\b12.String:
替換: 2種: 如果關(guān)鍵詞是固定的:
str=str.replace("關(guān)鍵詞","替換值");
如果關(guān)鍵詞變化
str=str.replace(/正則/ig,"替換值");
切割: 2種: 如果分隔符是固定的:
var substrs=str.split("分隔符")
如果分隔符不是固定的
var substrs=str.split(/正則/i)
固定套路: 將字符串打散為字符數(shù)組
13.RegExp:
什么是: 保存一條正則表達(dá)式,并提供用正則表達(dá)式執(zhí)行驗(yàn)證和查找的API
何時(shí): 只要用正則查找關(guān)鍵詞或驗(yàn)證字符串格式時(shí)
如何:
創(chuàng)建: 2種:
何時(shí): 只要正則表達(dá)式的規(guī)則是固定不變的。
問(wèn)題: 正則表達(dá)式時(shí)固定不變的,不支持動(dòng)態(tài)生成
何時(shí): 只要需要?jiǎng)討B(tài)生成正則表達(dá)式
API: 2個(gè):
問(wèn)題: 默認(rèn),只要找到匹配的內(nèi)容,就返回true,不要求完整匹配!
解決: 今后,凡是驗(yàn)證必須前加^,后加$
var arr=reg.exec(str)
在str中查找下一個(gè)關(guān)鍵詞的位置和內(nèi)容
返回值: arr:[ 0: 內(nèi)容, index: 位置 ]
如果找不到,返回null
如果找所有: 只要用while反復(fù)調(diào)用reg.exec即可,exec可自動(dòng)跳到下一個(gè)查找位置
14.Math
什么是: 保存數(shù)學(xué)計(jì)算的常量和API的對(duì)象
何時(shí): 進(jìn)行算術(shù)計(jì)算
如何:
創(chuàng)建: 不用創(chuàng)建,所有API都用Math直接調(diào)用
API:
上取整: Math.ceil(num)
下取整:
Math.floor(num)
parseInt(str) 去掉字符串結(jié)尾非數(shù)字字符(單位)
四舍五入取整:
Math.round(num)
優(yōu): 返回?cái)?shù)字類(lèi)型,可直接計(jì)算
缺: 不能隨意指定小數(shù)位數(shù)
n.toFixed(d)
優(yōu): 可隨意指定小數(shù)位數(shù)
缺: 返回字符串類(lèi)型,不能直接做加法
自定義round
Math.pow(底數(shù),冪)
Math.sqrt(num)
Math.max(值1, 值2,...)
Math.min(值1, 值2,...)
問(wèn)題: 不支持?jǐn)?shù)組
解決: Math.max(...arr)
Math.random() 0~1 隨機(jī)小數(shù)
公式: 在min到max之間取一個(gè)隨機(jī)整數(shù)
parseInt(Math.random()*(max-min+1)+min)
簡(jiǎn)寫(xiě): 在0~max之間取一個(gè)隨機(jī)整數(shù)
parseInt(Math.random()*(max+1))
三角函數(shù):
已知角度,求邊長(zhǎng),用三角函數(shù): sin cos tan
已知邊長(zhǎng),求角度,用反三角函數(shù): asin acos atan
僅以atan:
var 弧度=Math.atan(對(duì)邊長(zhǎng)/鄰邊長(zhǎng))
問(wèn)題: atan無(wú)法區(qū)分角度的象限
解決: Math.atan2(對(duì)邊長(zhǎng), 鄰邊長(zhǎng));
15.Date:
什么是: 保存一個(gè)時(shí)間,提供操作時(shí)間的API
何時(shí): 只要在程序中存儲(chǔ)時(shí)間或操作時(shí)間,都用date
如何:
創(chuàng)建: 4種:
var now=new Date();
var now=new Date("yyyy/MM/dd hh:mm:ss");
var date=new Date(ms)
問(wèn)題: 日期的計(jì)算都是直接修改原日期對(duì)象
解決: 如果希望同時(shí)保留計(jì)算前后的開(kāi)始和結(jié)束時(shí)間,都要先復(fù)制開(kāi)始時(shí)間,再用副本計(jì)算結(jié)束時(shí)間
var date2=new Date(date1)
本質(zhì): 起始日期對(duì)象內(nèi)部保存的是一個(gè)巨大的毫秒數(shù):
1970年1月1日至今的毫秒數(shù)文字存儲(chǔ)日期的問(wèn)題:
1. 有時(shí)區(qū)問(wèn)題: 2. 不便于計(jì)算:毫秒數(shù)存儲(chǔ)日期:
1. 不受時(shí)區(qū)的干擾: 2. 便于計(jì)算:總結(jié): 將來(lái)在網(wǎng)絡(luò)中傳輸或在數(shù)據(jù)庫(kù)中存儲(chǔ)時(shí)間,都用毫秒數(shù)
16.API:
FullYear Month Date Day
Hours Minutes Seconds Milliseconds
getXXX() 負(fù)責(zé)獲得單位的值
setXXX() 負(fù)責(zé)修改單位的值
特例: Day 不能修改,沒(méi)有setDay()
Month: 0~11 計(jì)算機(jī)中的月份總是比現(xiàn)實(shí)中小1
Date: 1~31
Day: 0~6
Hours: 0~23
Minutes/Seconds: 0~59
日期計(jì)算:
何時(shí): 計(jì)算時(shí)間段或計(jì)算倒計(jì)時(shí)
對(duì)任意單位做加減: 3步:
setXXX()可自動(dòng)調(diào)整時(shí)間進(jìn)制
可簡(jiǎn)化為: date.setXXX(date.getXXX()+n)
問(wèn)題: setXXX()直接修改原日期
解決: 如果同時(shí)保存計(jì)算前后的開(kāi)始和結(jié)束時(shí)間,應(yīng)該先復(fù)制副本,再用副本計(jì)算。
17.Date:
日期格式化:
date.toString() 默認(rèn)當(dāng)?shù)貢r(shí)間的完整版格式
date.toLocaleString() 轉(zhuǎn)為當(dāng)?shù)貢r(shí)間的簡(jiǎn)化版格式
date.toLocaleDateString() 僅保留日期部分
date.toLocaleTimeString() 僅保留時(shí)間部分
18.Error:
什么是錯(cuò)誤: 程序執(zhí)行過(guò)程中,遇到的無(wú)法繼續(xù)執(zhí)行的異常情況
程序出錯(cuò),都會(huì)強(qiáng)行中斷退出。
什么是錯(cuò)誤處理: 即使程序出錯(cuò)!也保證不會(huì)中斷退出
何時(shí): 如果希望程序,即使出錯(cuò),也不會(huì)強(qiáng)行中斷退出
如何:
try{
可能出錯(cuò)的正常代碼
}catch(err){
//err: 錯(cuò)誤對(duì)象, 自動(dòng)保存了錯(cuò)誤的信息
只有出錯(cuò)才執(zhí)行的錯(cuò)誤處理代碼:
提示錯(cuò)誤信息, 記錄日志, 釋放資源
}
問(wèn)題: 效率略低
解決: 多數(shù)try catch,都能用if...else代替
主動(dòng)拋出錯(cuò)誤:
throw new Error("錯(cuò)誤信息")
鄙視: js中共有幾種錯(cuò)誤類(lèi)型: 6種:
SyntaxError 語(yǔ)法錯(cuò)誤
ReferenceError 引用錯(cuò)誤
TypeError 類(lèi)型錯(cuò)誤
RangeError 范圍錯(cuò)誤 參數(shù)超范圍
EvalError URIError
19.Function:
什么是函數(shù): 保存一段代碼段的對(duì)象,再起一個(gè)名字。
為什么: 代碼重用
何時(shí): 只要一段代碼可能被重復(fù)使用時(shí)!
如何:
創(chuàng)建: 3種:
聲明: function 函數(shù)名(參數(shù)列表){
函數(shù)體;return 返回值;}參數(shù): 調(diào)用函數(shù)時(shí),接收傳入函數(shù)的數(shù)據(jù)的變量
何時(shí): 如果函數(shù)自身必須某些數(shù)據(jù)才能正常執(zhí)行時(shí),就必須定義參數(shù),從外部接收必須的數(shù)據(jù)
返回值: 函數(shù)的執(zhí)行結(jié)果
何時(shí): 如果調(diào)用者需要獲得函數(shù)的執(zhí)行結(jié)果時(shí)
調(diào)用: var 返回值=函數(shù)名(參數(shù)值列表);
問(wèn)題: 聲明提前: 在程序開(kāi)始執(zhí)行前,先將var聲明的變量和function聲明的函數(shù),提前到當(dāng)前作用域的頂部集中創(chuàng)建。賦值留在原地。
解決:
直接量: var 函數(shù)名=function (參數(shù)列表){
特點(diǎn): 不會(huì)被聲明提前
揭示: 函數(shù)名其實(shí)只是一個(gè)變量
var 函數(shù)名=
new Function("參數(shù)1","參數(shù)2",...,"函數(shù)體")
20.重載overload:
什么是: 多個(gè)相同函數(shù)名,不同參數(shù)列表的函數(shù),在調(diào)用時(shí),可根據(jù)傳入的參數(shù)不同,自動(dòng)執(zhí)行不同的操作。
為什么: 為了減少API的數(shù)量,減輕調(diào)用者的負(fù)擔(dān)
何時(shí): 只要一項(xiàng)任務(wù),可能根據(jù)傳入?yún)?shù)的不同,執(zhí)行不同的流程時(shí)。
如何: js語(yǔ)法默認(rèn)不支持重載!
21.匿名函數(shù):
什么是: 定義函數(shù)時(shí),不指定函數(shù)名
為什么: 節(jié)約內(nèi)存 或 劃分臨時(shí)作用域
何時(shí):
如何:
何時(shí): 今后所有js代碼必須都放在匿名函數(shù)自調(diào)中,避免全局污染。
22.垃圾回收:
什么是垃圾: 一個(gè)不再被任何變量使用的對(duì)象
什么是垃圾回收: js引擎會(huì)自動(dòng)回收不再被使用的對(duì)象的空間。
為什么: 內(nèi)存空間都是有限的!
垃圾回收器: 專(zhuān)門(mén)負(fù)責(zé)回收垃圾對(duì)象的小程序——js引擎自帶
如何:
好的習(xí)慣: 只要一個(gè)對(duì)象不再使用,就要賦值為null
23.作用域和作用域鏈
作用域(scope): 一個(gè)變量的可用范圍
為什么: 避免內(nèi)部的變量影響外部
本質(zhì): 是一個(gè)存儲(chǔ)變量的對(duì)象
包括: 2種:
保存全局變量: 隨處可用,可反復(fù)使用
保存局部變量: 僅在函數(shù)內(nèi)可用,且不可重用!
24.函數(shù)生命周期:
程序開(kāi)始執(zhí)行前
在內(nèi)存中創(chuàng)建執(zhí)行環(huán)境棧(數(shù)組): 用于保存正在調(diào)用的函數(shù)任務(wù)。
在執(zhí)行環(huán)境站中添加第一條記錄: 調(diào)用瀏覽器主程序
創(chuàng)建全局作用域?qū)ο體indow: 2個(gè)作用:
在window中定義函數(shù)名變量
創(chuàng)建函數(shù)對(duì)象保存函數(shù)定義
函數(shù)名變量引用函數(shù)對(duì)象
函數(shù)對(duì)象的scope屬性,又指回了函數(shù)創(chuàng)建時(shí)的作用域
在執(zhí)行環(huán)境棧中添加了本次函數(shù)調(diào)用的記錄
創(chuàng)建本次函數(shù)調(diào)用的函數(shù)作用域?qū)ο驛O
在AO中添加函數(shù)的局部變量
設(shè)置AO的parent指向函數(shù)的scope
執(zhí)行環(huán)境棧中的函數(shù)調(diào)用記錄,引用AO
變量的使用順序: 先用局部,再用全局
本次函數(shù)調(diào)用的記錄從執(zhí)行環(huán)境棧中出棧
導(dǎo)致AO被釋放, 導(dǎo)致所有局部變量都釋放
25.作用域鏈:
什么是: 由多級(jí)作用域?qū)ο?#xff0c;逐級(jí)引用形成的鏈?zhǔn)浇Y(jié)構(gòu)
2個(gè)作用:
26.閉包c(diǎn)losure:
什么是: 即重用一個(gè)變量,又保護(hù)變量不被污染的一種機(jī)制
為什么: 全局變量和局部變量都具有不可兼得的優(yōu)缺點(diǎn):
全局變量: 優(yōu): 可重用, 缺: 易被污染
局部變量: 優(yōu): 僅函數(shù)內(nèi)可用,不會(huì)被污染
何時(shí): 只要一個(gè)變量,可能被重用,又不想被篡改
如何: 3步:
閉包形成的原因: 外層函數(shù)調(diào)用后,外層函數(shù)的函數(shù)作用域?qū)ο鬅o(wú)法釋放
主動(dòng)使用閉包: 為一個(gè)函數(shù)綁定一個(gè)專(zhuān)屬的變量
鄙視: 畫(huà)簡(jiǎn)圖
找內(nèi)層函數(shù)對(duì)象
外層函數(shù)向外返回內(nèi)層函數(shù)對(duì)象: 3種:
27.OOP
什么是對(duì)象: 內(nèi)存中存儲(chǔ)多個(gè)數(shù)據(jù)的獨(dú)立存儲(chǔ)空間都稱(chēng)為一個(gè)對(duì)象。
什么是面向?qū)ο? 程序中都是用對(duì)象結(jié)構(gòu)來(lái)描述現(xiàn)實(shí)中一個(gè)具體事物。
為什么: 為了便于大量數(shù)據(jù)的維護(hù)和查找
何時(shí): 幾乎所有js程序,都使用面向?qū)ο蟮姆绞介_(kāi)發(fā)
如何: 三大特點(diǎn): 封裝,繼承,多態(tài)
封裝: 用對(duì)象來(lái)集中描述現(xiàn)實(shí)中一個(gè)具體事物的屬性和功能
為什么: 便于維護(hù)和查找
何時(shí): 今后只要使用面向?qū)ο蟮姆绞介_(kāi)發(fā),都要先封裝對(duì)象,再按需使用對(duì)象的屬性和功能。
如何: 3種:
用{}:
var obj={
屬性名:值,
//方法名:function(){...},
方法名 (){...},
}
其中: 事物的屬性值會(huì)成為對(duì)象的屬性
如何訪問(wèn)對(duì)象的成員:
訪問(wèn)對(duì)象的屬性: 對(duì)象.屬性名
調(diào)用對(duì)象的方法: 對(duì)象.方法名()
問(wèn)題: 對(duì)象自己的方法中要使用對(duì)象自己的屬性
錯(cuò)誤: 直接用屬性名,報(bào)錯(cuò): 找不到變量
解決一: 對(duì)象名.屬性名
問(wèn)題: 對(duì)象名僅是一個(gè)普通的變量名,可能發(fā)生變化。正確解決: this.屬性名
this: 自動(dòng)指正在調(diào)用當(dāng)前方法的.前的對(duì)象
js中對(duì)象的本質(zhì),其實(shí)就是一個(gè)關(guān)聯(lián)數(shù)組
var obj=new Object(); //創(chuàng)建空對(duì)象 等效于{}
obj.屬性名=值;
obj.方法名=function(){
... this.屬性名 ...
}
和關(guān)聯(lián)數(shù)組一樣,js中的對(duì)象也可隨時(shí)添加新屬性和方法。
問(wèn)題: 反復(fù)創(chuàng)建多個(gè)相同結(jié)構(gòu)的對(duì)象時(shí),重復(fù)代碼太多,導(dǎo)致不便于維護(hù)
解決:
用構(gòu)造函數(shù):
構(gòu)造函數(shù): 描述一類(lèi)對(duì)象統(tǒng)一結(jié)構(gòu)的函數(shù)
為什么: 為了重用結(jié)構(gòu)代碼!
何時(shí): 只要反復(fù)創(chuàng)建相同結(jié)構(gòu)的多個(gè)對(duì)象時(shí),都用構(gòu)造函數(shù)
如何: 2步:
定義構(gòu)造函數(shù)
function 類(lèi)型名(屬性參數(shù)列表){
this.屬性名=屬性參數(shù);
this. ... = 屬性參數(shù);
this.方法名=function(){
}
}
調(diào)用構(gòu)造函數(shù)創(chuàng)建新對(duì)象
var obj=new 類(lèi)型名(屬性值列表)
new: 1. 創(chuàng)建新的空對(duì)象
問(wèn)題: 構(gòu)造函數(shù)只能重用代碼,無(wú)法節(jié)約內(nèi)存!
解決: 繼承:
28.繼承:
什么是: 父對(duì)象的成員,子對(duì)象無(wú)需創(chuàng)建,就可直接使用
為什么: 代碼重用,節(jié)約內(nèi)存
何時(shí): 只要多個(gè)子對(duì)象,擁有相同的成員時(shí),都應(yīng)只在父對(duì)象中定義一份,所有子對(duì)象共用即可!
如何: js中繼承都是通過(guò)原型對(duì)象實(shí)現(xiàn)的
自有屬性和共有屬性:
自有屬性: 保存在當(dāng)前對(duì)象本地,僅歸當(dāng)前對(duì)象獨(dú)有的屬性
共有屬性: 保存在父對(duì)象中,所有子對(duì)象共有的屬性
讀取屬性值: 子對(duì)象.屬性
修改屬性值: 自有屬性,必須通過(guò)子對(duì)象自己修改
內(nèi)置對(duì)象的原型對(duì)象:
鄙視: 內(nèi)置對(duì)象: 11個(gè):
鄙視: 包裝類(lèi)型的理解
什么是: 保存一個(gè)原始類(lèi)型的值,并提供操作原始類(lèi)型值的API 為什么: 原始類(lèi)型的值本身不具有任何功能 何時(shí): 只要試圖對(duì)原始類(lèi)型的值調(diào)用API時(shí),都會(huì)自動(dòng)使用包裝類(lèi)型對(duì)象來(lái)幫助原始類(lèi)型的值執(zhí)行操作。 如何: 1. 內(nèi)存中已經(jīng)預(yù)置了三大包裝類(lèi)型的對(duì)象:String Number Boolean2. 在試圖對(duì)原始類(lèi)型的值調(diào)用API時(shí),自動(dòng)檢測(cè)原始類(lèi)型的值的類(lèi)型名var n=345.678;typeof n => number3. 根據(jù)類(lèi)型名實(shí)例化對(duì)應(yīng)的包裝類(lèi)型對(duì)象,調(diào)用其APInew Number(n).toFixed(2) => 345.684. 執(zhí)行后,包裝類(lèi)型對(duì)象自動(dòng)釋放new Number釋放!29.OOP
面向?qū)ο笕筇攸c(diǎn): 封裝,繼承,多態(tài)
繼承:
原型對(duì)象:
內(nèi)置類(lèi)型的原型對(duì)象:
一種類(lèi)型: 包含兩部分:
解決瀏覽器兼容性問(wèn)題: 舊瀏覽器無(wú)法使用新API
1. 判斷當(dāng)前瀏覽器對(duì)應(yīng)類(lèi)型的原型對(duì)象中是否包含該API 2. 如果不包含,則自定義該API,添加到對(duì)應(yīng)類(lèi)型的原型對(duì)象中30.原型鏈:
什么是: 由多級(jí)父對(duì)象,逐級(jí)繼承形成的鏈?zhǔn)浇Y(jié)構(gòu)
保存著: 所有對(duì)象的屬性
控制著: 對(duì)象屬性的使用順序:
鄙視: 如何判斷一個(gè)對(duì)象是數(shù)組類(lèi)型? 有幾種方法
錯(cuò)誤: typeof : 只能區(qū)分原始類(lèi)型,函數(shù),無(wú)法進(jìn)一步區(qū)分引用類(lèi)型對(duì)象的具體類(lèi)型名
正確: 4種:
obj.__proto__==Array.prototype
Array.prototype.isPrototypeOf(obj)
obj.constructor==Array
obj instanceof Array
問(wèn)題: 不嚴(yán)格, 不但檢查直接父對(duì)象,且檢查整個(gè)原型鏈
class屬性: 對(duì)象內(nèi)部的專(zhuān)門(mén)記錄對(duì)象創(chuàng)建時(shí)的類(lèi)型名的屬性
問(wèn)題1: class屬性是內(nèi)部屬性,無(wú)法用.直接訪問(wèn)
解決: 唯一的辦法: Object.prototype.toString()
問(wèn)題2: 每種類(lèi)型的原型對(duì)象都重寫(xiě)了各自不同的toString()方法,子對(duì)象無(wú)法調(diào)用到Object.prototype.toString()
解決: fun.call(obj) 讓obj強(qiáng)行調(diào)用任何一個(gè)fun
鄙視: 何時(shí)將方法定義在原型對(duì)象中,何時(shí)將方法定義在構(gòu)造函數(shù)上
實(shí)例方法和靜態(tài)方法:
實(shí)例方法: 必須該類(lèi)型的子對(duì)象才能調(diào)用的方法
比如: arr.sort() arr.push()
何時(shí): 只要要求必須該類(lèi)型的子對(duì)象才能調(diào)用
如何: 所有放在原型對(duì)象中的方法都是實(shí)例方法
靜態(tài)方法: 不需要?jiǎng)?chuàng)建該類(lèi)型的子對(duì)象,任何對(duì)象都可使用的方法。
比如: Array.isArray(fun)
何時(shí): 不確定將來(lái)調(diào)用該函數(shù)的對(duì)象類(lèi)型時(shí)
如何: 添加到構(gòu)造函數(shù)對(duì)象上的方法都是靜態(tài)方法。可通過(guò)構(gòu)造函數(shù).靜態(tài)方法方式直接調(diào)用!
31.多態(tài):
什么是: 一個(gè)方法在不同情況下表現(xiàn)出不同的狀態(tài)
包括:
什么是: 如果子對(duì)象覺(jué)得從父對(duì)象繼承來(lái)的成員不好用,可在本地定義同名的自有成員,覆蓋父對(duì)象的成員
為什么: 覺(jué)得從父對(duì)象繼承來(lái)的成員不好用
何時(shí): 只要覺(jué)得從父對(duì)象繼承來(lái)的成員不好用
如何: 在本地定義同名的自有成員
32.自定義繼承:
obj.__proto__=father
Object.setPrototypeOf(obj,father)
構(gòu)造函數(shù).prototype=father
時(shí)機(jī): 在創(chuàng)建子對(duì)象之前換!
兩種類(lèi)型間的繼承:
何時(shí): 發(fā)現(xiàn)多個(gè)類(lèi)型之間擁有部分相同的屬性結(jié)構(gòu)和方法定義時(shí),都要抽象父類(lèi)型出來(lái)
如何: 2步:
定義抽象父類(lèi)型: 2步:
讓子類(lèi)型繼承父類(lèi)型: 2步:
錯(cuò)誤: 直接調(diào)用: Flyer(fname,speed)
原因: Flyer不用.不用new調(diào)用,其中的this默認(rèn)指window,Flyer中所有屬性泄露到全局
正確: 用call將正確的this注入到Flyer中,代替錯(cuò)誤的this
如何: Flyer.call(正確的this, fname,speed)
Object.setPrototypeOf(子類(lèi)型原型,父類(lèi)型原型)
33.ECMAScript6
嚴(yán)格模式:
什么是: 比普通js運(yùn)行機(jī)制要求更嚴(yán)格的模式
為什么: 普通的js運(yùn)行機(jī)制有很多廣受詬病的缺陷
何時(shí): 今后所有項(xiàng)目必須運(yùn)行在嚴(yán)格模式下
如何:
規(guī)則: 4個(gè):
補(bǔ): arguments.callee 自動(dòng)獲得當(dāng)前正在調(diào)用的函數(shù)本身
禁用,說(shuō)明強(qiáng)烈不推薦使用遞歸!
34.保護(hù)對(duì)象:
保護(hù)對(duì)象的屬性:
ES5將對(duì)象屬性分為:
命名屬性: 可用.直接訪問(wèn)到的屬性
數(shù)據(jù)屬性: 直接存儲(chǔ)屬性值的屬性
保護(hù)數(shù)據(jù)屬性: 4大特性:
訪問(wèn)器屬性: 不直接存儲(chǔ)屬性值,僅提供對(duì)另一個(gè)數(shù)據(jù)屬性的保護(hù)
何時(shí): 只要對(duì)一個(gè)屬性提供自定義規(guī)則的保護(hù)
如何:
如何使用: 同普通的數(shù)據(jù)屬性用法一樣!
在取值時(shí),自動(dòng)調(diào)用訪問(wèn)器屬性?xún)?nèi)部的get在賦值時(shí),自動(dòng)調(diào)用訪問(wèn)器屬性?xún)?nèi)部的set方法,同時(shí)將等號(hào)右邊的新值,交給val參數(shù)問(wèn)題: enumerable只能防住for in,防不住.,依然可用.直接修改被保護(hù)的數(shù)據(jù)屬性
解決:
內(nèi)部屬性: 不能用.直接訪問(wèn)到的屬性
比如: class proto
保護(hù)對(duì)象的結(jié)構(gòu): 3種
防擴(kuò)展: 禁止給對(duì)象添加新屬性
Object.preventExtensions(obj)
原理: 內(nèi)部屬性: extensible:true
密封: 在防擴(kuò)展同時(shí),禁止刪除現(xiàn)有屬性
Object.seal(obj)
原理: 1. 將extensible改為false,禁止擴(kuò)展
凍結(jié): 在密封的同時(shí),禁止修改一切屬性值
Object.freeze(obj)
原理: 1. 兼具密封的所有功能
Object.create()
僅用父對(duì)象,就可創(chuàng)建子對(duì)象,
同時(shí)還可為子對(duì)象擴(kuò)展自有屬性
var child=Object.create(father,{
//Object.defineProperties
屬性名:{
}
})
鄙視: 描述Object.create的執(zhí)行原理
35.call/apply/bind
替換函數(shù)中不想要的this!
call/apply: 立刻調(diào)用函數(shù),并臨時(shí)替換中的this為指定對(duì)象
何時(shí): 只要調(diào)用函數(shù)時(shí),函數(shù)中的this不是想要的就用call換成想要的
如果傳入函數(shù)的參數(shù),是以數(shù)組形式,整體傳入
就用.apply(obj,arr)
bind: 基于原函數(shù),創(chuàng)建一個(gè)新函數(shù),并永久綁定this為指定對(duì)象
何時(shí): 不會(huì)立刻調(diào)用的函數(shù)(回調(diào)函數(shù))中的this,不是想要的,就可用bind創(chuàng)建一個(gè)新函數(shù),并永久綁定this!
36.數(shù)組API:
判斷:
判斷數(shù)組中所有元素是否都符合條件
arr.every(function(elem,i,arr){
})
判斷數(shù)組中是否包含符合條件的元素
arr.some(function(elem,i,arr){
})
遍歷:
arr.forEach(function(elem,i,arr){
arr[i]=新值
})
arr.map(function(elem,i,arr){
return 新值
})
過(guò)濾和匯總:
var subs=arr.filter(function(elem,i,arr){
return 判斷條件
})
var result=arr.reduce(function(prev,elem,i,arr){
//prev: 截止到目前,之前的臨時(shí)匯總值
return prev+elem;
})
37.let: 代替var
為什么
問(wèn)題1: 聲明提前, 破壞程序原有執(zhí)行順序
解決: let禁止在聲明之前,提前使用該變量
問(wèn)題2: js沒(méi)有塊級(jí)作用域, 塊內(nèi)的變量,會(huì)污染到塊外
解決: let會(huì)將當(dāng)前所在if/for/while...(){}變成塊級(jí)作用域
原理: 其實(shí)let就是匿名函數(shù)自調(diào)!
let與for循環(huán),可形成閉包的效果
強(qiáng)調(diào): 原來(lái)塊內(nèi)外都可使用的變量,出了塊,就不能用了!
38.參數(shù)增強(qiáng):
默認(rèn)值: function fun(參數(shù)1, 參數(shù)2,...,參數(shù)n=默認(rèn)值)
強(qiáng)調(diào): 帶默認(rèn)值的參數(shù)必須定義在列表末尾
原理: 參數(shù)n=參數(shù)n||默認(rèn)值;
rest: 代替了arguments
何時(shí): 當(dāng)函數(shù),不確定參數(shù)個(gè)數(shù)時(shí)——重載
為什么: arguments的缺點(diǎn):
如何: 定義函數(shù)時(shí): function fun(參數(shù)1,參數(shù)2,..., ...數(shù)組名)
數(shù)組名, 是一個(gè)純正的數(shù)組,且可有選擇的分段獲取
原理: var arr=[].slice.call(arguments[,starti]);//將類(lèi)數(shù)組對(duì)象轉(zhuǎn)為數(shù)組
spread: 代替apply
為什么: apply雖然可打散數(shù)組類(lèi)型參數(shù)為單個(gè)值,但是必須和替換this的操作捆綁使用
何時(shí): 只要僅需要打散數(shù)組類(lèi)型參數(shù)為單個(gè)值時(shí)
如何: 調(diào)用時(shí): fun(參數(shù)值1,參數(shù)值2,...數(shù)組)
何時(shí): 只要回調(diào)函數(shù),都不再使用function,而是使用箭頭函數(shù)
如何:
如果函數(shù)體只有一句話(huà),則{}可省略
更簡(jiǎn)化: 如果僅有的一句話(huà)還是return,可省略return特點(diǎn): 內(nèi)外共用同一個(gè)this ——代替bind
問(wèn)題: 如果反而希望內(nèi)外this不通用時(shí),就不能用箭頭函數(shù)
40.模板字符串: 代替+號(hào)拼接字符串
ESLint規(guī)定,不允許使用+拼接字符串
如何:
模板內(nèi),可用${...}嵌入任何合法的js變量或語(yǔ)句
41.解構(gòu): 簡(jiǎn)化批量賦值
什么是: 將一個(gè)對(duì)象/數(shù)組中的成員和元素,分別提取出來(lái),單獨(dú)使用。
為什么: 避免反復(fù)使用對(duì)象名/數(shù)組名
何時(shí): 只要希望將一個(gè)大的對(duì)象或數(shù)組中的每個(gè)成員單獨(dú)取出使用時(shí)
如何: 3種:
定義函數(shù)時(shí):
問(wèn)題: 普通函數(shù)的參數(shù)列表的順序和個(gè)數(shù)是固定的
解決: 使用對(duì)象語(yǔ)法定義參數(shù)列表
優(yōu)點(diǎn): 將來(lái)傳入的參數(shù)個(gè)數(shù),順序與對(duì)象列表無(wú)關(guān)
調(diào)用函數(shù): 也用對(duì)象語(yǔ)法傳入?yún)?shù)
賦值過(guò)程中,采用對(duì)象結(jié)構(gòu)的方式,為參數(shù)變量賦值
42.for...of 在特定情況下,代替for循環(huán)
什么是: 依次遍歷數(shù)組/類(lèi)數(shù)組對(duì)象中每個(gè)元素的值
vs for...in: 依次遍歷關(guān)聯(lián)數(shù)組/對(duì)象中每個(gè)成員的屬性名
何時(shí): 如果希望從頭到尾遍歷整個(gè)數(shù)組或類(lèi)數(shù)組對(duì)象
如何:
局限: 無(wú)法獲得當(dāng)前位置; 無(wú)法控制遍歷的進(jìn)度/順序; 無(wú)法有選擇的遍歷部分
43.class: 代替?zhèn)鹘y(tǒng)的封裝,繼承,多態(tài)的語(yǔ)法
封裝:
class Student {constructor(sname,sage){... ...}intr (){//Student.prototype.intr} fun (){}}繼承:
class Flyer {constructor(fname,speed){... ...}fly (){... ...}}class Plane extends Flyer{constructor(fname,speed,score){//super指向父類(lèi)型構(gòu)造函數(shù),且自動(dòng)替換thissuper(fname,speed)... ...}getScore (){... ...}}靜態(tài)方法:
class User{constructor(uname,upwd){this.uname=uname;this.upwd=upwd;}save(){//保存在User.prototype中的實(shí)例方法console.log("保存當(dāng)前對(duì)象");}static findOne(){//靜態(tài)方法,定義在構(gòu)造函數(shù)上return new User();}}var user=new User(...);user.save();//調(diào)用實(shí)例方法User.findOne();//調(diào)用靜態(tài)方法44.Promise: 解決: 回調(diào)地獄
什么是callback hell: 由于使用參數(shù)傳遞回調(diào)函數(shù),導(dǎo)致步驟多時(shí),參數(shù)的嵌套層級(jí)很深。
何時(shí): 只要異步調(diào)用,可能發(fā)生延遲時(shí),都要用Promise代替?zhèn)鹘y(tǒng)參數(shù)callback
如何: 定義時(shí)
調(diào)用時(shí):
第一件事()//return Promise(fn).then(第二件事)//return Promise(fn).then(第三件事)鄙視題:
將類(lèi)數(shù)組對(duì)象復(fù)制為數(shù)組:
var arr2=Array.prototype.slice.call(arguments)
將類(lèi)數(shù)組對(duì)象復(fù)制為數(shù)組,并選取指定位置的剩余元素
var arr2= Array.prototype.slice.call(arguments,starti)
其實(shí)更簡(jiǎn)單的: var arr2= [].slice.call(arguments,starti)
promise中的錯(cuò)誤處理:
其實(shí): new Promise(可接收2件事)
new Promise((正常函數(shù),出錯(cuò)函數(shù))=>{
如果順利執(zhí)行:調(diào)用正常() 否則調(diào)用出錯(cuò)()})
等待多個(gè)任務(wù)完成
前提: 每個(gè)任務(wù)都必須都返回Promise
如何: Promise.all([
總結(jié)
以上是生活随笔為你收集整理的前端知识点总结——JS高级(持续更新中)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python日志汇总
- 下一篇: 前端做模糊搜索