免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
javascript筆記

day01
am:
前端三大基礎(chǔ)知識(shí):
HTML:專(zhuān)門(mén)編寫(xiě)網(wǎng)頁(yè)內(nèi)容
CSS:專(zhuān)門(mén)設(shè)計(jì)網(wǎng)頁(yè)樣式

JavaScript:專(zhuān)門(mén)設(shè)計(jì)網(wǎng)頁(yè)交互的語(yǔ)言
交互:輸入數(shù)據(jù),程序處理數(shù)據(jù),返回結(jié)果

什么是JavaScript:
1、專(zhuān)門(mén)設(shè)計(jì)網(wǎng)頁(yè)交互的語(yǔ)言
2、運(yùn)行在JavaScript解釋器中
3、“解釋”執(zhí)行——像讀書(shū)一樣
4、互聯(lián)網(wǎng)第一大語(yǔ)言:JSer

布蘭登艾奇:4門(mén)語(yǔ)言拼湊出——JavaScript

ECMAScript標(biāo)準(zhǔn):JavaScript核心語(yǔ)法
微軟:JScript
ECMAScript標(biāo)準(zhǔn):一紙空文
JavaScript和JScript都號(hào)稱(chēng)完全實(shí)現(xiàn)了ECMAScript標(biāo)準(zhǔn)
W3C:DOM標(biāo)準(zhǔn):專(zhuān)門(mén)操作HTML元素,CSS樣式,事件的統(tǒng)一標(biāo)準(zhǔn)!

BOM:專(zhuān)門(mén)操作瀏覽器窗口的工具。
沒(méi)標(biāo)準(zhǔn),由瀏覽器廠商自行實(shí)現(xiàn)

JavaScript=ECMAScript+DOM+BOM

Mozilla基金會(huì)——>Firefox
JSer最大挑戰(zhàn):瀏覽器兼容性問(wèn)題

JavaScript典型用途:
1、客戶端數(shù)據(jù)計(jì)算
2、客戶端表單驗(yàn)證
3、動(dòng)畫(huà)

JavaScript特點(diǎn):純文本;解釋執(zhí)行;弱類(lèi)型;基于對(duì)象
如何讓使用:
1、使用瀏覽器自帶的js解釋器:
F12——>控制臺(tái)
光標(biāo)處寫(xiě)腳本代碼,回車(chē)執(zhí)行。
console:指代控制臺(tái):專(zhuān)門(mén)調(diào)式程序輸出結(jié)果的窗口。
log:控制臺(tái)console提供的一個(gè)功能:向控制臺(tái)輸出一行日志。
多行:shift+enter——>換行
**JavaScript中區(qū)分大小寫(xiě)!**
**字符串單雙引號(hào)都行**
2、單獨(dú)安裝專(zhuān)門(mén)的解釋器軟件:node.js Chrome V8
win+R——>cmd——>node
退出:兩次Ctrl+c
執(zhí)行.js文件:1、先cd到.js文件所在路徑
2、node 文件名 回車(chē)
3、隨網(wǎng)頁(yè)一同運(yùn)行:
瀏覽器 包含兩種工具:
排版引擎:專(zhuān)門(mén)加載HTML內(nèi)容和CSS樣式
解釋引擎:專(zhuān)門(mén)運(yùn)行js腳本
<script>元素:專(zhuān)門(mén)包含js腳本塊的元素
<script>中腳本塊何時(shí)運(yùn)行?隨網(wǎng)頁(yè)加載,解釋執(zhí)行
<script>中都要使用js語(yǔ)法!
html元素的事件“屬性”中:
什么是事件?元素可以根據(jù)鼠標(biāo)或鍵盤(pán)的不同操作相應(yīng)不同的交互行為。
charset必須和文件的存儲(chǔ)編碼一致
<script>解釋執(zhí)行,讀到執(zhí)行。先讀先執(zhí)行?!?lt;script>放置的先后順序影響程序結(jié)
果。
優(yōu)化:放在body的最后

一次定義處處使用,一次修改處處生效!
解決:凡是重復(fù)編寫(xiě)的代碼塊,都要封裝為一個(gè)方法
方法:執(zhí)行一個(gè)專(zhuān)門(mén)功能的一組代碼的序列。
一般定義在<head>下的<script>中
語(yǔ)法:function 方法名(){重用的代碼塊}
*不調(diào)不執(zhí)行*

調(diào)試:bug? debug:解決問(wèn)題,排除錯(cuò)誤
只要沒(méi)反應(yīng)或效果沒(méi)出來(lái)就是出錯(cuò)!——>F12
查看錯(cuò)誤原因——>定位錯(cuò)誤位置!
<script>腳本塊中的錯(cuò)誤,僅影響“當(dāng)前腳本塊”中出錯(cuò)“位置之后”的腳本執(zhí)行。
不影響<script>之外的其他元素加載或腳本執(zhí)行。
function中的錯(cuò)誤:只有調(diào)用方法是才觸發(fā)!

頁(yè)面內(nèi)部腳本塊問(wèn)題:僅當(dāng)前頁(yè)面可用!
解決:外部.js文件!
什么是.js文件:專(zhuān)門(mén)保存js腳本源代碼的文件。
源代碼都要放到j(luò)s解釋器才能執(zhí)行。
如何使用.js文件?2步:1、創(chuàng)建.js文件,編寫(xiě)源代碼 2、在頁(yè)面引入外部.js文件
內(nèi)外部同名方法,解釋執(zhí)行!

pm:
JavaScript=ECMAScript(核心語(yǔ)法)+DOM(操作網(wǎng)頁(yè)內(nèi)容)+BOM(操作瀏覽器
窗口)

ECMAScript(核心語(yǔ)法)
*區(qū)分大小寫(xiě)*
*字符串必須用引號(hào)(單雙都行)包裹*
*每條語(yǔ)句結(jié)尾都建議有分號(hào)*

語(yǔ)句:讓程序可以做一件事的一行命令
腳本塊:多行語(yǔ)句的序列
程序:讓計(jì)算機(jī)可以模擬執(zhí)行人類(lèi)的想法!
注釋?zhuān)翰粫?huì)被解釋執(zhí)行或顯示的代碼說(shuō)明——給程序員看的
注釋也占網(wǎng)頁(yè)流量!生產(chǎn)環(huán)境必須去掉!
HTML注釋?zhuān)?lt;!---->
CSS注釋?zhuān)?**/
JS注釋?zhuān)?/單行注釋 /*多行注釋*/

*變量*
什么是變量??jī)?nèi)存中專(zhuān)門(mén)存儲(chǔ)數(shù)據(jù)的空間
程序都是在內(nèi)存中運(yùn)行
任何程序:IPO:Input Process Output
數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù)
何時(shí)使用變量?只要在程序中臨時(shí)存儲(chǔ)數(shù)據(jù),都要放在變量中
怎么使用變量?聲明,命名,初始化和使用
聲明:在內(nèi)存中開(kāi)辟一個(gè)存儲(chǔ)空間,并且起一個(gè)名字
怎么聲明?var 變量名;
賦值:將等號(hào)右邊的數(shù)據(jù),裝入等號(hào)左邊的變量中!
如果未賦值:js默認(rèn)賦值為undefined

命名規(guī)則:見(jiàn)名知意
保留字、關(guān)鍵字不能當(dāng)變量名
保留字:js中已經(jīng)占用的特殊意義的關(guān)鍵字
使用:使用變量名等于直接使用變量中存儲(chǔ)的數(shù)據(jù)
+:拼接多段文字為一句話!

常量:一旦創(chuàng)建,值不可改變的特殊變量
如何使用常量:const 常量名=常量值;

強(qiáng)調(diào):只有等號(hào)可以向變量中存入新值。普通運(yùn)算不會(huì)改變變量的值。只是使用變量的
值。
只要帶var就是聲明,只要聲明就會(huì)開(kāi)辟內(nèi)存空間、
js中新同名變量的空間會(huì)替換舊的空間。
有幾個(gè)var,就會(huì)創(chuàng)建幾個(gè)存儲(chǔ)空間。

數(shù)據(jù)類(lèi)型:變量中存儲(chǔ)的數(shù)據(jù)類(lèi)型。
js是弱類(lèi)型:變量本身沒(méi)有類(lèi)型。只有變量中的值才有類(lèi)型。
一個(gè)變量,可以反復(fù)保存不同類(lèi)型的數(shù)據(jù)。
為什么要有數(shù)據(jù)類(lèi)型:現(xiàn)實(shí)中所有數(shù)據(jù)根據(jù)用途不同,都分為不同數(shù)據(jù)類(lèi)型。

原始類(lèi)型:數(shù)據(jù)保存在變量本地!
number類(lèi)型:表示一切用于比較或數(shù)學(xué)計(jì)算的數(shù)字
程序中數(shù)字分整數(shù)、浮點(diǎn)數(shù)(現(xiàn)實(shí)中的小數(shù))
js中一切數(shù)字都用number保存,不分整數(shù)類(lèi)型和小數(shù)類(lèi)型
如何定義number類(lèi)型?不帶引號(hào)的數(shù)字字面量
程序中數(shù)字類(lèi)型的舍入誤差:程序中不能準(zhǔn)確表示1/10,就好像現(xiàn)實(shí)中不能準(zhǔn)確表示
1/3一樣!
如何修正:按指定位數(shù)四舍五入:數(shù)字.toFixed(小數(shù)位數(shù))
今后計(jì)算結(jié)果小數(shù)位數(shù)超長(zhǎng),說(shuō)明碰到舍入誤差。按位四舍五入。
精度計(jì)算不要用JavaScript

string類(lèi)型:一串字符的序列!
Unicode:對(duì)所有語(yǔ)言文字中的字符編號(hào)
Why“因?yàn)橛?jì)算機(jī)只處理數(shù)字,無(wú)法處理文字。
計(jì)算機(jī)處理unicode編號(hào),就等效于處理編號(hào)對(duì)應(yīng)的文字。
轉(zhuǎn)義字符:專(zhuān)門(mén)表示非打印字符以及特殊符號(hào)
如何使用轉(zhuǎn)義字符:\特殊符號(hào) 比如:\n 換行 、\t tab鍵
如果字符串中包含與語(yǔ)法相沖突的特殊字符,要用\轉(zhuǎn)為原文

