日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

javascript筆記

 一本正經(jīng)地胡鬧 2019-05-24

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

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

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

布蘭登艾奇:4門語言拼湊出——JavaScript

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

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

JavaScript=ECMAScript+DOM+BOM

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

undefined類型:表示一個(gè)變量僅聲明過,但從未賦值。所有未賦值的變量,默認(rèn)值都
是undefined。
undefined類型的值還是undefined!

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


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

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

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

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

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

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

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

什么是運(yùn)算符:程序模擬人類運(yùn)算的特殊符號
算數(shù)運(yùn)算:-任意類型做-,都會(huì)被轉(zhuǎn)為數(shù)據(jù)類型
如果有參數(shù),不能自動(dòng)轉(zhuǎn)換為數(shù)字,則返回NaN
如果除數(shù)為0:Infinity——>無窮大
typeof(x):判斷任意數(shù)據(jù)的類型
被除數(shù)%除數(shù)——模運(yùn)算:被除數(shù)/除數(shù),取除不盡的余數(shù)
何時(shí)用:限制一個(gè)數(shù)不能超過某個(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)算:判斷大小!條件判斷中使用
結(jié)果:成立:true,不成立:false
*自帶隱式類型轉(zhuǎn)換*
字符串參與運(yùn)算:從第一個(gè)字符開始,取出每個(gè)字符 PK unicode編號
"Hello" H e(101)
"Hi" H i(105)
關(guān)系運(yùn)算中:任何類型和數(shù)字比較,都轉(zhuǎn)為數(shù)字,再比較
布爾類型參與關(guān)系運(yùn)算,始終轉(zhuǎn)為數(shù)字比較

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

NaN做==:
isNaN(x):專門用來判斷一個(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)換為相同類型,再比較
2、undefined,就用===
3、NaN,就用isNaN(x)

邏輯運(yùn)算:基于多組關(guān)系運(yùn)算,得出一個(gè)結(jié)論
&&:而且
||:或者
?。悍牵嵉箃rue和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é)果就是等號右邊表達(dá)式的結(jié)果
擴(kuò)展的賦值表達(dá)式:對已有的數(shù)據(jù)計(jì)算的同時(shí),將結(jié)果再存回變量
何時(shí)使用:修改原變量值

三目運(yùn)算:根據(jù)不同條件,動(dòng)態(tài)返回不同結(jié)果!
三目:至少需要3個(gè)表達(dá)式。
語法:
一個(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)?,進(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è)條件之后的++/--提取出來

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

函數(shù)(方法):封裝執(zhí)行一項(xiàng)專門任務(wù)的步驟的代碼序列
何時(shí)定義方法?只要發(fā)現(xiàn)一段代碼重復(fù)使用,就封裝為方法
語法:聲明
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中一切賦值都是值傳遞!

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

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

PM
問題:
方法參數(shù):依據(jù)方法內(nèi)部的處理邏輯至少需要幾個(gè)數(shù)據(jù)才能正常執(zhí)行。
方法參數(shù)和外部定義了了那些變量沒有任何關(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é)符號——編碼
decodeURI( kword ):將encodeURI轉(zhuǎn)后的字符串,轉(zhuǎn)換為原文——解碼
unicode編碼:每個(gè)字符2字節(jié)
utf-8:字母、數(shù)字單字節(jié),漢字3字節(jié)

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

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

eval():專門執(zhí)行字符串格式代碼

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

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

分支結(jié)構(gòu):程序運(yùn)行過程中,可以根據(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)部使用!方法外無法訪問方法的參數(shù)變量
參數(shù)名稱自定義!
返回值:調(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)類型轉(zhuǎn)換
語法: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í)行。
沒有循環(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)退出的趨勢變化
(不滿足循環(huán)條件的趨勢)——循環(huán)計(jì)數(shù)器
3、循環(huán)體:每次循環(huán)要做的事情

while循環(huán):當(dāng)滿足條件時(shí),就繼續(xù)循環(huán)做...事
語法:
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開始位置“聲明”!

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

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

遇到復(fù)雜問題:
先用簡單辦法做最簡單的事情。
從簡單辦法中找規(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ù)都是批量分類管理
何時(shí)使用:只要批量管理多個(gè)數(shù)據(jù),就要用數(shù)組保存
如何使用:創(chuàng)建,初始化,訪問數(shù)組中的數(shù)據(jù)
創(chuàng)建:數(shù)組都是用[]創(chuàng)建出來的。
var arr = [];——>創(chuàng)建了一個(gè)數(shù)組對象,數(shù)組中包含0個(gè)元素
var arr = [90, 34, 23];——>創(chuàng)建了一個(gè)數(shù)組對象,數(shù)組中連續(xù)存儲(chǔ)3個(gè)元素
2個(gè)不限制:1、不限制元素的個(gè)數(shù)! 2、不限制元素?cái)?shù)據(jù)類型

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

其他數(shù)組創(chuàng)建語法:var arr = new Array(num);
new:要在堆中開辟空間!
Array:ECMAScript標(biāo)準(zhǔn)的內(nèi)置類型
new Array:在堆中創(chuàng)建一個(gè)數(shù)組類型的存儲(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è)變量沒有指向任何對象
何時(shí)使用null:主動(dòng)釋放對象!主動(dòng)釋放的對象不能被找回
null vs undefined:
null專用于主動(dòng)釋放對象!
undefined:專用于自動(dòng)初始化任何未賦值的變量

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

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

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

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

下午:
棧中的變量 生命周期:和堆完全不同
var a = 5;//全局變量隨網(wǎng)頁生命周期
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ù)組遍歷:對數(shù)組中每個(gè)元素執(zhí)行相同的操作
for(var i = 0; i < arr.length; i++){
arr[i]——>當(dāng)前元素
}

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

