乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      javascript筆記

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

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

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

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

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

      ECMAScript標(biāo)準(zhǔn):JavaScript核心語(yǔ)法
      微軟:JScript
      ECMAScript標(biāo)準(zhǔn):一紙空文
      JavaScript和JScript都號(hào)稱完全實(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í)行;弱類型;基于對(duì)象
      如何讓使用:
      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ū)分大小寫!**
      **字符串單雙引號(hào)都行**
      2、單獨(dú)安裝專門的解釋器軟件:node.js Chrome V8
      win+R——>cmd——>node
      退出:兩次Ctrl+c
      執(zhí)行.js文件:1、先cd到.js文件所在路徑
      2、node 文件名 回車
      3、隨網(wǎng)頁(yè)一同運(yùn)行:
      瀏覽器 包含兩種工具:
      排版引擎:專門加載HTML內(nèi)容和CSS樣式
      解釋引擎:專門運(yùn)行js腳本
      <script>元素:專門包含js腳本塊的元素
      <script>中腳本塊何時(shí)運(yùn)行?隨網(wǎng)頁(yè)加載,解釋執(zhí)行
      <script>中都要使用js語(yǔ)法!
      html元素的事件“屬性”中:
      什么是事件?元素可以根據(jù)鼠標(biāo)或鍵盤的不同操作相應(yīng)不同的交互行為。
      charset必須和文件的存儲(chǔ)編碼一致
      <script>解釋執(zhí)行,讀到執(zhí)行。先讀先執(zhí)行?!?lt;script>放置的先后順序影響程序結(jié)
      果。
      優(yōu)化:放在body的最后

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

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

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

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

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

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

      *變量*
      什么是變量??jī)?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 變量名;
      賦值:將等號(hào)右邊的數(shù)據(jù),裝入等號(hào)左邊的變量中!
      如果未賦值:js默認(rèn)賦值為undefined

      命名規(guī)則:見名知意
      保留字、關(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ì)開辟內(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類型?不帶引號(hào)的數(shù)字字面量
      程序中數(shù)字類型的舍入誤差:程序中不能準(zhǔn)確表示1/10,就好像現(xiàn)實(shí)中不能準(zhǔn)確表示
      1/3一樣!
      如何修正:按指定位數(shù)四舍五入:數(shù)字.toFixed(小數(shù)位數(shù))
      今后計(jì)算結(jié)果小數(shù)位數(shù)超長(zhǎng),說明碰到舍入誤差。按位四舍五入。
      精度計(jì)算不要用JavaScript

      string類型:一串字符的序列!
      Unicode:對(duì)所有語(yǔ)言文字中的字符編號(hào)
      Why“因?yàn)橛?jì)算機(jī)只處理數(shù)字,無(wú)法處理文字。
      計(jì)算機(jī)處理unicode編號(hào),就等效于處理編號(hào)對(duì)應(yīng)的文字。
      轉(zhuǎ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類型:僅有兩個(gè)值的特殊數(shù)據(jù)類型:true,false
      何時(shí)使用boolean?只要一個(gè)值只有真假兩種情況,就用boolean類型

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

      原始類型的大小:
      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)存中開辟一塊空間
      賦值:變量名=值——>將值保存到左邊的變量空間中備用
      使用:使用變量名,就等效于直接使用變量中的數(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("提示信息"):專門用于請(qǐng)求用戶輸入數(shù)據(jù),收集數(shù)據(jù)的對(duì)話框!
      var str = prompt("提示信息");
      *凡是從頁(yè)面上獲得的數(shù)據(jù),都是字符串!必須先轉(zhuǎn)換再計(jì)算*

      什么是運(yùn)算符:程序模擬人類運(yùn)算的特殊符號(hào)
      算數(shù)運(yùn)算:-任意類型做-,都會(huì)被轉(zhuǎn)為數(shù)據(jù)類型
      如果有參數(shù),不能自動(dòng)轉(zhuǎn)換為數(shù)字,則返回NaN
      如果除數(shù)為0:Infinity——>無(wú)窮大
      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)算:判斷大?。l件判斷中使用
      結(jié)果:成立:true,不成立:false
      *自帶隱式類型轉(zhuǎn)換*
      字符串參與運(yùn)算:從第一個(gè)字符開始,取出每個(gè)字符 PK unicode編號(hào)
      "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類型繼承來(lái)的
      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):專門用來(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)換為相同類型,再比較
      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)?,進(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ò)誤的情況:*沒聲明的變量,只要使用就出錯(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ù)使用,就封裝為方法
      語(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í)行完立刻銷毀!

      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é)符號(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ù)通過url發(fā)送時(shí),都要先編碼再發(fā)送
      decodeURIComponent( kword );對(duì)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)部使用!方法外無(wú)法訪問方法的參數(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)換
      語(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í)行。
      沒有循環(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開始位置“聲明”!

      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ù)雜問題:
      先用簡(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ù)都是批量分類管理
      何時(shí)使用:只要批量管理多個(gè)數(shù)據(jù),就要用數(shù)組保存
      如何使用:創(chuàng)建,初始化,訪問數(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ù)類型

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

      其他數(shù)組創(chuàng)建語(yǔ)法: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è)變量沒有指向任何對(duì)象
      何時(shí)使用null:主動(dòng)釋放對(duì)象!主動(dòng)釋放的對(duì)象不能被找回
      null vs undefined:
      null專用于主動(dòng)釋放對(duì)象!
      undefined:專用于自動(dòng)初始化任何未賦值的變量

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

      訪問數(shù)組:數(shù)組一組變量的集合。
      如何獲得其中一個(gè)變量/數(shù)據(jù):下標(biāo),數(shù)組中唯一標(biāo)識(shí)一個(gè)元素的序號(hào)。從0開始。最后
      一個(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ù)
      訪問任意數(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)可以自定義名稱!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:專門遍歷關(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):大括號(hào)
      {"key1":"value1", "key2":"value2", ...}

      冒泡排序:[3, 5, 3,。。]:見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開始,到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ù)組,只不過用一對(duì)方法模擬了棧的操作!
      棧:只能從數(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ù)組對(duì)象!
      創(chuàng)建二位數(shù)組:創(chuàng)建普通數(shù)組,完全一樣!
      只不過將普通元素,換為一個(gè)數(shù)組對(duì)象而已
      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ù)包含明顯上下級(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ì)象中封裝了專門的數(shù)據(jù)和操作數(shù)據(jù)常用的API。
      JavaScript中內(nèi)置對(duì)象:
      String,Boolean,Number,Array,Date,Math,Error,Function,Object,Global

      包裝類型
      什么是包裝類型?專門封裝原始類型的數(shù)據(jù),并提供對(duì)數(shù)據(jù)常用操作的內(nèi)置類型。
      為什么要用包裝類型?讓原始類型的數(shù)據(jù)也可以像引用類型一樣,擁有方法和屬性。
      JavaScript中的包裝類型有三個(gè):
      String類型,Number類型,Boolean類型
      何時(shí)使用包裝類型?只要用原始類型的數(shù)據(jù)調(diào)用方法或訪問屬性,js引擎都會(huì)自動(dòng)創(chuàng)建
      對(duì)應(yīng)的包裝類型對(duì)象。
      方法調(diào)用完,包裝類型對(duì)象自動(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)建引用類型字符串對(duì)象:
      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)置對(duì)象:見PPT
      包裝類型:見PPT
      var num = 5.678;//原始類型
      //num = new Number(num);//包裝類型
      console.log(num.toFixed(2));
      //num = null;//釋放包裝類型對(duì)象!

      創(chuàng)建字符串:原始類型還是包裝類型?是否new
      var str = "...";//原始類型
      var str = String("...");//原始類型,類型轉(zhuǎn)換
      **********************************************
      var strObj = new String("...");//包裝類型對(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屬性
      *字符串類型底層其實(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)化:*頻繁對(duì)字符串+=,要用數(shù)組代替!不會(huì)產(chǎn)生中間對(duì)象*
      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 = "女神說要來(lái),我草草的收拾了房間。結(jié)果她又說不來(lái)了。我說:我草";
      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)容,無(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)槠胀ㄗ?
      符匹配。

      -符號(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):開頭^:除了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á)式的開頭,表示以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ú)
      (\.\w+)+
      “.字母”組合至少出現(xiàn)1次

      RegExp對(duì)象:專門封裝一條正則表達(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)證通過:返回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屬性:表示下次開始匹配的位置!

      查找:僅判斷有沒有,或者僅查找位置: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è)圓括號(hào)
      強(qiáng)調(diào):分組從1開始
      必須通過RegExp類型,直接調(diào)用$n,不能使用對(duì)象!

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

      trim功能:去除字符串開始和結(jié)尾的空格。中間空格不去除!
      對(duì)輸入字符串的處理,多數(shù)要先清除開頭結(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類型:封裝了所有數(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類型對(duì)象; 2.自動(dòng)獲得瀏覽器當(dāng)前時(shí)間點(diǎn)!
      自定義時(shí)間:var date = new Date("2015-6-9 16:47");
      1.創(chuàng)建Date類型對(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.命名:年/月/日 沒有s,時(shí),分,秒 有s
      3.取值、賦值:除了每月中的日之外,其余都是從0開始,到-1結(jié)束
      每月中的日,從1開始,帶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類型 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ò)誤對(duì)象的父類型
      6種子類型:EvalError,
      RangeError:參數(shù)超出范圍
      比如:num.toFixed(n) n<0 拋出RangeError
      ReferenceError:引用錯(cuò)誤:找不到對(duì)象
      比如:只要使用未聲明的變量時(shí),都要拋出ReferenceError
      SyntaxError:語(yǔ)法錯(cuò)誤!修改源代碼就可以解決!
      TypeError:錯(cuò)誤的使用了類型和類型的方法!
      URIError:URI錯(cuò)誤
      如何處理錯(cuò)誤:
      try{
      可能出錯(cuò)的代碼
      }catch(err){只要拋出錯(cuò)誤,都要?jiǎng)?chuàng)建一個(gè)Error對(duì)象
      錯(cuò)誤處理的代碼
      1.獲得錯(cuò)誤信息:err.name 類型
      2.根據(jù)錯(cuò)誤的類型,執(zhí)行不同的處理
      }[finally{可有可無(wú)
      //程序中使用了大對(duì)象!一樣要在finally中主動(dòng)釋放
      無(wú)論是否出錯(cuò),都必須執(zhí)行的代碼
      }]

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

      主動(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ǔ)法不支持,但是可以通過 arguments對(duì)象 模擬重載效果

      arguments對(duì)象:方法對(duì)象中保存所有參數(shù)的類數(shù)組對(duì)象
      類數(shù)組對(duì)象(object like array):長(zhǎng)的像數(shù)組的對(duì)象
      *方法內(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)。
      語(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ù)組

      屬性:如何訪問屬性:2種:obj.屬性名 obj["屬性名"]
      訪問對(duì)象中不存在的屬性
      (訪問數(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 也可省略

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

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

      省略this,默認(rè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í)行不同的操作
      重寫:子對(duì)象覺得父對(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ù):描述一類對(duì)象結(jié)構(gòu)的特殊函數(shù)
      2步:
      1. 定義構(gòu)造函數(shù)
      function 構(gòu)造函數(shù)名|類型名(屬性參數(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ù)名|類型名(屬性值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ì)象中。———
      —避免重復(fù)定義方法對(duì)象,浪費(fèi)內(nèi)存。
      說明:其實(shí)所有內(nèi)置類型的API都是定義在類型.prototype

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

      刪除屬性: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ù)組類型: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. 通過修改構(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 父類型構(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)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多