*字符串變量的內(nèi)容一旦創(chuàng)建補(bǔ)課費(fèi)改變!如果改變,只能創(chuàng)建新字符串,拋棄舊字符串
。*
鄙視題!
var str = "Hello";
str = str + “Word”;
3個(gè)!

boolean類(lèi)型:僅有兩個(gè)值的特殊數(shù)據(jù)類(lèi)型:true,false
何時(shí)使用boolean?只要一個(gè)值只有真假兩種情況,就用boolean類(lèi)型

undefined類(lèi)型:表示一個(gè)變量?jī)H聲明過(guò),但從未賦值。所有未賦值的變量,默認(rèn)值都
是undefined。
undefined類(lèi)型的值還是undefined!

原始類(lèi)型的大小:
number:整數(shù)4字節(jié),浮點(diǎn)8字節(jié)
string:每個(gè)字符兩字節(jié)


day02
回顧:
JavaScript:ECMAScript(核心語(yǔ)法)
DOM(操作網(wǎng)頁(yè)內(nèi)容)
BOM(操作瀏覽器窗口)
ECMAScript:標(biāo)準(zhǔn)
Netscapt:javaScript Microsoft:JScript

變量:內(nèi)存中存儲(chǔ)數(shù)據(jù)的一塊空間
一切數(shù)據(jù)必須存在變量中
聲明:var 變量名——>在內(nèi)存中開(kāi)辟一塊空間
賦值:變量名=值——>將值保存到左邊的變量空間中備用
使用:使用變量名,就等效于直接使用變量中的數(shù)據(jù)

數(shù)據(jù)類(lèi)型:
why:存儲(chǔ)空間的大小,用途
原始類(lèi)型:數(shù)據(jù)保存在變量本地
number string boolean undefined null

string:字符串內(nèi)容一旦創(chuàng)建不能改變
var str = "Hello";
str = str + "World";
3個(gè)!

正課:
數(shù)據(jù)類(lèi)型間的轉(zhuǎn)換:
隱式轉(zhuǎn)換:程序自動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型(坑)
弱類(lèi)型:1、變量聲明是不必限定數(shù)據(jù)類(lèi)型,今后可能保存任何數(shù)據(jù)類(lèi)型
2、數(shù)據(jù)類(lèi)型間可以自動(dòng)類(lèi)型轉(zhuǎn)換
僅考慮+:只要有字符串參與,一切類(lèi)型都加""變?yōu)樽址?br> 如果沒(méi)有字符串,都轉(zhuǎn)換為數(shù)字計(jì)算:其中true——>1 false——>0

強(qiáng)制轉(zhuǎn)換:程序員通過(guò)調(diào)用專(zhuān)門(mén)函數(shù),手動(dòng)轉(zhuǎn)換類(lèi)型
2 string:x.toString();——>將x轉(zhuǎn)為字符串類(lèi)型
2 number:Number(x);——>將任意類(lèi)型轉(zhuǎn)為number類(lèi)型
string——>number:
轉(zhuǎn)為整數(shù):var num = parseInt("str");
讀取字符串中的整數(shù)部分
1、從第一個(gè)字符向后讀。
2、如果碰到第一個(gè)數(shù)字字符,開(kāi)始獲取數(shù)字,再次碰到不是數(shù)字的字符,停
止讀取
3、如果開(kāi)頭碰到空格,忽略
4、如果碰到的第一個(gè)非空格字符,不是數(shù)字,說(shuō)明不能轉(zhuǎn)——>NaN: Not
a Number
什么是NaN:不是數(shù)字(內(nèi)容)的數(shù)字(類(lèi)型)
轉(zhuǎn)為浮點(diǎn)數(shù):var num = parseFloat("str");
用法和parseInt全完相同
唯一差別:parseFloat認(rèn)識(shí)小數(shù)點(diǎn)

prompt("提示信息"):專(zhuān)門(mén)用于請(qǐng)求用戶輸入數(shù)據(jù),收集數(shù)據(jù)的對(duì)話框!
var str = prompt("提示信息");
*凡是從頁(yè)面上獲得的數(shù)據(jù),都是字符串!必須先轉(zhuǎn)換再計(jì)算*

什么是運(yùn)算符:程序模擬人類(lèi)運(yùn)算的特殊符號(hào)
算數(shù)運(yùn)算:-任意類(lèi)型做-,都會(huì)被轉(zhuǎn)為數(shù)據(jù)類(lèi)型
如果有參數(shù),不能自動(dòng)轉(zhuǎn)換為數(shù)字,則返回NaN
如果除數(shù)為0:Infinity——>無(wú)窮大
typeof(x):判斷任意數(shù)據(jù)的類(lèi)型
被除數(shù)%除數(shù)——模運(yùn)算:被除數(shù)/除數(shù),取除不盡的余數(shù)
何時(shí)用:限制一個(gè)數(shù)不能超過(guò)某個(gè)最大范圍時(shí)

遞增/遞減運(yùn)算:i++ ==> i = i +1;
i++單獨(dú)用:++放前放后,效果一樣:i++ ==> ++i;
i++出現(xiàn)在表達(dá)式內(nèi)部:
前++,前+1,再參與表達(dá)式
后++,先用舊值參與表達(dá)式。表達(dá)式之后再+1

關(guān)系運(yùn)算:判斷大?。l件判斷中使用
結(jié)果:成立:true,不成立:false
*自帶隱式類(lèi)型轉(zhuǎn)換*
字符串參與運(yùn)算:從第一個(gè)字符開(kāi)始,取出每個(gè)字符 PK unicode編號(hào)
"Hello" H e(101)
"Hi" H i(105)
關(guān)系運(yùn)算中:任何類(lèi)型和數(shù)字比較,都轉(zhuǎn)為數(shù)字,再比較
布爾類(lèi)型參與關(guān)系運(yùn)算,始終轉(zhuǎn)為數(shù)字比較

PM:
關(guān)系運(yùn)算:現(xiàn)將參與判斷的數(shù)據(jù),強(qiáng)轉(zhuǎn)為相同類(lèi)型,再比較
字符串比較:
undefined做==比較:
undefined類(lèi)型,從null類(lèi)型繼承來(lái)的
undefined值被自動(dòng)轉(zhuǎn)換為null!
undefined == null ——>true
===嚴(yán)格相等:不帶自動(dòng)類(lèi)型轉(zhuǎn)換的相等比較!
類(lèi)型和值必須都相等!才返回true。
嚴(yán)格相等最初就是為undefined和null設(shè)計(jì)的
只要不確定比較的類(lèi)型,又不希望自動(dòng)類(lèi)型轉(zhuǎn)換時(shí),就用===

NaN做==:
isNaN(x):專(zhuān)門(mén)用來(lái)判斷一個(gè)數(shù)據(jù)是不是NaN
如果是NaN返回true;如果不是NaN返回false

只要不能轉(zhuǎn)換為數(shù)字的,都返回true
只要能自動(dòng)轉(zhuǎn)換為數(shù)字的,都返回false
關(guān)系運(yùn)算中"",可以自動(dòng)轉(zhuǎn)換為false或0
總結(jié):1、普通數(shù)據(jù),先轉(zhuǎn)換為相同類(lèi)型,再比較
2、undefined,就用===
3、NaN,就用isNaN(x)

邏輯運(yùn)算:基于多組關(guān)系運(yùn)算,得出一個(gè)結(jié)論
&&:而且
||:或者
?。悍?,顛倒true和false,今后只要顛倒判斷結(jié)果,就用!

短路邏輯:只要前一個(gè)判斷足以得出最終結(jié)論,則后續(xù)條件不執(zhí)行!

驗(yàn)證是不是漢字:>="\u4E00" && <="\u9FA5"
閏年的判斷公式:(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)

位移:n << m ——>n*(2的m次方)
n >> m ——>n/(2的m次方)

賦值運(yùn)算:賦值運(yùn)算結(jié)果就是等號(hào)右邊表達(dá)式的結(jié)果
擴(kuò)展的賦值表達(dá)式:對(duì)已有的數(shù)據(jù)計(jì)算的同時(shí),將結(jié)果再存回變量
何時(shí)使用:修改原變量值

三目運(yùn)算:根據(jù)不同條件,動(dòng)態(tài)返回不同結(jié)果!
三目:至少需要3個(gè)表達(dá)式。
語(yǔ)法:
一個(gè)條件,二選一:條件?當(dāng)條件滿足時(shí)返回的值:當(dāng)條件不滿足時(shí)返回的值
多個(gè)條件,多選一:
條件1?條件1滿足時(shí)的值:
條件2?條件2滿足時(shí)的值:
條件n?條件n滿足時(shí)的值:
默認(rèn)值;
需求1:2個(gè)數(shù)中取最大的
var score1 = 100;
var score2 = 80;
var result = score1 > score2 ? score1 : score2;
注意:后一個(gè)條件中不用包含否定前一個(gè)條件的關(guān)系判斷。
因?yàn)椋M(jìn)入后一個(gè)條件隱含的條件就是前一個(gè)條件不滿足。


day03
NaN == NaN? false NaN和任何數(shù)據(jù)比較,永遠(yuǎn)返回false
今后只要可能判斷NaN時(shí),用isNaN(x)
var str = "Hello";
str > 10? str > 10000? false
NaN NaN
關(guān)系運(yùn)算中,字符串比數(shù)字,字符串轉(zhuǎn)為數(shù)字!

注意:邏輯運(yùn)算中,不要急于將第一個(gè)條件之后的++/--提取出來(lái)

使用變量錯(cuò)誤的情況:*沒(méi)聲明的變量,只要使用就出錯(cuò)!*
var name;
console.log(Name);//程序運(yùn)行錯(cuò)誤錯(cuò)誤!會(huì)導(dǎo)致程序停止
console.log(name);//undefined1