冒泡排序:[3, 5, 3,。。]:見array.html

數(shù)組常用方法:
x.toString()方法:任何對象都有toString方法
默認(rèn)用,分割每個(gè)元素
將任何對象轉(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ù)組對象*

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

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

拼接和截?。簐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è)對象!方法名就是指向?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);注意!將方法作為對象傳遞是,僅使用方法名,后不加圓
括號。

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

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

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

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

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

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

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

 

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

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

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

字符串內(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屬性
*字符串類型底層其實(shí)都是用字符數(shù)組實(shí)現(xiàn)的*
比如:str[i]

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

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

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

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

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

字符串三大操作:1.查找關(guān)鍵字! 2.替換關(guān)鍵字 3.獲取子字符串
查找關(guān)鍵字:var index = str.indexOf("關(guān)鍵字");
返回關(guān)鍵字所在位置!*如果沒找到,返回-1!*
indexOf:懶:只找第一個(gè)關(guān)鍵字位置!
蠢:默認(rèn)只能從位置0開始!
var index = str.indexOf("關(guān)鍵字", from);
from:開始查找的位置,從from開始向后查找
一句話辦幾件事時(shí),可以把表達(dá)式當(dāng)值用!
var str = "女神說要來,我草草的收拾了房間。結(jié)果她又說不來了。我說:我草";
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:開始查找的位置,從from開始向前查找
*返回的index完全相同!字符在數(shù)組中的下標(biāo)是固定的!*
2處修改:index從str.length開始;每次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í):判斷字符的種類:unicode范圍:
48-57:0-9 數(shù)字字符
65-90:A-Z 大寫字母
97-122: a-z 小寫字母
19968-40869:漢字

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

String類型中,提供了專門支持模式匹配的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)容,無法確定每個(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)頁中只要處理字符串的格式,就要用正則表達(dá)式
*正則表達(dá)式*
什么是正則達(dá)表示:字符串中字符出現(xiàn)的規(guī)律
何時(shí)使用正則表達(dá)式?驗(yàn)證字符串格式,查找關(guān)鍵字,替換關(guān)鍵字
比如:銀行卡查詢密碼:6位數(shù)字
用戶名:字母,數(shù)字,_的組合

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

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

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

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

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

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

 

day08
回復(fù):
[]:備選字符集,只能多選一。一個(gè)[]只能匹配一位字符
比如:我[去草]:我去 我草
[]內(nè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ī)號碼:\d{3,4}-\d{7,8}

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

*:可有可無,不限制出現(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)證身份證號:\d{15}(\d{2}[0-9xX])?
驗(yàn)證手機(jī)號:(\+86)?\s+1[3578]\d{9}

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

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

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

RegExp對象:專門封裝一條正則表達(dá)式,提供使用正則表達(dá)式的常用API
如何使用RegExp對象:1.創(chuàng)建 2.調(diào)用API
v如何創(chuàng)建正則表達(dá)式對象:ar regExp = /正則表達(dá)式/ig;
API:
驗(yàn)證:var boolean = regExp.test("被檢查的字符串");
如果驗(yàn)證通過:返回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對象的lastIndex屬性!
regExp對象的lastIndex屬性:表示下次開始匹配的位置!

查找:僅判斷有沒有,或者僅查找位置: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è)字符開始,向后擴(kuò)展范圍

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

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

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

String總結(jié):所有的API都無法修改原字符串,都會(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對象總結(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è)分組(圓括號)匹配的子字符串

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

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

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

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

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

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

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

 


day09
回顧:
Date對象:內(nèi)部封裝了一個(gè)毫秒數(shù)
創(chuàng)建日期對象:
var date = new Date("2016/7/4");PPT上 new Date("2016-7-4");僅兼容chrome
API
1.每個(gè)分量都有一對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.*直接修改原日期對象*
如何保留原日期對象?先new出新Date對象,再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類型 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ò)誤類型:Error類型:所有錯(cuò)誤對象的父類型
6種子類型:EvalError,
RangeError:參數(shù)超出范圍
比如:num.toFixed(n) n<0 拋出RangeError
ReferenceError:引用錯(cuò)誤:找不到對象
比如:只要使用未聲明的變量時(shí),都要拋出ReferenceError
SyntaxError:語法錯(cuò)誤!修改源代碼就可以解決!
TypeError:錯(cuò)誤的使用了類型和類型的方法!
URIError:URI錯(cuò)誤
如何處理錯(cuò)誤:
try{
可能出錯(cuò)的代碼
}catch(err){只要拋出錯(cuò)誤,都要?jiǎng)?chuàng)建一個(gè)Error對象
錯(cuò)誤處理的代碼
1.獲得錯(cuò)誤信息:err.name 類型
2.根據(jù)錯(cuò)誤的類型,執(zhí)行不同的處理
}[finally{可有可無
//程序中使用了大對象!一樣要在finally中主動(dòng)釋放
無論是否出錯(cuò),都必須執(zhí)行的代碼
}]

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

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

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

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

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

3.使用匿名函數(shù)賦值的方式定義方法:
匿名函數(shù):沒有方法名的函數(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)。
語法:
(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)用來自一個(gè)閉包的函數(shù),受保護(hù)的局部變量就變化幾次

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


day11
面向?qū)ο螅悍庋b 繼承 多態(tài)
1. 創(chuàng)建對象: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)的對象: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)建對象同時(shí),調(diào)用構(gòu)造函數(shù):
var obj = new 構(gòu)造函數(shù)名(屬性值, ...);
4. Object.create(父對象, {擴(kuò)展屬性的列表對象});

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

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

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

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

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

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

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

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

轉(zhuǎn)自

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多