函數(shù)(方法):封裝執(zhí)行一項(xiàng)專(zhuān)門(mén)任務(wù)的步驟的代碼序列
何時(shí)定義方法?只要發(fā)現(xiàn)一段代碼重復(fù)使用,就封裝為方法
語(yǔ)法:聲明
function 方法名(參數(shù)列表){
方法體:步驟清單
return 返回值;
}
調(diào)用:方法名(參數(shù)值列表);
參數(shù):方法內(nèi)獨(dú)有的變量。接收傳入數(shù)據(jù),在方法內(nèi)處理。參數(shù)讓方法變靈活!
如何聲明方法參數(shù):不用var!
參數(shù)何時(shí)被創(chuàng)建?只有方法被調(diào)用時(shí)才自動(dòng)創(chuàng)建
返回值:方法執(zhí)行完成后,由方法返回的數(shù)據(jù)
定義返回值:不用再聲明變量,直接用return值!
為什么定義返回值:因?yàn)檎{(diào)用方法的人需要明確的返回結(jié)果。
返回值主要給調(diào)用者使用。
return:本意退出方法!
退出同時(shí),可返回?cái)?shù)據(jù)!
可以再任何需要的地方,調(diào)用方法執(zhí)行返回值;
帶返回值的方法,使用時(shí),等效于直接使用返回值數(shù)據(jù)。

作用域:一個(gè)變量的可用范圍!
全局作用域:直接放在全局作用域中的變量,叫全局變量
只要希望所有作用域公用的變量都要聲明在全局作用域
window
局部(函數(shù))作用域:聲明在方法內(nèi)部的變量或方法參數(shù)的變量都叫局部變量
值傳遞:將一個(gè)變量的值賦值給另一個(gè)變量,其實(shí)將原變量中的值,復(fù)制一份給新變量
。
js中一切賦值都是值傳遞!

對(duì)未聲明的變量賦值:js會(huì)自動(dòng)在全局創(chuàng)建該變量!

函數(shù)作用域和變量作用域完全一樣
函數(shù)作用域在調(diào)用方法時(shí)創(chuàng)建,方法執(zhí)行完立刻銷(xiāo)毀!

PM
問(wèn)題:
方法參數(shù):依據(jù)方法內(nèi)部的處理邏輯至少需要幾個(gè)數(shù)據(jù)才能正常執(zhí)行。
方法參數(shù)和外部定義了了那些變量沒(méi)有任何關(guān)系。
方法參數(shù)作用:1、接收外部傳入數(shù)據(jù),在方法內(nèi)處理
2、規(guī)定調(diào)用方法的人必須提供哪些參數(shù)!

方法的返回值:根據(jù)方法調(diào)用者的需要! 如果方法調(diào)用者需要明確返回一個(gè)結(jié)果,就定
義返回值!否則,可以不定義返回值!
何時(shí)必須使用變量接?。糠椒ǖ姆祷刂?,后續(xù)程序可能反復(fù)使用!

鄙視題:
var num = 0;
function f1(num){
var num = 100;
console.log(num);
}
f1();
console.log(num);
//100 0

正課:
自定義函數(shù):
全局函數(shù):ECMAScript定義了標(biāo)準(zhǔn),由個(gè)瀏覽器廠商已經(jīng)實(shí)現(xiàn)的函數(shù)。我們直接調(diào)用
!
isNaN(x) parseInt/Float(x)

encodeURI( kword ):將url中的非法字符轉(zhuǎn)為單字節(jié)符號(hào)——編碼
decodeURI( kword ):將encodeURI轉(zhuǎn)后的字符串,轉(zhuǎn)換為原文——解碼
unicode編碼:每個(gè)字符2字節(jié)
utf-8:字母、數(shù)字單字節(jié),漢字3字節(jié)

url規(guī)定參數(shù)值中,再次出現(xiàn)保留字,就是非法:
保留字:/ ? $ : 等

encodeURIComponent( kword );既能對(duì)多字節(jié)非法字符編碼,又能對(duì)單字節(jié)非法字符
編碼——今后只使用component就夠了
何時(shí)使用?將數(shù)據(jù)通過(guò)url發(fā)送時(shí),都要先編碼再發(fā)送
decodeURIComponent( kword );對(duì)encodeURIComponent()編碼的字符串解碼。收
到編碼后的字符串后,都要先解碼,再處理。

eval():專(zhuān)門(mén)執(zhí)行字符串格式代碼

程序結(jié)構(gòu):3種:順序;分支;循環(huán)

程序:IPO
需求:找名詞——>程序中的數(shù)據(jù)
兩類(lèi):輸入數(shù)據(jù)
輸出數(shù)據(jù)
分析處理流程:

分支結(jié)構(gòu):程序運(yùn)行過(guò)程中,可以根據(jù)不同的條件,執(zhí)行不同的任務(wù)。
分支結(jié)構(gòu):if...結(jié)構(gòu):1件事,要么做,要么不做
if...else...結(jié)構(gòu):2件事,二選一執(zhí)行
else if結(jié)構(gòu):多件事,多選一執(zhí)行



day04
回顧:
方法參數(shù):方法內(nèi)處理邏輯必須的數(shù)據(jù)
參數(shù)僅限方法內(nèi)部使用!方法外無(wú)法訪問(wèn)方法的參數(shù)變量
參數(shù)名稱(chēng)自定義!
返回值:調(diào)用者是否需要獲得方法的執(zhí)行結(jié)果

分支:if結(jié)構(gòu) 1件事 可做可不做
if...else... 2件事 必須二選一
if...else if...[else...] 多件事 多選一執(zhí)行

正課:
switch...case...多條分支,根據(jù)條件判斷,選擇執(zhí)行
switch...case...用的是嚴(yán)格相等,不帶自動(dòng)類(lèi)型轉(zhuǎn)換
語(yǔ)法:swith(表達(dá)式){
case 表達(dá)式1://如果表達(dá)式的值===表達(dá)式1的值
代碼段1;
case 表達(dá)式n:
代碼段n;
default://如果表達(dá)式的值和都有的case都不相等
默認(rèn)代碼段;
}
運(yùn)行機(jī)制:如果找到與表達(dá)式匹配的case,不但執(zhí)行當(dāng)前case下的代碼,而且之后所有
代碼都被觸發(fā)!
switch(true){
case socre >= 90: console.log("A");
case score >= 80: console.log("B");
case score >= 60: console.log("C");
default: console.log("D");
}
break:退出當(dāng)前結(jié)構(gòu);
多條件公用同一套執(zhí)行邏輯是,不加break。
switch(true){
case socre >= 90: console.log("A");break;
case score >= 80: console.log("B");break;
case score >= 60: console.log("C");break;
default: console.log("D");
}

循環(huán)結(jié)構(gòu):程序反復(fù)執(zhí)行同一套代碼段。遇到結(jié)束條件,會(huì)結(jié)束執(zhí)行。
沒(méi)有循環(huán)結(jié)束條件,永遠(yuǎn)循環(huán)呢執(zhí)行——死循環(huán)

循環(huán)三要輸:
1、循環(huán)條件:循環(huán)繼續(xù)執(zhí)行的條件。一旦循環(huán)條件不滿足,循環(huán)立刻退出!
2、循環(huán)變量:用于循環(huán)條件中做判斷的變量。循環(huán)變量都會(huì)向著循環(huán)退出的趨勢(shì)變化
(不滿足循環(huán)條件的趨勢(shì))——循環(huán)計(jì)數(shù)器
3、循環(huán)體:每次循環(huán)要做的事情

while循環(huán):當(dāng)滿足條件時(shí),就繼續(xù)循環(huán)做...事
語(yǔ)法:
var 循環(huán)變量;
while(循環(huán)條件){
循環(huán)體;
迭代變化循環(huán)變量;
}
break:退出當(dāng)前結(jié)構(gòu)
while中何時(shí)用break:循環(huán)條件不滿足之前,希望強(qiáng)行退出循環(huán)。
如何使用break?可以放在任何需要退出循環(huán)的位置。

隨機(jī)數(shù):Math.random();0<=n<1
任意min——max之間取隨機(jī)數(shù)
公式:parseInt(Math.random()*(max-min-1)+min)

do-while循環(huán):先執(zhí)行一次循環(huán)體,再判斷是否繼續(xù)!
如果循環(huán)條件不滿足,循環(huán)體至少可以執(zhí)行一次!
var 循環(huán)變量;
do{
循環(huán)體;
迭代變化循環(huán)變量;
}while(循環(huán)條件);

*變量聲明提前*:“相同作用域內(nèi)”,var...不論出現(xiàn)在什么位置,解析時(shí),優(yōu)先提取到
js開(kāi)始位置“聲明”!

for:完全等效于while循環(huán)。
循環(huán)變量變化規(guī)律固定,循環(huán)次數(shù)已知、固定
for(聲明并初始化循環(huán)變量;循環(huán)條件;迭代變化循環(huán)變量){
循環(huán)體
}

continue:跳過(guò)本輪循環(huán),繼續(xù)執(zhí)行下一輪循環(huán)

遇到復(fù)雜問(wèn)題:
先用簡(jiǎn)單辦法做最簡(jiǎn)單的事情。
從簡(jiǎn)單辦法中找規(guī)律!

 

day05
程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法
良好的數(shù)據(jù)結(jié)構(gòu),可以極大提高程序的執(zhí)行效率!

數(shù)組:存儲(chǔ):連續(xù)存儲(chǔ)多個(gè)數(shù)據(jù)的存儲(chǔ)空間
使用:相當(dāng)于多個(gè)變量的集合
why?現(xiàn)實(shí)中數(shù)據(jù)都是批量分類(lèi)管理
何時(shí)使用:只要批量管理多個(gè)數(shù)據(jù),就要用數(shù)組保存
如何使用:創(chuàng)建,初始化,訪問(wèn)數(shù)組中的數(shù)據(jù)
創(chuàng)建:數(shù)組都是用[]創(chuàng)建出來(lái)的。
var arr = [];——>創(chuàng)建了一個(gè)數(shù)組對(duì)象,數(shù)組中包含0個(gè)元素
var arr = [90, 34, 23];——>創(chuàng)建了一個(gè)數(shù)組對(duì)象,數(shù)組中連續(xù)存儲(chǔ)3個(gè)元素
2個(gè)不限制:1、不限制元素的個(gè)數(shù)! 2、不限制元素?cái)?shù)據(jù)類(lèi)型

*數(shù)組是引用類(lèi)型的對(duì)象*
原始類(lèi)型:數(shù)據(jù)保存在變量本地
引用類(lèi)型:數(shù)據(jù)不保存在變量本地!保存在“堆”中。
由地址指向?qū)嶋H數(shù)據(jù)
引用類(lèi)型特點(diǎn):可以保存多個(gè)數(shù)據(jù),而且數(shù)據(jù)個(gè)數(shù)隨時(shí)變化
why?原始類(lèi)型中只能保存1個(gè)值
1個(gè)值無(wú)法精確描述一個(gè)東西
現(xiàn)實(shí)中,都是用多個(gè)屬性共同描述一樣?xùn)|西
對(duì)象:凡是存儲(chǔ)在堆中的,都是對(duì)象!
使用引用類(lèi)型的對(duì)象:使用變量,等效使用對(duì)象的地址
使用對(duì)象地址,等效于使用對(duì)象本身
數(shù)組對(duì)象支持直接輸出數(shù)組內(nèi)容

其他數(shù)組創(chuàng)建語(yǔ)法:var arr = new Array(num);
new:要在堆中開(kāi)辟空間!
Array:ECMAScript標(biāo)準(zhǔn)的內(nèi)置類(lèi)型
new Array:在堆中創(chuàng)建一個(gè)數(shù)組類(lèi)型的存儲(chǔ)區(qū)域
(num):初始創(chuàng)建num個(gè)元素
var arr = new Array(7);
//[undefined, undefined, undefined, undefined, undefined, undefined, undefined]
undefined輸出時(shí),變?yōu)橐粋€(gè)空字符
var arr = new Array(元素1, 元素2,..., 元素n);

null:一個(gè)變量沒(méi)有指向任何對(duì)象
何時(shí)使用null:主動(dòng)釋放對(duì)象!主動(dòng)釋放的對(duì)象不能被找回
null vs undefined:
null專(zhuān)用于主動(dòng)釋放對(duì)象!
undefined:專(zhuān)用于自動(dòng)初始化任何未賦值的變量

垃圾回收:js引擎自動(dòng)銷(xiāo)毀不再被引用的對(duì)象!
垃圾回收程序:隨js程序運(yùn)行而后臺(tái)同時(shí)運(yùn)行
只要對(duì)象還有變量引用,就不回收。

訪問(wèn)數(shù)組:數(shù)組一組變量的集合。
如何獲得其中一個(gè)變量/數(shù)據(jù):下標(biāo),數(shù)組中唯一標(biāo)識(shí)一個(gè)元素的序號(hào)。從0開(kāi)始。最后
一個(gè)元素的下標(biāo)是“元素個(gè)數(shù)-1”

js內(nèi)置對(duì)象不但封裝存儲(chǔ),而且封裝常用API
API:已經(jīng)實(shí)現(xiàn)的方法!可以直接調(diào)用!
Array API:
1、arr.length屬性:數(shù)組中元素的個(gè)數(shù)
訪問(wèn)任意數(shù)組的最后一個(gè)元素:arr[arr.length - 1]
length屬性值,隨數(shù)組長(zhǎng)度變化而自動(dòng)變化!
js中數(shù)組可根據(jù)程序需要,“自動(dòng)擴(kuò)容”,保證程序正常執(zhí)行

數(shù)組擴(kuò)容和縮容:都是設(shè)置length屬性的值
如果length屬性值>舊值,會(huì)擴(kuò)容;反之,縮容(截?cái)啵?br>被截?cái)嗟脑兀荒鼙徽业?,不?huì)被回收。只能隨數(shù)組對(duì)象一起回收。
固定用法:在任意數(shù)組結(jié)尾追加一個(gè)新元素:arr[arr.length] = 新值;

下午:
棧中的變量 生命周期:和堆完全不同
var a = 5;//全局變量隨網(wǎng)頁(yè)生命周期
function fun(){
var b = 10;
}
fun();//作用域環(huán)境棧
/*fun的作用域環(huán)境棧 出棧 fun中局部變量,一同消失*/
console.log(b);//refError
結(jié)論:局部變量的聲明周期和所在方法的作用域環(huán)境棧有關(guān)
作用域創(chuàng)建,局部變量一同創(chuàng)建
作用域結(jié)束,局部變量一同消失

什么是數(shù)組遍歷:對(duì)數(shù)組中每個(gè)元素執(zhí)行相同的操作
for(var i = 0; i < arr.length; i++){
arr[i]——>當(dāng)前元素
}

關(guān)聯(lián)數(shù)組:數(shù)組下標(biāo)可以自定義名稱(chēng)!Key/value對(duì)
何時(shí)使用關(guān)聯(lián)數(shù)組:數(shù)組元素的內(nèi)容無(wú)法描述自己的意義時(shí),使用關(guān)聯(lián)數(shù)組為每個(gè)元素
起名
關(guān)聯(lián)數(shù)組的length屬性作廢了!
for in:專(zhuān)門(mén)遍歷關(guān)聯(lián)數(shù)組用的!
for(var key in arr){
//從第一個(gè)元素開(kāi)始,將元素的key賦值給臨時(shí)變量key
arr[key]——>當(dāng)前正在遍歷的元素的值(value)
}
關(guān)聯(lián)數(shù)組直接量定義方式:強(qiáng)調(diào):大括號(hào)
{"key1":"value1", "key2":"value2", ...}

冒泡排序:[3, 5, 3,。。]:見(jiàn)array.html

數(shù)組常用方法:
x.toString()方法:任何對(duì)象都有toString方法
默認(rèn)用,分割每個(gè)元素
將任何對(duì)象轉(zhuǎn)為字符串
一般不主動(dòng)調(diào)用,js在需要時(shí)自動(dòng)調(diào)用
x.valueOf()方法:同toStrin()

var str = arr.join("分隔符"):將數(shù)組轉(zhuǎn)為字符串。但是可自定義分隔符!
用法,將字符拼接為單詞或句子 chars.join("");

var newArr = arr.concat(1個(gè)元素值, [數(shù)組], ...):將參數(shù)拆散成單個(gè)元素,追加到數(shù)組
中。
*不會(huì)修改原數(shù)組,只能返回新數(shù)組對(duì)象*

var subArr = arr.slice(start, end + 1);截取數(shù)組下標(biāo)從start開(kāi)始,到end位置的元素,
生成子數(shù)組對(duì)象。*含頭不含尾*

arr.splice:刪除!插入!替換!
刪除元素:arr.splice(start, count);
替換元素:arr.splice(start, count, 值1, 值2, ...);
插入元素:arr.splice(start, 0, 值1, 值2, ...)
返回每次刪除元素組成的新數(shù)組

arr.reverse();顛倒所有數(shù)組元素
arr.sort();默認(rèn)升序排序。默認(rèn)都轉(zhuǎn)為字符串排序!

 

day06
手冊(cè):JavaScript——>js對(duì)象——>js數(shù)組——>Array對(duì)象參考手冊(cè)
回顧:
轉(zhuǎn)為字符串:x.toString()——>任何對(duì)象都有toString方法
var str = arr.join("分隔符")——>自定義元素分隔符
固定用法:arr.join("");——>將數(shù)組中的字符串無(wú)縫拼接為單詞或字符串

拼接和截?。簐ar newArr = arr.concat(otherArr, 值1, ...)
var subArr = arr.slice(start, end + 1);
復(fù)制原始數(shù)組中的部分元素,原數(shù)組不變
含頭不含尾

splice:*直接修改原數(shù)組!*返回被刪除 的元素
刪除:[var removed =] arr.splice(start, count);
替換:[var rrmoved =] arr.splice(start, count, 值1, 值2, ...);
自動(dòng)調(diào)整數(shù)組容量,容納所有修改的新值
插入:[var rrmoved =] arr.splice(start, 0, 值1, 值2, ...);

正課:
排序:arr.sort();默認(rèn)按字符串升序排列
自定義排序:2步:Step1:定義比較器函數(shù)!
什么是比較器函數(shù)?定義任意兩值比較策略的方法
比如:num1 - num2 > 0 ——> num1 > num2
num1 - num2 < 0 ——> num1 < num2
function compare(a, b){
return a - b;
}//如果返回>0數(shù),a > b; 如果返回<0數(shù),a < b; 如果返回=0數(shù),a = b;

Step2:將比較器函數(shù)傳遞給sort方法!
***如何將方法做參數(shù)傳遞?***
js中方法也是一個(gè)對(duì)象!方法名就是指向?qū)ο蟮淖兞棵?br> function compare(a, b){return a - b;}
//可以定義在使用前后的任何位置
//原因:var聲明和function聲明自動(dòng)提前!
相當(dāng)于:var compare = new Function("a", "b", "return a - b;");
//必須定義在使用之前!原因:僅聲明提前,賦值不能提前!
arr.sort(compare);注意!將方法作為對(duì)象傳遞是,僅使用方法名,后不加圓
括號(hào)。

降序:顛倒比較結(jié)果,可以導(dǎo)致升序變降序
升序:function compareASC(a, b){return a - b;}
顛倒(*-1):function compareDESC(a, b){return b -a;}

棧和隊(duì)列:
什么是棧?后進(jìn)先出!(LIFO)棧其實(shí)就是數(shù)組,只不過(guò)用一對(duì)方法模擬了棧的操作!
棧:只能從數(shù)組一端出棧,入棧。另外一端封閉!
操作棧:
結(jié)尾入棧出棧:元素下標(biāo)始終不變,最后一個(gè)元素始終最新
入棧:arr.push(值1, ...);
出棧:var last = arr.pop();
開(kāi)頭入棧出棧:所有元素下標(biāo)隨入棧出棧操作而變化
入棧:arr.unshift(值1, ...);
出棧:var first = arr.shift();
隊(duì)列:FIFFO
入隊(duì)列:arr.push(值1, ...);
出隊(duì)列:var first = arr.shift();

二位數(shù)組:數(shù)組的元素又是另一個(gè)數(shù)組對(duì)象!
創(chuàng)建二位數(shù)組:創(chuàng)建普通數(shù)組,完全一樣!
只不過(guò)將普通元素,換為一個(gè)數(shù)組對(duì)象而已
var arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
arr[3] = [10, 11, 12];
如何訪問(wèn)二位數(shù)組中的任意元素:arr[父數(shù)組中的下標(biāo)][子數(shù)組中的下標(biāo)]
何時(shí)使用二位數(shù)組:數(shù)據(jù)包含明顯上下級(jí)關(guān)系

內(nèi)置對(duì)象
什么是內(nèi)置對(duì)象??jī)?nèi)置對(duì)象就是ECMAScript標(biāo)準(zhǔn)中已經(jīng)定義好的,由瀏覽器廠商已經(jīng)
實(shí)現(xiàn)的標(biāo)準(zhǔn)對(duì)象!
內(nèi)置對(duì)象中封裝了專(zhuān)門(mén)的數(shù)據(jù)和操作數(shù)據(jù)常用的API。
JavaScript中內(nèi)置對(duì)象:
String,Boolean,Number,Array,Date,Math,Error,Function,Object,Global

包裝類(lèi)型
什么是包裝類(lèi)型?專(zhuān)門(mén)封裝原始類(lèi)型的數(shù)據(jù),并提供對(duì)數(shù)據(jù)常用操作的內(nèi)置類(lèi)型。
為什么要用包裝類(lèi)型?讓原始類(lèi)型的數(shù)據(jù)也可以像引用類(lèi)型一樣,擁有方法和屬性。
JavaScript中的包裝類(lèi)型有三個(gè):
String類(lèi)型,Number類(lèi)型,Boolean類(lèi)型
何時(shí)使用包裝類(lèi)型?只要用原始類(lèi)型的數(shù)據(jù)調(diào)用方法或訪問(wèn)屬性,js引擎都會(huì)自動(dòng)創(chuàng)建
對(duì)應(yīng)的包裝類(lèi)型對(duì)象。
方法調(diào)用完,包裝類(lèi)型對(duì)象自動(dòng)釋放。
var str = "Hello";
//var strObject = new String(str);
str += "world";
//strObject = null;

String包裝類(lèi)型:*字符串內(nèi)容,一旦創(chuàng)建,不可改變*
創(chuàng)建原始類(lèi)型字符串變量:
直接量:var stuName = "Smith";
類(lèi)型轉(zhuǎn)換:var priceString = String(190.3);
創(chuàng)建引用類(lèi)型字符串對(duì)象:
var carType = new String("BMW528Li");

str.length:返回str字符串中的字符個(gè)數(shù)
大小寫(xiě)轉(zhuǎn)換:都轉(zhuǎn)小寫(xiě):str = str.toLowerCase();
都轉(zhuǎn)大寫(xiě):str = str.toUpperCase();
何時(shí)使用:希望大小寫(xiě)一視同仁時(shí),就要先轉(zhuǎn)換,在處理

 

day07
內(nèi)置對(duì)象:見(jiàn)PPT
包裝類(lèi)型:見(jiàn)PPT
var num = 5.678;//原始類(lèi)型
//num = new Number(num);//包裝類(lèi)型
console.log(num.toFixed(2));
//num = null;//釋放包裝類(lèi)型對(duì)象!

創(chuàng)建字符串:原始類(lèi)型還是包裝類(lèi)型?是否new
var str = "...";//原始類(lèi)型
var str = String("...");//原始類(lèi)型,類(lèi)型轉(zhuǎn)換
**********************************************
var strObj = new String("...");//包裝類(lèi)型對(duì)象

轉(zhuǎn)義字符:代替字符串中的非打印字符:\n \t
如果字符串內(nèi)容中包含和語(yǔ)法沖突的特殊字符,可用\轉(zhuǎn)為普通字符
比如:console.log("\tjs是互聯(lián)網(wǎng)\"第一大語(yǔ)言\"");

字符串內(nèi)容一旦創(chuàng)建不能改變!
如果修改,都要?jiǎng)?chuàng)建新字符串,保存新結(jié)果,替換舊字符串
var str = "Hello";
var strObj = new String(str);
str = str.toUpperCase();
//strObj = null;
console.log(str);
*規(guī)律:所有字符串API,都需要變量接收返回值!*

字符串的字符個(gè)數(shù):str.length屬性
*字符串類(lèi)型底層其實(shí)都是用字符數(shù)組實(shí)現(xiàn)的*
比如:str[i]

大小寫(xiě)轉(zhuǎn)換:大小寫(xiě)字母一視同仁時(shí),先轉(zhuǎn)化,再處理
比如:重名驗(yàn)證,重復(fù)郵箱,驗(yàn)證碼

獲取指定位置的字符:var char = str.charAt(index);

獲取指定位置字符的unicode編碼:var num = str.charCodeAt(index);

優(yōu)化:*頻繁對(duì)字符串+=,要用數(shù)組代替!不會(huì)產(chǎn)生中間對(duì)象*
Step1:每個(gè)字符串放入數(shù)組
Step2:join("")拼接字符元素

今天后要把任何類(lèi)型變?yōu)镾tring,不要用toString,而用+"",效率更高。

字符串三大操作:1.查找關(guān)鍵字! 2.替換關(guān)鍵字 3.獲取子字符串
查找關(guān)鍵字:var index = str.indexOf("關(guān)鍵字");
返回關(guān)鍵字所在位置!*如果沒(méi)找到,返回-1!*
indexOf:懶:只找第一個(gè)關(guān)鍵字位置!
蠢:默認(rèn)只能從位置0開(kāi)始!
var index = str.indexOf("關(guān)鍵字", from);
from:開(kāi)始查找的位置,從from開(kāi)始向后查找
一句話辦幾件事時(shí),可以把表達(dá)式當(dāng)值用!
var str = "女神說(shuō)要來(lái),我草草的收拾了房間。結(jié)果她又說(shuō)不來(lái)了。我說(shuō):我草";
var index = -1;
while((index = str.indexOf("我草", index + 1)) != -1){
console.log("位置" + index + "發(fā)現(xiàn)關(guān)鍵字");
}

從最后一個(gè)字符,向前找:只要關(guān)鍵字離結(jié)尾近,就用last
var index = str.lastIndexOf("關(guān)鍵字", from);
from:開(kāi)始查找的位置,從from開(kāi)始向前查找
*返回的index完全相同!字符在數(shù)組中的下標(biāo)是固定的!*
2處修改:index從str.length開(kāi)始;每次index要-1

2.獲取子字符串:以下三個(gè)方法省略第二個(gè)參數(shù),默認(rèn)都是取到結(jié)尾!
var subStr = str.slice(start, end + 1);
start,end支持正負(fù)
var subStr = str.substring(start, end + 1);
用法同slice!唯一差別:不支持負(fù)值作為參數(shù)!
var subStr = str.substr(start, *count*);
JavaScript——>js字符串——>

下午:
按規(guī)律分割字符串:var subs = str.split("分隔符"[, count]);

鄙視題:var str = "no zuo no die";

課堂練習(xí):判斷字符的種類(lèi):unicode范圍:
48-57:0-9 數(shù)字字符
65-90:A-Z 大寫(xiě)字母
97-122: a-z 小寫(xiě)字母
19968-40869:漢字

什么是模式匹配:可以設(shè)置查找或替換的規(guī)則!
何時(shí)使用模式匹配:要查找的關(guān)鍵字可能發(fā)生有規(guī)律的變化。
如何使用模式匹配:1.先定義模式:/關(guān)鍵字/模式
比如:var reg = /no/ig; no是要查找的關(guān)鍵字原文,不加""
i表示忽略大小寫(xiě)! g表示全局查找和替換!

String類(lèi)型中,提供了專(zhuān)門(mén)支持模式匹配的API!
按模式*替換*關(guān)鍵字:str = str.replace(reg, "新值");
默認(rèn)replace僅替換第一個(gè)關(guān)鍵字!
要想全局替換,要在模式中定義“g”

獲得*所有*關(guān)鍵字的*內(nèi)容:var kwords = str.match(reg);
只能取得關(guān)鍵字的內(nèi)容,無(wú)法確定每個(gè)關(guān)鍵字的位置!
kwords.length:找到的關(guān)鍵字個(gè)數(shù)!
*如果未找到,返回null!*
只要有可能返回null!都要先判斷 !=null,再處理!

SetupRegexBuddy.exe 全部默認(rèn)安裝

var index = str.search(reg); 和indexOf完全相同!
indexOf不支持模式查找!search其實(shí)是indexOf的模式查找版

今后在網(wǎng)頁(yè)中只要處理字符串的格式,就要用正則表達(dá)式
*正則表達(dá)式*
什么是正則達(dá)表示:字符串中字符出現(xiàn)的規(guī)律
何時(shí)使用正則表達(dá)式?驗(yàn)證字符串格式,查找關(guān)鍵字,替換關(guān)鍵字
比如:銀行卡查詢密碼:6位數(shù)字
用戶名:字母,數(shù)字,_的組合

正則表達(dá)式:
選擇符號(hào):[所有備選字符]:[去草],必須多選一使用
一個(gè)[],只能代表一位字符的規(guī)則
[^xxxx]:表示出了xxxx都行!反義。注意必須放在[]中的第一個(gè)位置,否則變?yōu)槠胀ㄗ?br>符匹配。

-符號(hào):字符的范圍:備選字符是連續(xù)的范圍!
比如:[0-9] [a-z] [A-Z] [a-zA-Z]//-可以局部使用
漢字范圍:[\u4e00-\u9fa5]

預(yù)定義字符集:使用簡(jiǎn)化的符號(hào),定義常用字符集
比如:[0-9] ——> \d [a-zA-Z0-9_] ——> \w 空字符 ——> \s

如果規(guī)則正文中出現(xiàn)特殊符號(hào),用\轉(zhuǎn)為原文

.一個(gè)人一字符!

數(shù)量詞:規(guī)定前邊一個(gè)字符出現(xiàn)次數(shù)的兩次
語(yǔ)法:{min,max}
{num}:固定長(zhǎng)度
{min,}:至少min個(gè),多了不限
手機(jī)號(hào):\+86\s1[3578]\d{9}
用戶名:\w{6,8}

 

day08
回復(fù):
[]:備選字符集,只能多選一。一個(gè)[]只能匹配一位字符
比如:我[去草]:我去 我草
[]內(nèi):開(kāi)頭^:除了xx都行:[01235689] ——> [^47]
-:表示備選字符的范圍 :[a-z] [0-9] [A-Z]

預(yù)定義字符集:
[0-9] ——> \d
[a-zA-Z_] ——> \w
\s:空字符: \n \t 空格

量詞:修飾前一位字符出現(xiàn)的次數(shù)
{min,max}:最少min個(gè),最多max個(gè)
{min,}:最少min個(gè),最多不限制
{num}:固定num個(gè)

比如:驗(yàn)證座機(jī)號(hào)碼:\d{3,4}-\d{7,8}

正課:
特殊數(shù)量詞:+ * ?
?:可有可無(wú),對(duì)多只能出現(xiàn)一次
比如:我了?去: 我去 我了去 我了個(gè)去X 我了了去X

*:可有可無(wú),不限制出現(xiàn)次數(shù)
比如:點(diǎn)亮我生命的火*:
點(diǎn)亮我生命的
點(diǎn)亮我生命的火
點(diǎn)亮我生命的火火火

+:至少出現(xiàn)一次!不限制出現(xiàn)次數(shù)
比如:點(diǎn)亮我生命的火+:
點(diǎn)亮我生命的火
點(diǎn)亮我生命的火火火

如果正文中出現(xiàn)+?*,都要用\轉(zhuǎn)義

():分組:改變模式的匹配順序
比如:驗(yàn)證身份證號(hào):\d{15}(\d{2}[0-9xX])?
驗(yàn)證手機(jī)號(hào):(\+86)?\s+1[3578]\d{9}

^:整個(gè)正則表達(dá)式的開(kāi)頭,表示以xxx開(kāi)始
$:整個(gè)正則表達(dá)式的結(jié)尾,表示以xxx結(jié)束

?= 預(yù)判,前一個(gè)字符之后,必須緊跟xxx
?! 預(yù)判,前一個(gè)字符之后,必須不能跟xxx

課堂練習(xí):中文姓名:[\u4e00-\u9fa5]{2,6}
電子郵件:\w+@\w+([-]\w+)*(\.\w+)+
其中:\w+([-]\w+)* —— 匹配域名
一個(gè)以上的字母,后可跟“-字母”,可有可無(wú)
(\.\w+)+
“.字母”組合至少出現(xiàn)1次

RegExp對(duì)象:專(zhuān)門(mén)封裝一條正則表達(dá)式,提供使用正則表達(dá)式的常用API
如何使用RegExp對(duì)象:1.創(chuàng)建 2.調(diào)用API
v如何創(chuàng)建正則表達(dá)式對(duì)象:ar regExp = /正則表達(dá)式/ig;
API:
驗(yàn)證:var boolean = regExp.test("被檢查的字符串");
如果驗(yàn)證通過(guò):返回true;否則返回false
驗(yàn)證 vs 查找:
驗(yàn)證要求完整匹配!查找要求部分匹配!

**test方法默認(rèn):只要找到就返回true!**
正則表達(dá)式前加^,后加$

查找:exec:查找關(guān)鍵字的位置,又能找到關(guān)鍵字的內(nèi)容
indexOf不支持正則,search支持正則,每次只能找1個(gè)
match所有內(nèi)容,但得不到位置!
var arr = regExp.exec("被查找的內(nèi)容");
arr[0]:找到的關(guān)鍵字內(nèi)容
arr.index屬性:找到的關(guān)鍵字的位置
exec方法每次只能找1個(gè),但是每次自動(dòng)修改regExp對(duì)象的lastIndex屬性!
regExp對(duì)象的lastIndex屬性:表示下次開(kāi)始匹配的位置!

查找:僅判斷有沒(méi)有,或者僅查找位置:str.indexOf()
支持正則表達(dá)式:str.search()
僅所有關(guān)鍵字的內(nèi)容:str.match()
即找位置,又找內(nèi)容:regExp.exec()

/正則表達(dá)式/
var regExp = new RegExp("\\d{6}", "ig"); 動(dòng)態(tài)創(chuàng)建正則表達(dá)式
強(qiáng)調(diào):所有\(zhòng)都要改為\\

貪婪模式: .+ .*,默認(rèn)先匹配整個(gè)字符串,再縮小范圍!
懶惰模式: (.+?) (.*?),從第一個(gè)字符開(kāi)始,向后擴(kuò)展范圍

下午:
從正則表達(dá)式匹配的內(nèi)容中,取一部分:RegExp.$n
n:正則表達(dá)式中第n個(gè)分組,其實(shí)就是第n個(gè)圓括號(hào)
強(qiáng)調(diào):分組從1開(kāi)始
必須通過(guò)RegExp類(lèi)型,直接調(diào)用$n,不能使用對(duì)象!

String對(duì)象與正則表達(dá)式
str = str.replace(/正則表達(dá)式/ig, "替換值");
var arr = str.match(/正則表達(dá)式/ig); str.search()
str.split(/正則表達(dá)式/);

trim功能:去除字符串開(kāi)始和結(jié)尾的空格。中間空格不去除!
對(duì)輸入字符串的處理,多數(shù)要先清除開(kāi)頭結(jié)尾空格,再處理
IE8不支持trim()方法!
自定義trim()方法:
function trim(str){
var regExp = /(^\s+)\(\s+$)/g;
str = str.replace(regExp, "");
return str;
}

String總結(jié):所有的API都無(wú)法修改原字符串,都會(huì)返回新的字符串
所有StringAPI都需要用變量保存結(jié)果!
str.length 字符個(gè)數(shù)
str = str.toUpperCase()/toLowerCase()
查找關(guān)鍵字:var index = str.indexOf("關(guān)鍵字"[, from])
var arr = str.match(/正則表達(dá)式/g);
獲得子字符串:var substr = str.slice(start, end + 1);
str.substring(start, end + 1);
str.substr(start, count);
替換:str = str.replace(/正則表達(dá)式/g, "替換值");
獲得指定位置的字符:var char = str.charAt(index);
str[index];
字符編碼轉(zhuǎn)碼:var code = str.charCodeAt(index);
var char = String.fromCharCode(code);

RegExp對(duì)象總結(jié):
var reg = /正則表達(dá)式/ig;
var reg = new RegExp("正則表達(dá)式", "ig");
*其中所有的\都要改為\\!*

驗(yàn)證str中時(shí)候包含reg匹配的關(guān)鍵字:
var boolean = reg.test(str);
*強(qiáng)調(diào):完整驗(yàn)證,都需要在正則表達(dá)式前加^后加$*

同時(shí)查詢所有關(guān)鍵字的內(nèi)容和位置
while((arr= reg.exec(str)) != null){
arr[0] ——> 找到的一個(gè)關(guān)鍵
arr.index ——> 當(dāng)前關(guān)鍵字的位置
}

RegExp.$n:
獲得正則表達(dá)式中第n個(gè)分組(圓括號(hào))匹配的子字符串

Math類(lèi)型:封裝了所有數(shù)學(xué)計(jì)算有關(guān)的API
不能new!
Math.PI

Math.round(num) ——> 四合五入取整
Math.ceil(num) ——> 向上取整
Math.floor(num) ——> 向下取整

Math.pow(底數(shù), 冪);
Math.sqrt(num);//平方根!

絕對(duì)值:Math.abs(num);

Math.max/min(值1, 值2, 值3, ...);
取數(shù)組中的最大值:var max = Math.max.apply(Math, arr);

隨機(jī)數(shù):Math.random(); 0<=r<1
任意min-max:
Math.floor(Math.random() * (max - min +1) + min);

/*隨機(jī)生成四位驗(yàn)證碼*/
//Step1:數(shù)組:所有字母、數(shù)字
var codes = [];
for(var i = 48; i <= 57; codes.push(i), i++);
for(var i = 65; i <= 90; codes.push(i), i++);
for(var i = 97; i <= 122; codes.push(i), i++);

function getCode(){
var arr = [];
for(var i = 0; i < 4; i++){//0-61之間取隨機(jī)數(shù)
var index = Math.floor(Math.random()*(60-0+1) + 0);
var char = String.fromCharCode(codes[index]);
arr.push(char);
}
return arr.join("");
}

while(true){
var code = getCode();
var input = prompt("輸入驗(yàn)證碼:" + code);
var reg = /^[a-zA-Z0-9]{4}$/;
if(reg.test(input)){
if(code.toLowerCase() == input.toLowerCase()){
document.write("登錄成功");
break;
}else{
alert("驗(yàn)證碼輸入錯(cuò)誤!");
}
}
}

Date對(duì)象:封裝一個(gè)時(shí)間點(diǎn)數(shù)據(jù),提供對(duì)時(shí)間、日期的常用API
創(chuàng)建:var date = new Date();
1.創(chuàng)建Date類(lèi)型對(duì)象; 2.自動(dòng)獲得瀏覽器當(dāng)前時(shí)間點(diǎn)!
自定義時(shí)間:var date = new Date("2015-6-9 16:47");
1.創(chuàng)建Date類(lèi)型對(duì)象; 2.自定義一個(gè)具體時(shí)間點(diǎn)

*Date對(duì)象中,
保存的是從1970年1月1日 0:00:00到現(xiàn)在的毫秒數(shù)
var date = new Date();

API:
1.每個(gè)分量都有一對(duì)get/set方法,獲取/設(shè)置該分量的值!
2.命名:年/月/日 沒(méi)有s,時(shí),分,秒 有s
3.取值、賦值:除了每月中的日之外,其余都是從0開(kāi)始,到-1結(jié)束
每月中的日,從1開(kāi)始,帶31結(jié)束
月:取值時(shí),要+1修正;賦值是,-1修正
星期://日 一 ............ 六
//0 1 6

日期計(jì)算:兩日期對(duì)象相減,得到毫秒數(shù)
時(shí)間做+:var nowMs = date.getTime(); 返回時(shí)間毫秒數(shù)
var nextMs = nowMs + 5*60*1000;
var next = new Date(nextMs);
使用毫秒做計(jì)算,不改變?cè)瓡r(shí)間對(duì)象!需要重新封裝時(shí)間對(duì)象
最大僅能算到“天數(shù)”。再算“月數(shù)”,無(wú)法確定每月天數(shù)。

 


day09
回顧:
Date對(duì)象:內(nèi)部封裝了一個(gè)毫秒數(shù)
創(chuàng)建日期對(duì)象:
var date = new Date("2016/7/4");PPT上 new Date("2016-7-4");僅兼容chrome
API
1.每個(gè)分量都有一對(duì)get/set方法
2.命名:年月日星期 不帶s;時(shí)分秒帶s
3.值范圍:月中的日:1-31;其他:0-減1

計(jì)算:1.兩日期相減,得到毫秒數(shù)
2.日期+/- 天小時(shí)分秒:用毫秒
3部:1.var ms = date.getTime();
2.ms = ms +/- 毫秒數(shù)
3.var newDate = new Date(ms);

正課:
3.任意分量的計(jì)算:
先取出分量值,做計(jì)算,再set回去!

var now = new Date();
var day = now.getDate();//4
day -= 10;//-6
now.setDate(day);
document.write(now);

date.setXXX();1.自動(dòng)調(diào)整進(jìn)制
2.*直接修改原日期對(duì)象*
如何保留原日期對(duì)象?先new出新Date對(duì)象,再set
var newDate = new Date(oldDate.getTime());

日期格式轉(zhuǎn)換:
date.toLocaleString();//獲得日期和時(shí)間的本地格式
date.toLocaleDateString();//僅獲得日期部分的本地格式
date.toLocaleTimeString();//僅獲得時(shí)間部分的本地格式

日期格式轉(zhuǎn)換:都要自定義format(date)方法!
function format(date){
var week = ["日", "一", "二", "三", "四", "五", "六"];
var y = date.getFullYear() + "年";
var m = date.getMonth() + 1 + "月";
var d = date.getDate() + "日";

var w = " 星期" + week[date.getDay()];

var h = date.getHours();
var am = h >= 12 ? " 上午 " : " 下午 ";
h = h > 12 ? h - 12 : h;
h = h < 10 ? "0" + h : "" + h;

var mi = date.getMinutes();
mi = mi < 10 ? "0" + mi : "" + mi;

var s = date.getSeconds();
s = s < 10 ? "0" + s : "" + s;

var str = y + m + d + w + am + h + ":" + mi + ":" + s;
return str;
}

Number類(lèi)型 API:
num.toFixed(n); 按n位小數(shù)四舍五入,*返回一個(gè)字符串*!
何時(shí)使用:在計(jì)算之后,顯示結(jié)果是,*最后調(diào)用toFixed方法*
vs Math.round(num):只能取整 返回一個(gè)數(shù)Number

num.toString(n):按n進(jìn)制輸出數(shù)字的字符串格式

錯(cuò)誤處理:
什么是錯(cuò)誤處理:導(dǎo)致程序運(yùn)行停止的運(yùn)行時(shí)異常狀態(tài)
什么是錯(cuò)誤處理:在出現(xiàn)異常狀態(tài)是,保證程序不停止的機(jī)制
如何錯(cuò)誤處理:
錯(cuò)誤類(lèi)型:Error類(lèi)型:所有錯(cuò)誤對(duì)象的父類(lèi)型
6種子類(lèi)型:EvalError,
RangeError:參數(shù)超出范圍
比如:num.toFixed(n) n<0 拋出RangeError
ReferenceError:引用錯(cuò)誤:找不到對(duì)象
比如:只要使用未聲明的變量時(shí),都要拋出ReferenceError
SyntaxError:語(yǔ)法錯(cuò)誤!修改源代碼就可以解決!
TypeError:錯(cuò)誤的使用了類(lèi)型和類(lèi)型的方法!
URIError:URI錯(cuò)誤
如何處理錯(cuò)誤:
try{
可能出錯(cuò)的代碼
}catch(err){只要拋出錯(cuò)誤,都要?jiǎng)?chuàng)建一個(gè)Error對(duì)象
錯(cuò)誤處理的代碼
1.獲得錯(cuò)誤信息:err.name 類(lèi)型
2.根據(jù)錯(cuò)誤的類(lèi)型,執(zhí)行不同的處理
}[finally{可有可無(wú)
//程序中使用了大對(duì)象!一樣要在finally中主動(dòng)釋放
無(wú)論是否出錯(cuò),都必須執(zhí)行的代碼
}]

能用if...else解決的問(wèn)題,就不用try...catch!
何時(shí)使用try...catch?try...catch處理的是無(wú)法預(yù)料的問(wèn)題!

主動(dòng)拋出異常:如何告知方法調(diào)用者出錯(cuò)?
thow new Error("自定義的錯(cuò)誤信息");

下午:
Function對(duì)象:
1.以聲明方式定義方法:放前放后無(wú)所謂
function 方法名(參數(shù)列表){方法體;return 返回值}
2.以創(chuàng)建對(duì)象方式定義方法:必須定義在使用之前!
var 方法名 = new Function("參數(shù)1", ..., "方法體;return 返回值");
只有聲明方式的方法定義才被提前解析!——方法聲明提前

重載:方法,根據(jù)傳入的參數(shù)列表不同,執(zhí)行不同的任務(wù)
js支不支持重載:語(yǔ)法不支持,但是可以通過(guò) arguments對(duì)象 模擬重載效果

arguments對(duì)象:方法對(duì)象中保存所有參數(shù)的類(lèi)數(shù)組對(duì)象
類(lèi)數(shù)組對(duì)象(object like array):長(zhǎng)的像數(shù)組的對(duì)象
*方法內(nèi),自動(dòng)創(chuàng)建!直接使用!*
arguments.length:保存變量的個(gè)數(shù)
arguments[i]:訪問(wèn)傳入的第i + 1個(gè)變量

3.使用匿名函數(shù)賦值的方式定義方法:
匿名函數(shù):沒(méi)有方法名的函數(shù)定義!
var compare = function(a, b){return a-b;}

鄙視題:js中方法定義的方式有幾種:3種!
A.function compare(a, b){return a - b}
**************************************************************************
B.var compare = function(a, b){return a - b;}
C.var compare = new Function("a", "b", "return a- b;");
D.var compare = new Function(a, b, return a- b;); X

function isEmpty(str){
if(str === undefined){
return true;
}else if(str == null){
return true;
}else{
var reg = /^\s*$/;
return reg.test(str);
}
}

var ltrim = function(str){
var reg = /^\s+/;
return str.replace(reg, "");
}
var rtrim = function(str){
var reg = /\s+$/;
return str.replace(reg, "");
}

匿名函數(shù)2個(gè)用途:
1、回調(diào)函數(shù):函數(shù)何時(shí)執(zhí)行,程序員不需要控制!
由所在環(huán)境執(zhí)行!
比較器!
//var compare = function(a, b){return a - b;} arr.sort(compare);
arr.sort(function(a, b){return a - b;})
事件處理函數(shù):onclick = "calc(12)";
2、自調(diào)函數(shù):匿名函數(shù)自己調(diào)用自己!
當(dāng)函數(shù)不需要重復(fù)使用時(shí),使用匿名函數(shù)自調(diào)。
語(yǔ)法:
(function(參數(shù)...){
方法體;
})(參數(shù)值...);
在函數(shù)定義的位置立即執(zhí)行!

閉包:函數(shù)外使用了不屬于自己的局部變量
何時(shí)使用閉包?保護(hù)局部變量

day10
回顧
1. 閉包
判斷閉包3特點(diǎn):
1. 嵌套函數(shù)
2. 內(nèi)層函數(shù)操作了外層函數(shù)的局部變量
3. 外層函數(shù)將內(nèi)層函數(shù)返回到外部
被全局變量保存住

判斷閉包執(zhí)行結(jié)果:
*1. 外層函數(shù)被調(diào)用幾次,就有幾個(gè)受保護(hù)的局部變量副本
2. 反復(fù)調(diào)用來(lái)自一個(gè)閉包的函數(shù),受保護(hù)的局部變量就變化幾次

正課:
1. 面向?qū)ο?br> 1. 創(chuàng)建自定義對(duì)象
2. ****繼承

1. 面向?qū)ο螅涸诔绦蛑卸际怯靡粋€(gè)對(duì)象來(lái)描述現(xiàn)實(shí)中一個(gè)具體的東西;
現(xiàn)實(shí)中的一個(gè)東西都包含屬性和功能:
屬性:描述一個(gè)東西特點(diǎn)的變量
功能:東西可以執(zhí)行操作
什么是對(duì)象:封裝多個(gè)數(shù)據(jù)的存儲(chǔ)空間
什么是自定義對(duì)象:封裝現(xiàn)實(shí)中一個(gè)東西的屬性和功能的存儲(chǔ)空
間?,F(xiàn)實(shí)中東西的屬性會(huì)成為對(duì)象中的屬性變量。現(xiàn)實(shí)中的東西的功能,會(huì)成為對(duì)象中
的方法(函數(shù))

2. 創(chuàng)建自定義對(duì)象:3種方式:
1. var obj = {'屬性名1':值1,
'屬性名2':值2,
...
'功能名1':function()
{...}};
js中一切都是對(duì)象!所有對(duì)象的底層都是hash數(shù)組

屬性:如何訪問(wèn)屬性:2種:obj.屬性名 obj["屬性名"]
訪問(wèn)對(duì)象中不存在的屬性
(訪問(wèn)數(shù)組中不存在的下標(biāo)):不會(huì)出錯(cuò),返回undefined
強(qiáng)行給不存在屬性賦值,不報(bào)錯(cuò)!js會(huì)自動(dòng)創(chuàng)建同名屬性

如何判斷某個(gè)對(duì)象是否包含指定成員:3種
1. obj.hasOwnProperty("成員名");
2. "屬性名" in 對(duì)象
如果找到,返回true,否則返回false
3. 直接使用 obj.屬性名 作為條件:
arr.indexOf !== undefined
如果不包含,返回undefined ————> false
如果包含,返回值或function ————> true
何時(shí)省略:判斷方法是否存在時(shí),可省略 !==
如果確定屬性值一定
不是null, 0, "", NaN 也可省略

方法:如何在方法中,訪問(wèn)當(dāng)前對(duì)象自己:
****this關(guān)鍵字:運(yùn)行時(shí),指代正在*調(diào)用*方法的對(duì)象
(.前的對(duì)象)
this本質(zhì)是window下唯一的一個(gè)指針,指向當(dāng)前正在
調(diào)用方法的對(duì)象

如何在方法內(nèi),訪問(wèn)當(dāng)前對(duì)象自己的屬性:this.屬性名
**在方法內(nèi)訪問(wèn)當(dāng)前對(duì)象自己的屬性,必須用this.屬性

省略this,默認(rèn)訪問(wèn)活動(dòng)對(duì)象和window中的變量(閉
包除外)

***this和定義在哪無(wú)關(guān)!僅和調(diào)用時(shí)使用的當(dāng)前對(duì)象有
關(guān)
***如果無(wú)主的調(diào)用或復(fù)制,默認(rèn)this都是window!

PM:
正課:
1. ***面向?qū)ο螅豪^承
面向?qū)ο笕筇攸c(diǎn):封裝 繼承 多態(tài)
封裝:將描述同一個(gè)東西的屬性和方法,定義在一個(gè)對(duì)象中
繼承:父對(duì)象中的屬性和方法,子對(duì)象可直接使用
多態(tài):同一個(gè)對(duì)象,在不同情況下,呈現(xiàn)不同的狀態(tài)
重載:同一方法名,傳入?yún)?shù)不同,執(zhí)行不同的操作
重寫(xiě):子對(duì)象覺(jué)得父對(duì)象的成員不好用,可自己定義一
個(gè),覆蓋父對(duì)象的成員

創(chuàng)建對(duì)象:3種:
1. 對(duì)象直接量
var obj = {"屬性名":值, ..., "方法名":function(){...}};

2. var obj = new Object();//創(chuàng)建一個(gè)空對(duì)象
obj.屬性名 = 值;
obj.方法名 = function(){... this.屬性名 ...};

3. 利用構(gòu)造函數(shù)*反復(fù)*創(chuàng)建*相同結(jié)構(gòu)*的對(duì)象
構(gòu)造函數(shù):描述一類(lèi)對(duì)象結(jié)構(gòu)的特殊函數(shù)
2步:
1. 定義構(gòu)造函數(shù)
function 構(gòu)造函數(shù)名|類(lèi)型名(屬性參數(shù)1, ...){
this.屬性名 = 屬性參數(shù)1;
//在當(dāng)前正在創(chuàng)建的對(duì)象中創(chuàng)建一個(gè)屬性名
//賦值為屬性參數(shù)1的值
...
this.方法名 = function(){
...this.屬性名...
}
}
2. 利用構(gòu)造函數(shù)創(chuàng)建對(duì)象
var obj = new 構(gòu)造函數(shù)名|類(lèi)型名(屬性值1, ...);
new:1. 創(chuàng)建一個(gè)空對(duì)象:new obj = {};
2. 利用空對(duì)象,調(diào)用構(gòu)造函數(shù)
構(gòu)造函數(shù)在空對(duì)象中添加屬性和
方法
3. 設(shè)置新對(duì)象的 __proto__ 指向構(gòu)造函數(shù)的
prototype對(duì)象
4. 返回新對(duì)象的地址

繼承:js中一切繼承都是用原型對(duì)象實(shí)現(xiàn)的!
原型對(duì)象:每個(gè)函數(shù)對(duì)象都有一個(gè)原型對(duì)象
構(gòu)造函數(shù)的原型對(duì)象負(fù)責(zé)保存所有子對(duì)象共享的成員!
建議:所有子對(duì)象共享的方法,都應(yīng)定義在構(gòu)造函數(shù)的原型對(duì)象中?!?br>—避免重復(fù)定義方法對(duì)象,浪費(fèi)內(nèi)存。
說(shuō)明:其實(shí)所有內(nèi)置類(lèi)型的API都是定義在類(lèi)型.prototype

擴(kuò)展對(duì)象屬性:2種擴(kuò)展:
1. 擴(kuò)展共有屬性:通過(guò)構(gòu)造函數(shù).prototype添加的屬性
2. 擴(kuò)展自有屬性:通過(guò)某一具體子對(duì)象添加屬性
判斷自有屬性或擴(kuò)展屬性:
1. 判斷自有屬性:obj.hasOwnProperty("屬性名");
2. 判斷共有屬性:"屬性名" in obj && !obj.hasOwnProperty("屬性名")
在原型對(duì)象關(guān)系中包含 且 子對(duì)
象自己*沒(méi)有*

刪除屬性:delete 對(duì)象.屬性名
*僅能刪除當(dāng)前對(duì)象自己的屬性,無(wú)法刪除共有屬性
全局變量:3種
var n = 1; window.n = 1; window["n"] = 1;
不能delete 不能delete 能delete

原型鏈:由各級(jí)對(duì)象的 __proto__ 逐級(jí)繼承形成的關(guān)系
獲得任意對(duì)象的父級(jí)原型對(duì)象:Object.getPrototypeOf(子對(duì)象) =》子對(duì)象.__proto__
檢查對(duì)象的父對(duì)象:父對(duì)象.isPrototypeOf(子對(duì)象);


day11
面向?qū)ο螅悍庋b 繼承 多態(tài)
1. 創(chuàng)建對(duì)象:3種:4種:
1. 直接量:var obj = {"屬性名":值, ..., "方法名":function(){}};
__proto__ ————> Object.prototype
2. new關(guān)鍵字:var obj = new Object();
obj.屬性名 = 值;
...
obj.方法名 = function(){}
3. 使用構(gòu)造函數(shù)反復(fù)創(chuàng)建相同結(jié)構(gòu)的對(duì)象:2步
1. 定義構(gòu)造函數(shù):
function 構(gòu)造函數(shù)名(屬性參數(shù), ...){
this.屬性名 = 屬性參數(shù);
if(!構(gòu)造函數(shù)名.prototype.方法名){
構(gòu)造函數(shù)名.prototype.方法名 =
function(){}
}
}
2. 使用new創(chuàng)建對(duì)象同時(shí),調(diào)用構(gòu)造函數(shù):
var obj = new 構(gòu)造函數(shù)名(屬性值, ...);
4. Object.create(父對(duì)象, {擴(kuò)展屬性的列表對(duì)象});

2. this:指代當(dāng)前正在調(diào)用方法的對(duì)象
this和定義在哪無(wú)關(guān)!僅和調(diào)用時(shí)使用的對(duì)象有關(guān)!
所有無(wú)主(不用var賦值的變量,匿名函數(shù))都是window的

3. 原型,原型鏈,繼承:
原型:保存所有子對(duì)象共有屬性和方法的對(duì)象!
所有函數(shù)都有prototype,指向自己的原型對(duì)象
所有對(duì)象都有 __proto__ ,指向自己父級(jí)原型對(duì)象
所有原型對(duì)象都有constructor,指回原型對(duì)應(yīng)的構(gòu)造函數(shù)

原型鏈:所有父子級(jí)對(duì)象間由 __proto__ 形成的多級(jí)引用關(guān)系
————>*多級(jí)*繼承

原型相關(guān)API:
1. 判斷自有屬性和共有屬性:
1. 判斷自有:obj.hasOwnProperty("屬性名");
2. 判斷原型鏈上的屬性:2種
判斷不包含:if(!("屬性名" in obj/原型))
if(obj.屬性名 === undefined)
if(!obj.屬性名)
3. 僅判斷共有:必須滿足兩個(gè)條件
!obj.hasOwnProperty("屬性名") && obj.屬性名
2. 獲得任意對(duì)象的原型:
obj.__proto__ X
Object.getPrototypeOf(obj)
3. 判斷父對(duì)象是否在子對(duì)象的原型鏈上
父對(duì)象.isPrototypeOf(子對(duì)象)

***檢測(cè)一個(gè)對(duì)象是不是數(shù)組類(lèi)型:4種:
1. Array.prototype.isPrototypeOf(obj);
2. obj instanceof Array
對(duì)象 是不是 構(gòu)造函數(shù) 的實(shí)例
3. obj.constructor == Array 僅判斷直接父級(jí)
4. 利用當(dāng)前對(duì)象,強(qiáng)行調(diào)用原始的toString方法
Object.prototype.toString.call(obj) == "[object Array]"
apply(obj)
繼承:
為什么要繼承:代碼重用!節(jié)省空間!
1. 直接繼承對(duì)象:想方設(shè)法修改對(duì)象的 __proto__ 屬性
3種:
1. 僅修改一個(gè)對(duì)象的 __proto__
Object.setPrototypeOf(子對(duì)象, 父對(duì)象);
2. 通過(guò)修改構(gòu)造函數(shù)的原型對(duì)象,實(shí)現(xiàn)批量修改后續(xù)子對(duì)象的繼承關(guān)系。
構(gòu)造函數(shù).prototype = 父對(duì)象
強(qiáng)調(diào):僅影響之后創(chuàng)建的對(duì)象的繼承關(guān)系
之前創(chuàng)建的對(duì)象依然繼承舊構(gòu)造函
數(shù).prototype
3. var obj = Object.create(父對(duì)象[, {屬性列表}])
創(chuàng)建一個(gè)空對(duì)象,
繼承父對(duì)象中的屬性,
繼承同時(shí)可再擴(kuò)展屬性和方法

2. 僅繼承結(jié)構(gòu):模擬java中的繼承
function 父類(lèi)型構(gòu)造函數(shù)(屬性參數(shù)1, 屬性參數(shù)2){
this.屬性1 = 屬性參數(shù)1;
this.屬性2 = 屬性參數(shù)2;
}

function 子類(lèi)型構(gòu)造函數(shù)(屬性參數(shù)1, 屬性參數(shù)2, 屬性參數(shù)3){
父類(lèi)型構(gòu)造函數(shù).call(this, 屬性參數(shù)1, 屬性參數(shù)2);
this.屬性3 =屬性參數(shù)3;
}

var obj = new 子類(lèi)型構(gòu)造函數(shù)(值1, 值2, 值3);

轉(zhuǎn)自

https://www.cnblogs.com/skorzeny/p/5668527.html

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
「學(xué)習(xí)筆記」JavaScript基礎(chǔ)
JavaScript基礎(chǔ)
JavaScript 基礎(chǔ)四
php、json
javascript快速入門(mén)5
JavaScript的內(nèi)置對(duì)象
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服