javascript筆記

是什么

  • 一門(mén)腳本語(yǔ)言
  • 一門(mén)解釋型語(yǔ)言
  • 動(dòng)態(tài)類型語(yǔ)言
  • 基于對(duì)象的語(yǔ)言
  • 弱類型語(yǔ)言

使用場(chǎng)景

  • 網(wǎng)頁(yè)特效
  • 服務(wù)端開(kāi)發(fā)
  • 命令行工具
  • 桌面程序
  • APP
  • 控制硬件——物聯(lián)網(wǎng)
  • 游戲開(kāi)發(fā)

區(qū)別

  • HTML

    標(biāo)記語(yǔ)言袱箱,展示數(shù)據(jù)

  • CSS

    美化頁(yè)面

  • JavaScript

    動(dòng)態(tài)效果邀杏,與用戶的交互

組成

變量

作用

儲(chǔ)存數(shù)據(jù)或操作數(shù)據(jù)

聲明與初始化

聲明

? var num (此時(shí)沒(méi)有賦值)

初始化

? var num = 10 (此時(shí)賦值)

方式:

? var 變量名字

注意:

  • 以下說(shuō)法一個(gè)意思:

          聲明變量并初始化
          
          變量的初始化
      
          聲明變量賦值
    
  • 可以一次初始化多個(gè)值

    var num1 = 10, num2 = 20, num3 = 30

命名規(guī)范

  • 區(qū)分大小寫(xiě)
  • 第一個(gè)字符必須是字母忿墅、下劃線、或者 $
  • 后面的字符可以是數(shù)字兑徘、字母贞瞒、下劃線叼旋、$
  • 變量的名字要有意義
  • 一般都是小寫(xiě)刃麸,并采用駝峰式
  • 不能使用關(guān)鍵字
  • 字符串可用單引號(hào)也可用雙引號(hào)

交換變量小案例

思路一:使用第三方變量

思路二:一般適用于數(shù)字交換(計(jì)算方式)

注釋

單行注釋:// 一般用在一行代碼上

多行注釋:/**/ 一般用在函數(shù)或者一段代碼上

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

原始數(shù)據(jù)類型

  • number(數(shù)字類型:整數(shù)和小數(shù))

  • string(字符串類型)

  • boolean (布爾類型)

  • null (空類型)

    值只有一個(gè):null,一個(gè)對(duì)象指向?yàn)榭?/p>

  • undefined (未定義)

    值只有一個(gè):undefined酪我,

    如果聲明了變量但是沒(méi)有賦值的情況下就會(huì)是undefined

  • object (對(duì)象)

獲取變量的數(shù)據(jù)類型

  • typeof 變量名

  • typeof(變量名)

    var num = 10
    console.log(typeof(num))
    console.log(typeof num)
    

數(shù)字類型

整數(shù)和小數(shù)

JS中可以表示

八進(jìn)制:0開(kāi)頭

十進(jìn)制

十六進(jìn)制:0x開(kāi)頭

數(shù)字類型有范圍

最大值 Number.MAX_VALUE

最小值 Number.MIN_VALUE

數(shù)值判斷

NaN:not a number

isNaN:is not a number

注意

不要用小數(shù)去驗(yàn)證小數(shù)

不要用NaN驗(yàn)證是不是NaN (使用isNaN())

字符串類型

獲取字符串長(zhǎng)度:

  • .length(包括空格)

JS中的轉(zhuǎn)義符:

轉(zhuǎn)義序列 字符
\b 退格
\f 走紙換頁(yè)
\n 換行
\r 回車(chē)
\t 橫向跳格 (Ctrl-I)
' 單引號(hào)
" 雙引號(hào)
\ 反斜杠

字符串拼接

使用‘+’號(hào)消痛,將多個(gè)字符串拼為一個(gè)

一個(gè)字符串和其他數(shù)字拼接,最終結(jié)果是字符串

數(shù)字類型的字符串和一個(gè)數(shù)字類型的數(shù)字相加得到的是數(shù)字類型的數(shù)字(發(fā)生了隱式轉(zhuǎn)換)

布爾類型

只有兩個(gè)值都哭,true & false

類型轉(zhuǎn)換

其他類型轉(zhuǎn)數(shù)字類型

  • parseInt() 轉(zhuǎn)整數(shù)
  • parseFloat() 轉(zhuǎn)小數(shù)
  • Number() 轉(zhuǎn)數(shù)字 (包括整數(shù)和小數(shù))

其他類型轉(zhuǎn)字符串類型

  • .toString() 變量有意義

  • String() 變量沒(méi)有意義

    var num = 10
    console.log(num.toString())
    console.log(String(num))
    

其他類型轉(zhuǎn)布爾類型

Boolean()

console.log(Boolean(1)) // true

console.log(Boolean(0)) //false

操作符

含義:一些符號(hào)秩伞,用來(lái)計(jì)算

算數(shù)運(yùn)算符

  • /
  • %

一元運(yùn)算符

這個(gè)操作符只需要一個(gè)操作數(shù)就可以運(yùn)算的符號(hào)

  • ++

    • 前++ 前--

      先參與運(yùn)算,運(yùn)算結(jié)束后再加1

      num++ +10 num的值為10

    • 后++ 后--

      自身先加1欺矫,然后再參與運(yùn)算

      ++num +10 num的值為11

  • --

二元運(yùn)算符

類似于算數(shù)運(yùn)算符

需要兩個(gè)操作數(shù)才能運(yùn)算

三元運(yùn)算符

表達(dá)式1 > 表達(dá)式2 纱新?表達(dá)式3 :表達(dá)式4

符合運(yùn)算符

由復(fù)合運(yùn)算符連接起來(lái)的表達(dá)式

  • +=
  • -=
  • *=
  • /=
  • %=

關(guān)系運(yùn)算符

結(jié)果是布爾類型

  • ">"
  • "<"
  • ">="
  • "<="
  • "=="(不嚴(yán)格)(數(shù)據(jù)類型不用一致)
  • "==="(嚴(yán)格)(數(shù)據(jù)類型必須一致)
  • "!="
  • "!=="

邏輯運(yùn)算符

結(jié)果是布爾類型

  • &&(并且)
  • ||(或者)
  • !(非)

賦值運(yùn)算符

=

字面量

把一個(gè)值直接賦值給一個(gè)變量

變量的初始化就是以字面量的方式賦值

var num = 10
var flag = true
var str = 'haha'

//以上方式都叫字面量

流程控制

  • 順序結(jié)構(gòu)
  • 分支結(jié)構(gòu)
    • if
    • if-else
    • if-else if-else.......(最后的else可以不用寫(xiě))(一般是范圍的判斷)
    • switch-case(default后面的break可以省略)(一般是值得判斷)
    • 三元表達(dá)式
      • 兩個(gè)分支穆趴,最終的結(jié)果是其中之一
      • 運(yùn)算符號(hào): 脸爱? :
      • 大多數(shù)情況,使用if-else的語(yǔ)句都可以使用三元表達(dá)式
  • 循環(huán)結(jié)構(gòu)
    • while (先判斷后循環(huán)未妹,可能一次循環(huán)都沒(méi)有)
    • do-while(先循環(huán)一次簿废,再判斷,最少有一次循環(huán))
    • for
    • for-in

關(guān)鍵字

break

如果在循環(huán)中使用络它,遇到了break族檬,則立刻跳出當(dāng)前所在循環(huán)

continue

在循環(huán)中如果遇到了continue關(guān)鍵字,直接開(kāi)始下一次循環(huán)

數(shù)組

概念化戳、作用

  • 一組有序的數(shù)據(jù)
  • 可以一次性存儲(chǔ)多個(gè)數(shù)據(jù)

創(chuàng)建方式

  • 構(gòu)造函數(shù)
    • var 數(shù)組名 = new Array() //空數(shù)組
    • 數(shù)組的名字如果直接輸出,那么直接就可以把數(shù)組中的數(shù)據(jù)顯示出來(lái),如果沒(méi)有數(shù)據(jù),就看不到數(shù)據(jù)
    • 如果數(shù)組中沒(méi)有數(shù)據(jù),但是有長(zhǎng)度---,數(shù)組中的每個(gè)值就是undefined
    • 構(gòu)造函數(shù)的方式創(chuàng)建數(shù)組的時(shí)候,如果在Array(一個(gè)數(shù)字)--->數(shù)組的長(zhǎng)度(數(shù)組元素的個(gè)數(shù)) var num = new Arrey(5) //表示這個(gè)數(shù)組的長(zhǎng)度為5单料,有5個(gè)元素,每個(gè)數(shù)據(jù)是undefined
    • 如果在Array(多個(gè)值);這個(gè)數(shù)組中就有數(shù)據(jù)了,數(shù)組的長(zhǎng)度就是這些數(shù)據(jù)的個(gè)數(shù)
  • 字面量
    • var 數(shù)組名 = [] //空數(shù)組
    • 無(wú)論是構(gòu)造函數(shù)的方式還是字面量的方式,定義的數(shù)組,如果有長(zhǎng)度,那么默認(rèn)是undefined

數(shù)組元素

數(shù)組中存儲(chǔ)的每個(gè)數(shù)據(jù),都可以叫數(shù)組的元素,比如:存儲(chǔ)了3個(gè)數(shù)據(jù),數(shù)組中3個(gè)元素

數(shù)組長(zhǎng)度

就是數(shù)組的元素的個(gè)數(shù),比如有3個(gè)元素,就說(shuō),這個(gè)數(shù)組的長(zhǎng)度是3

數(shù)組索引(下標(biāo))

數(shù)組索引(下標(biāo)):用來(lái)存儲(chǔ)或者訪問(wèn)數(shù)組中的數(shù)據(jù)的,索引從0開(kāi)始,到長(zhǎng)度減1結(jié)束

數(shù)組的索引和數(shù)組的長(zhǎng)度的關(guān)系

數(shù)組長(zhǎng)度減1就是最大的索引值

設(shè)置數(shù)組中某個(gè)位置的值

arr[3] = 100 //arr數(shù)組中索引為3的位置值為100

獲取數(shù)組中某個(gè)位置的值

var result = arr[3];

console.log(result)

數(shù)組中儲(chǔ)存的類型可以不一樣

  • 例1.數(shù)組的函數(shù)調(diào)用
var arr = [
        function () {
            console.log("eat")
        },
        function () {
            console.log("sleep")
        },
        function () {
            console.log("play")
        },
        function () {
            console.log("drink")
        },
    ];

    arr.forEach(function (ele) {
        ele();
    })

冒泡排序

把所有的數(shù)據(jù)按照一定的順序進(jìn)行排列(從小到大点楼,從大到猩狻)

函數(shù)

把一坨重復(fù)的代碼封裝,在需要的時(shí)候直接調(diào)用即可

作用:代碼重復(fù)調(diào)用

定義:function 函數(shù)名字() {
        函數(shù)體
}

調(diào)用:函數(shù)名()

注意:

  • 函數(shù)需要先定義掠廓,然后才能使用
  • 函數(shù)的名字:要遵循駝峰命名法
  • 函數(shù)一旦重名藏斩,后面的會(huì)把前面的覆蓋
  • 一個(gè)函數(shù)最好就是只有一個(gè)功能

函數(shù)參數(shù)

  • 在函數(shù)定義的時(shí)候,函數(shù)名字后面的小括號(hào)里的變量就是參數(shù),目的是函數(shù)在調(diào)用的時(shí)候,對(duì)用戶傳進(jìn)來(lái)的值操作,此時(shí)函數(shù)定義的時(shí)候后面的小括號(hào)里的變量叫參數(shù);寫(xiě)了兩個(gè)變量,就有兩個(gè)參數(shù),
  • 在函數(shù)調(diào)用的時(shí)候,按照提示的方式,給變量賦值--->就叫傳值,這個(gè)值就傳到了變量(參數(shù))中
  • 形參:函數(shù)在定義的時(shí)候小括號(hào)里的變量叫形參
  • 實(shí)參:函數(shù)在調(diào)用的時(shí)候小括號(hào)里傳入的值叫實(shí)參,實(shí)參可以是變量也可以是值

函數(shù)的返回值

  • 在函數(shù)內(nèi)部有return關(guān)鍵字,并且在關(guān)鍵字后面有內(nèi)容,這個(gè)內(nèi)容被返回了
  • 當(dāng)函數(shù)調(diào)用之后,需要這個(gè)返回值,那么就定義變量接收,即可
  • 如果一個(gè)函數(shù)中有return却盘,那么這個(gè)函數(shù)就有返回值狰域,如果一個(gè)函數(shù)中沒(méi)有return,那么這個(gè)函數(shù)就沒(méi)有返回值
  • 如果一個(gè)函數(shù)中沒(méi)有明確的返回值,那么調(diào)用的時(shí)候接收了,結(jié)果就是undefined
    • 沒(méi)有明確返回值:
      • 函數(shù)中沒(méi)有return
      • 函數(shù)中有return,但是return后面沒(méi)有任何內(nèi)容
  • 形參的個(gè)數(shù)和實(shí)參的個(gè)數(shù)可以不一致
  • return 下面的代碼是不會(huì)執(zhí)行的

arguments對(duì)象

定義一個(gè)函數(shù),如果不確定用戶是否傳入了參數(shù)黄橘,或者說(shuō)不知道用戶傳入了幾個(gè)參數(shù)兆览,沒(méi)辦法計(jì)算

但是,如果在函數(shù)中知道了參數(shù)的個(gè)數(shù)塞关,也知道了每個(gè)參數(shù)的值抬探,就可以計(jì)算,怎么辦呢帆赢?

使用arguments對(duì)象小压,可以獲取傳入的每個(gè)參數(shù)的值

arguments對(duì)象也可以叫做偽數(shù)組

函數(shù)的命名方式

  • 命名函數(shù)
    • 函數(shù)有名字
  • 匿名函數(shù)
    • 函數(shù)沒(méi)有名字

函數(shù)的定義

  • 聲明函數(shù)——函數(shù)定義

    • function 函數(shù)名 (){}
  • 函數(shù)表達(dá)式

    • 把一個(gè)函數(shù)給一個(gè)變量

      var f1 = function(){}

    • 如果是函數(shù)表達(dá)式,那么前面的變量中存儲(chǔ)的就是一個(gè)函數(shù)椰于,而這個(gè)變量就相當(dāng)于是一個(gè)函數(shù)怠益,就可以直接加小括號(hào)用

    • 注意:函數(shù)表達(dá)式,賦值結(jié)束后瘾婿,要加分號(hào)

    • 注意:函數(shù)聲明如果放在if-else的語(yǔ)句中,在IE8的瀏覽器中會(huì)出現(xiàn)問(wèn)題蜻牢,以后寧愿用函數(shù)表達(dá)式,都不用函數(shù)聲明


   if(true){
     function f1() {
       console.log("哈哈,我又變帥了");
     }
   }else{
     function f1() {
       console.log("小蘇好猥瑣");
     }
   }
   f1();//在IE8中輸出`小蘇好猥瑣`
var ff;
    if(true){
      ff=function () {
        console.log("哈哈,我又變帥了");
      };
    }else{
      ff=function () {
        console.log("小蘇好猥瑣");
      };
    }
    ff();
  • 函數(shù)自調(diào)用

    • 沒(méi)有名字,直接調(diào)用偏陪,一次性

    函數(shù)也是一種數(shù)據(jù)類型

    可以通過(guò)typeof查看

    數(shù)據(jù)類型是 function

函數(shù)作為參數(shù)使用

函數(shù)可以作為參數(shù)使用抢呆,如果一個(gè)函數(shù)作為參數(shù),那么我們說(shuō)這個(gè)參數(shù)(函數(shù))叫回調(diào)函數(shù)

只要是看到了一個(gè)函數(shù)作為參數(shù)使用了笛谦,那就是回調(diào)函數(shù)

函數(shù)作為返回值使用

function f1() {
    console.log("this is a function ");
    return function () {
        console.log("this is another function");
    }
}

var ff = f1();  // "this is a function "
ff()    // "this is another function"

函數(shù)的作用域

  • 全局變量
    • 聲明的變量使用var聲明的
    • 全局變量可以在頁(yè)面的任何位置使用
    • 除了函數(shù)以外抱虐,其他任何位置定義的變量都是全局變量
    • 如果頁(yè)面不關(guān)閉,那么就不會(huì)釋放饥脑,就會(huì)占空間恳邀,消耗內(nèi)存
  • 局部變量
    • 在函數(shù)內(nèi)部定義的變量
  • 隱式全局變量:
    • 聲明的變量沒(méi)有var
    • 可以被刪除(全局變量則不可以)delete
  • 全局作用域
    • 全局變量的使用范圍
  • 局部作用域
    • 局部變量的使用范圍
  • 塊級(jí)作用域
    • 一對(duì)大括號(hào)就可以看成是一塊,在這塊區(qū)域中應(yīng)以的變量好啰,只能在這個(gè)區(qū)域中使用轩娶,但是在js中在這個(gè)塊級(jí)作用域中定義的變量,外面也能使用
    • js沒(méi)有塊級(jí)作用域

預(yù)解析

提前解析代碼

  • 把變量的聲明提前
  • 把函數(shù)的聲明提前
  • -提前到當(dāng)前所在作用域的最上面
  • 注意:變量的提升框往,只會(huì)在當(dāng)前的作用域中提升鳄抒,函數(shù)中的變量只能提升到當(dāng)前作用域的最前面,不會(huì)出去
  • 預(yù)解析會(huì)分段(多對(duì)<script>標(biāo)簽中的函數(shù)重名椰弊。預(yù)解析的時(shí)候不會(huì)發(fā)生沖突)

this指向

  • 普通函數(shù)中的this是誰(shuí)?-----window
  • 對(duì)象.方法中的this是誰(shuí)?----當(dāng)前的實(shí)例對(duì)象
  • 定時(shí)器方法中的this是誰(shuí)?----window
  • 構(gòu)造函數(shù)中的this是誰(shuí)?-----實(shí)例對(duì)象
  • 原型對(duì)象方法中的this是誰(shuí)?---實(shí)例對(duì)象

面向?qū)ο?/h2>

編程思想

根據(jù)需求,分析對(duì)象,找到對(duì)象有什么特征行為,通過(guò)代碼的方式來(lái)實(shí)現(xiàn)需求,要想實(shí)現(xiàn)這個(gè)需求,就要?jiǎng)?chuàng)建對(duì)象,要想創(chuàng)建對(duì)象,就應(yīng)該顯示有構(gòu)造函數(shù),然后通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象.,通過(guò)對(duì)象調(diào)用屬性和方法來(lái)實(shí)現(xiàn)相應(yīng)的功能及需求

為什么要使用面向?qū)ο缶幊?/h3>

首先JS不是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,JS是一門(mén)基于對(duì)象的語(yǔ)言,那么為什么學(xué)習(xí)js還要學(xué)習(xí)面向?qū)ο?因?yàn)槊嫦驅(qū)ο蟮乃枷?strong>適合于人的想法,編程起來(lái)會(huì)更加的方便,及后期的維護(hù)

在JS中如何使用面向?qū)ο缶幊?/h3>

面向?qū)ο蟮木幊陶Z(yǔ)言中有類(class)的概念(也是一種特殊的數(shù)據(jù)類型),但是JS不是面向?qū)ο蟮恼Z(yǔ)言,所以,JS中沒(méi)有類(class),但是JS可以模擬面向?qū)ο蟮乃枷刖幊?/strong>,JS中會(huì)通過(guò)構(gòu)造函數(shù)來(lái)模擬類的概念(class)

特征

封裝

  • 一個(gè)值存儲(chǔ)在變量中
  • 一坨重復(fù)的代碼放在一個(gè)函數(shù)中
  • 一系列的屬性放在一個(gè)對(duì)象中
  • 一些功能類似的函數(shù)(方法)放在一個(gè)對(duì)象中
  • 好多相類似的對(duì)象放在一個(gè)js文件中

繼承

  • 首先繼承是一種關(guān)系,類(class)與類之間的關(guān)系,JS中沒(méi)有類,但是可以通過(guò)構(gòu)造函數(shù)模擬類,然后通過(guò)原型來(lái)實(shí)現(xiàn)繼承
  • 繼承也是為了數(shù)據(jù)共享,js中的繼承也是為了實(shí)現(xiàn)數(shù)據(jù)共享

多態(tài)

  • 一個(gè)對(duì)象有不同的行為,或者是同一個(gè)行為針對(duì)不同的對(duì)象,產(chǎn)生不同的結(jié)果,要想有多態(tài),就要先有繼承,js中可以模擬多態(tài),但是不會(huì)去使用,也不會(huì)模擬

萬(wàn)物皆對(duì)象

  • 什么是對(duì)象许溅?

    有屬性和方法,具體特指的某個(gè)事物

    一組無(wú)序?qū)傩缘募系逆I值對(duì)秉版,屬性的值可以是任意的類型

  • 對(duì)象的特點(diǎn):

    有特征

    有行為

創(chuàng)建對(duì)象的方式

  • 1.調(diào)用系統(tǒng)的構(gòu)造函數(shù)創(chuàng)建對(duì)象

     var person = new Object();
        person.name = 'cysky';
        person.age = 22;
        person.eat = function () {
            console.log("我餓了贤重,我要吃東西")
        };
    
        person.eat();
        console.log(person.name)
    
  • 2.自定義構(gòu)造函數(shù)創(chuàng)建對(duì)象

     function Person (name,age,sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.eat = function () {
                console.log("我餓了,我要吃東西")
            };
        }
    
        var hu = new Person('cysky', 22 , 'male');//創(chuàng)建對(duì)象————實(shí)例化一個(gè)對(duì)象清焕,同時(shí)對(duì)屬性初始化
        console.log(hu.name);
        hu.eat()
    
    • 構(gòu)造函數(shù)與函數(shù)的區(qū)別
      • 名字是不是大寫(xiě)(首字母)
    • 自定義構(gòu)造函數(shù)創(chuàng)建對(duì)象
      • 先自定義一個(gè)構(gòu)造函數(shù)并蝗,再創(chuàng)建對(duì)象
    • 自定義構(gòu)造函數(shù)的步驟
      • 在內(nèi)存中申請(qǐng)一塊空閑空間
      • 把this設(shè)置為當(dāng)前的對(duì)象
      • 設(shè)置對(duì)象的屬性和方法的值
      • 把this這個(gè)對(duì)象返回
  • 3.字面量的方式創(chuàng)建對(duì)象

    //字面量方式創(chuàng)建對(duì)象
            //一般寫(xiě)法
        var person = {};
        person.name = 'cysky';
        person.age= 22;
        person.eat = function () {
          console.log("我餓了祭犯,我要吃東西")
        };
    
            //簡(jiǎn)寫(xiě)方式
        var person = {
            name:'cysky',
            age:20,
            eat:function(){
                console.log("我餓了,要吃東西")
            }
        };
    
        console.log(person.name);
        person.eat()
    
    • 缺點(diǎn):一次性函數(shù)
  • 4.工廠模式創(chuàng)建對(duì)象

     function person(name,age,sex){
            var obj = {};
            obj.name = name;
            obj.age = age;
            obj.sex = sex;
            obj.eat = function () {
                console.log("我餓了滚停,我要吃東西")
            };
            return obj;
        }
    
        var hu = person('cysky',20,'male');
        hu.eat();
        console.log(hu.name)
    

    工廠模式創(chuàng)建對(duì)象與自定義和構(gòu)造函數(shù)創(chuàng)建對(duì)象的差別:

    • 函數(shù)名小寫(xiě)
    • 有new 有return
    • 直接調(diào)用函數(shù)就可以創(chuàng)建對(duì)象

如何獲取該對(duì)象(變量)

  • instanceof——值是布爾類型

Json數(shù)據(jù)格式

一般都是成對(duì)沃粗,鍵值對(duì)

Json也是一個(gè)對(duì)象,一般Json合適的數(shù)據(jù)無(wú)論是鍵還是值都是用雙引號(hào)引起來(lái)

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

  • 原始數(shù)據(jù)類型

      number
      
      string
      
      boolean
      
      undefined
      
      null
      
      object
    
  • 基本類型(簡(jiǎn)單類型)键畴,值類型:number string boolean

    • 值類型之間傳遞最盅,傳遞的是值
  • 復(fù)雜類型(引用類型):object

    • 引用類型之間傳遞,傳遞的是地址(引用)
  • 空類型:undefined null

內(nèi)置對(duì)象

JS中有三中對(duì)象:

  • 內(nèi)置對(duì)象——JS系統(tǒng)自帶
    • Math
      • Math.PI
      • Math.E
      • Math.abs()
      • Math.ceil()——向上取整
      • Math.floor()——向下取整
    • Date
      • var dt = new Date();
      • console.log(dt.getFullYear());——獲取年份
      • console.log(dt.getMonth()+1);——獲取月份(從0開(kāi)始)
      • console.log(dt.getDate());——獲取日期
      • console.log(dt.getHours());——獲取小時(shí)
      • console.log(dt.getMinutes());——獲取分鐘
      • console.log(dt.getSeconds());——獲取秒
      • console.log(dt.getDay());——獲取星期(星期日是0)
      • console.log(dt.toDateString());——英文的日期
      • console.log(toLocaleDateString());——數(shù)字格式日期
      • console.log(dt.toTimeString())——小時(shí)分鐘秒
      • console.log(dt.toLocalTimeString())——小時(shí)分鐘秒
      • console.log(dt.valueOf());——毫秒值(從1971年開(kāi)始計(jì)算)
      • console.log(dt.toString())——轉(zhuǎn)成字符串
    • String
      • 字符串可以看成是字符組成的數(shù)組起惕,但是JS中沒(méi)有字符類型
      • 字符是一個(gè)一個(gè)的涡贱,在別的語(yǔ)言中,字符用一對(duì)單引號(hào)括起來(lái)
      • 在JS中字符串可以使用單引號(hào)也可以使用雙引號(hào)惹想,因?yàn)樽址梢钥闯墒且粋€(gè)數(shù)組问词,所以,可通過(guò)for循環(huán)進(jìn)行遍歷
      • 字符串特性:不可變性勺馆,字符串的值是不能改變的
      • 字符串的值看起來(lái)是改變了戏售,其實(shí)是指向改變了
      • 字符串可通過(guò)索引的方式訪問(wèn)字符串(只讀)
      • .length——字符串的長(zhǎng)度
      • .charAt(索引)——返回值是指定索引位置的字符串,超出索引返回空字符串
      • .fromCharCode(數(shù)字值草穆,可以是多個(gè)參數(shù))——返回的是ASCII碼對(duì)應(yīng)的值
      • .concat(字符串1灌灾,字符串2......)——返回的是拼接之后的字符串
      • .indexOf(要找的字符串,從某個(gè)位置開(kāi)始的索引)——返回的是這個(gè)字符串的索引值悲柱,沒(méi)找到則返回-1
      • .lastIndexOf(要找的字符串)——從后向前找,但是索引仍然是從左向右的方式,找不到則返回-1
      • .replace("原來(lái)的字符串","新的字符串")——用來(lái)替換字符串的
      • .slice(開(kāi)始的索引,結(jié)束的索引)——從索引5的位置開(kāi)始提取,到索引為10的前一個(gè)結(jié)束,沒(méi)有10锋喜,并返回這個(gè)提取后的字符串
      • .split("要干掉的字符串",切割后留下的個(gè)數(shù))——切割字符串
      • .substr(開(kāi)始的位置,個(gè)數(shù))——返回的是截取后的新的字符串
      • .substring(開(kāi)始的索引,結(jié)束的索引)——返回截取后的字符串,不包含結(jié)束的索引的字符串
      • .toLocaleLowerCase()——轉(zhuǎn)小寫(xiě)
      • toLowerCase()——轉(zhuǎn)小寫(xiě)
      • toLocaleUpperCase()——轉(zhuǎn)大寫(xiě)
      • toUpperCase()——轉(zhuǎn)大寫(xiě)
      • trim()——干掉字符串兩端的空格
    • Array
      • .isArray()——判斷這個(gè)對(duì)象是不是數(shù)組
      • .conact(數(shù)組,數(shù)組,數(shù)組,...)——組合一個(gè)新的數(shù)組
      • .every(函數(shù))——返回值是布爾類型,函數(shù)作為參數(shù)使用,函數(shù)中有三個(gè)參數(shù),第一個(gè)參數(shù)是元素的值,第二個(gè)參數(shù)是索引值,第三個(gè)參數(shù)是原來(lái)的數(shù)組(沒(méi)用)豌鸡,如果這個(gè)數(shù)組中的每個(gè)元素的值都符合條件,最后才返回的是true
      • .filter(函數(shù))——返回的是數(shù)組中每一個(gè)元素都復(fù)合條件的元素,組成了一個(gè)新的數(shù)組
      • .push(值)——把值追加到數(shù)組中,加到最后了---返回值也是追加數(shù)據(jù)之后的數(shù)組長(zhǎng)度
      • .pop()——?jiǎng)h除數(shù)組中最后一個(gè)元素,返回值就是刪除的這個(gè)值
      • .shift()——?jiǎng)h除數(shù)組中第一個(gè)元素,返回值就是刪除的這個(gè)值
      • .unshift()——向數(shù)組的第一個(gè)元素前面插入一個(gè)新的元素,----返回值是插入后的新數(shù)組
      • .forEach(函數(shù))——遍歷數(shù)組用---相當(dāng)于for循環(huán)
      • .indexOf(元素值)——返回的是索引,沒(méi)有則是-1
      • .join("字符串")——返回的是一個(gè)字符串
      • .map(函數(shù))——數(shù)組中的每個(gè)元素都要執(zhí)行這個(gè)函數(shù),把執(zhí)行后的結(jié)果重新的全部的放在一個(gè)新的數(shù)組中
      • .reverse()——反轉(zhuǎn)數(shù)組
      • .sort()——排序的,可能不穩(wěn)定,如果不穩(wěn)定,請(qǐng)寫(xiě)MDN中的那個(gè)固定的代碼
      • .arr.slice(開(kāi)始的索引,結(jié)束的索引)——把截取的數(shù)組的值放在一個(gè)新的數(shù)組中,但是不包含結(jié)束的索引對(duì)應(yīng)的元素值
      • .splice(開(kāi)始的位置,要?jiǎng)h除的個(gè)數(shù),替換的元素的值)——一般是用于刪除數(shù)組中的元素,或者是替換元素,或者是插入元素
    • Object
  • 自定義對(duì)象——自己定義的構(gòu)造函數(shù)創(chuàng)建的對(duì)象
  • 瀏覽器對(duì)象——BOM

基本包裝類型

普通變量不能直接調(diào)用屬性或者方法

對(duì)象可以直接調(diào)用屬性和方法

基本包裝類型:本身是基本類型,但是在執(zhí)行代碼的過(guò)程中,如果這種類型的變量調(diào)用了屬性或者是方法,那么這種類型就不再是基本類型了,而是基本包裝類型,這個(gè)變量也不是普通的變量了,而是基本包裝類型對(duì)象

原型

作用

  • 數(shù)據(jù)共享,節(jié)省內(nèi)存空間
  • 為了實(shí)現(xiàn)繼承

構(gòu)造函數(shù)和實(shí)例對(duì)象之間的關(guān)系

  • 實(shí)例對(duì)象是通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)建的嘿般,創(chuàng)建的過(guò)程叫實(shí)例化
        //創(chuàng)建構(gòu)造函數(shù)
function Person(name,age,sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.eat = function () {
            console.log("我餓了,我要吃東西")
        }
    }
        //實(shí)例化一個(gè)對(duì)象
    var hu = new Person('cysky',20,'male');
    console.dir(hu);//實(shí)例對(duì)象
    console.dir(Person);//構(gòu)造函數(shù)的名字
    
    console.log(hu.constructor===Person);//實(shí)例對(duì)象的構(gòu)造器是指向Person的,結(jié)果是true,所以,這個(gè)實(shí)例對(duì)象hu就是通過(guò)Person來(lái)創(chuàng)建的

構(gòu)造函數(shù)創(chuàng)建對(duì)象帶來(lái)的問(wèn)題--原型使用的原因

調(diào)用同樣的方法卻會(huì)創(chuàng)建不同的對(duì)象涯冠,消耗內(nèi)存

   function Person(name, age) {
        this.name = name;
        this.age = age;
        this.eat = function myEat() {
            console.log("吃桂花糕");
        };
    }

    var per1 = new Person("小白", 5);
    var per2 = new Person("小黑", 6);

    console.dir(per1);
    console.dir(per2);
    console.log(per1.eat === per2.eat);//false——?jiǎng)?chuàng)建了不同的對(duì)象

解決辦法:

 function myEat() {
        console.log("我要吃桂花糕")
    }

    function Person(name,age){
        this.name = name;
        this.age = age;
        this.eat = myEat;//將這個(gè)方法作為公用方法
    }

    var per1 = new Person('小白', 5);
    var per2 = new Person('小黑', 6);
    console.log(per1.eat === per2.eat);//true——調(diào)用的是同一方法

引入原型:

通過(guò)原型來(lái)解決---------數(shù)據(jù)共享,節(jié)省內(nèi)存空間

 function Person(name, age){
        this.name = name;
        this.age = age;
    }

    Person.prototype.eat = function () {
        console.log("我餓了炉奴,我要吃東西")
    };//通過(guò)構(gòu)造函數(shù)的原型添加一個(gè)方法

    var per1 = new Person('小黑',20);
    var per2 = new Person('小白',22);

    console.log(per1.eat === per2.eat)//true——調(diào)用同一方法

原型的簡(jiǎn)單語(yǔ)法

function Person(name,age,sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    Person.prototype = {
        //**手動(dòng)修改構(gòu)造器指向**
        constructor:Person,
        hieght:180,
        weight:"80kg",
        eat:function(){
            console.log("大家都有飯吃")
        },
        play:function(){
            console.log("一起玩游戲")
        }
    };

    var per1 = new Person('小黑',20,"male");

    console.log(per1.hieght);
    console.log(per1.name);
    per1.play()

原型總結(jié)

  • 實(shí)例對(duì)象中有proto這個(gè)屬性,叫原型,它是一個(gè)對(duì)象,這個(gè)屬性是給瀏覽器使用,不是標(biāo)準(zhǔn)的屬性----->proto----->可以叫原型對(duì)象
  • 構(gòu)造函數(shù)中有prototype這個(gè)屬性,叫原型,也是一個(gè)對(duì)象,這個(gè)屬性是給程序員使用,是標(biāo)準(zhǔn)的屬性------>prototype--->也可以叫原型對(duì)象
  • 實(shí)例對(duì)象的proto和構(gòu)造函數(shù)中的prototype相等
  • 又因?yàn)閷?shí)例對(duì)象是通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)建的,構(gòu)造函數(shù)中有原型對(duì)象prototype, 實(shí)例對(duì)象的proto指向了構(gòu)造函數(shù)的原型對(duì)象prototype

構(gòu)造函數(shù)蛇更、實(shí)例對(duì)象瞻赶、原型對(duì)象三者之間的關(guān)系

  • 構(gòu)造函數(shù)可以實(shí)例化對(duì)象
  • 構(gòu)造函數(shù)中有一個(gè)屬性叫prototype,是構(gòu)造函數(shù)的原型對(duì)象
  • 構(gòu)造函數(shù)的原型對(duì)象(prototype)中有一個(gè)constructor構(gòu)造器,這個(gè)構(gòu)造器指向的就是自己所在的原型對(duì)象所在的構(gòu)造函數(shù)
  • 實(shí)例對(duì)象的原型對(duì)象(proto)指向的是該構(gòu)造函數(shù)的原型對(duì)象
  • 構(gòu)造函數(shù)的原型對(duì)象(prototype)中的方法是可以被實(shí)例對(duì)象直接訪問(wèn)的

利用原型共享數(shù)據(jù)

  • 什么樣的數(shù)據(jù)需要寫(xiě)在原型中
    • 需要共享的數(shù)據(jù)
  • 原型中可以共享那些數(shù)據(jù)?
    • 屬性
    • 方法
function Student(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    Student.prototype.eat = function () {
        console.log("今天中午吃外賣(mài)")
    };//在Student原型中添加方法
    Student.prototype.weight = "55kg";//在Student原型中添加屬性

    var per1 = new Student("小黑", 20, "male");//實(shí)例化一個(gè)對(duì)象
    var per2 = new Student("小白", 22, "female");

    console.log(per1.eat === per2.eat);//true
    console.log(per1.weight);
    console.log(per2.weight);
    console.log(per1.name);
    console.log(per2.name)

相互訪問(wèn)原型中的方法

function Animal(name,age){
        this.name = name;
        this.age = age;
    }

    Animal.prototype.eat = function () {
        console.log("我要吃飯啦");
        this.play()
    };
    Animal.prototype.play = function () {
        console.log("主人陪我玩");
        this.sleep()
    };
    Animal.prototype.sleep = function () {
        console.log("我要睡覺(jué)啦")
    };

    var dog = new Animal("小花",3);
    dog.eat()//我要吃飯啦 主人陪我玩 我要睡覺(jué)啦

實(shí)例對(duì)象使用屬性和方法層層搜索

  • 實(shí)例對(duì)象使用的屬性或者方法,先在實(shí)例中查找,找到了則直接使用,找不到則,去實(shí)例對(duì)象的proto指向的原型對(duì)象prototype中找,找到了則使用,找不到則報(bào)錯(cuò)
 function Person(name, age) {
        this.name = name;
        this.age = age;
        this.eat = function () {
            console.log("我還不餓派任,不想吃東西")
        }
    }

    Person.prototype.sex = 'male';
    Person.prototype.eat = function () {
        console.log("我餓了砸逊,我要吃東西")
    };

    var per1 = new Person("cysky", 22);

    per1.eat();//優(yōu)先輸出實(shí)例對(duì)象中有的屬性和方法
    console.log(per1.sex)//實(shí)例對(duì)象中沒(méi)有的屬性會(huì)在原型里去找

為內(nèi)置對(duì)象添加原型和方法

  • 相當(dāng)于在改變?cè)创a
    //反轉(zhuǎn)字符串
    String.prototype.myReverse = function () {
        for(var i = this.length-1;i>=0;i--){
            console.log(this[i])
        }
    };
    var str = "abcdefg";
    str.myReverse();

將局部變量變成全局變量

  • 把局部變量給window就可以了(運(yùn)用函數(shù)的自調(diào)用)
(function (形參) {
    var num=10;//局部變量
  })(實(shí)參);
    console.log(num);
   (function (window) {
     var num=10;//局部變量
     //js是一門(mén)動(dòng)態(tài)類型的語(yǔ)言,對(duì)象沒(méi)有屬性,點(diǎn)了就有了
     window.num=num;
   })(window);
   console.log(num);

原型鏈

  • 是一種關(guān)系,是實(shí)例對(duì)象和原型對(duì)象之間的關(guān)系掌逛,是通過(guò)原型("proto")來(lái)聯(lián)系的

使用對(duì)象就要先有構(gòu)造函數(shù)

如果有公用的屬性和方法师逸,使用原型

實(shí)例化對(duì)象,并初始化

  • 實(shí)例對(duì)象中的原型proto(瀏覽器用)和構(gòu)造函數(shù)的原型prototype(程序員用)指向相同
  • 實(shí)例對(duì)象中的原型指向構(gòu)造函數(shù)中的原型
  • 原型的指向是可以改變的
   function Person(age) {
        this.age = age;
    }//構(gòu)造函數(shù)
    
    Person.prototype.eat = function () {
        console.log("吃東西");
    };//原型
    
    function Student(sex){
        this.sex = sex;
    }
    
    Student.prototype.sayHi = function () {
        console.log("hello");
    };
    
    Student.prototype = new Person(10);

    var stu = new Student("男");
    stu.eat();
    stu.sayHi();//報(bào)錯(cuò):因?yàn)楦淖兞嗽蛯?duì)象的指向
  • this

  • 構(gòu)造函數(shù)中的this是指實(shí)例對(duì)象

  • 原型中的this也是指實(shí)例對(duì)象

 function Person(age){
        this.age = age;//構(gòu)造函數(shù)中的this
        console.log(this);
    }
    Person.prototype.eat = function () {
        console.log(this);//原型中的this
        console.log("吃飯了嗎");
    };

    var per = new Person(10);
    per.eat();
    console.log(per)//結(jié)果同構(gòu)造函數(shù)和原型中的this一樣

繼承

JS中通過(guò)原型來(lái)實(shí)現(xiàn)繼承

function Animal(name, weight) {
        this.name = name;
        this.weight = weight;
    }//動(dòng)物的構(gòu)造函數(shù)

    Animal.prototype.eat = function () {
        console.log("animal can eat")
    };//動(dòng)物原型

    function Dog(color){
        this.color = color;
    }//狗的構(gòu)造函數(shù)

    Dog.prototype = new Animal("哮天犬","50kg");//狗的原型指向改變

    Dog.prototype.bitePerson = function () {
        console.log("哼~汪汪~(yú)咬死你")
    };//先改變指向,再添加原型

    function ErHa(sex) {
        this.sex = sex;
    }//二哈構(gòu)造函數(shù)

    ErHa.prototype = new Dog('黑白色');//二哈原型

    ErHa.prototype.playHost = function () {
        console.log("哈哈~要壞衣服,要壞桌子,拆家..嘎嘎...好玩,開(kāi)心不,驚喜不,意外不")
    };

    var erha = new ErHa("雄性");

    console.log(erha.name,erha.weight,erha.color,erha.sex);

    erha.eat();
    erha.bitePerson();
    erha.playHost();

借用構(gòu)造函數(shù)

  • 為了數(shù)據(jù)共享,改變?cè)椭赶?做到了繼承---通過(guò)改變?cè)椭赶驅(qū)崿F(xiàn)的繼承
  • 缺陷:因?yàn)楦淖冊(cè)椭赶虻耐瑫r(shí)實(shí)現(xiàn)繼承,直接初始化了屬性豆混,繼承過(guò)來(lái)的屬性的值都是一樣的了,所以,這就是問(wèn)題篓像,只能重新調(diào)用對(duì)象的屬性進(jìn)行重新賦值动知。
  • 解決方案:繼承的時(shí)候,不用改變?cè)偷闹赶?直接調(diào)用父級(jí)的構(gòu)造函數(shù)的方式來(lái)為屬性賦值就可以了------借用構(gòu)造函數(shù):把要繼承的父級(jí)的構(gòu)造函數(shù)拿過(guò)來(lái),使用一下就可以了
  • call
    • 借用構(gòu)造函數(shù):構(gòu)造函數(shù)名字.call(當(dāng)前對(duì)象,屬性,屬性,屬性....);
    • 解決了屬性繼承,并且值不重復(fù)的問(wèn)題
    • 缺陷:父級(jí)類別中的方法不能繼承
  function Person(name, age, sex, weight) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.weight = weight;
    }

    Person.prototype.sayHi = function () {
        console.log("您好")
    };

    function Student(name, age, sex, weight, score) {
        Person.call(this, name, age, sex, weight);
        this.score = score;
    }

    var stu1 = new Student("小明", 10, "男", "10kg", "100");
    var stu2 = new Student("小紅", 20, "女", "20kg", "120");

    console.log(stu1.name, stu1.age, stu1.sex, stu1.weight, stu1.score);
    console.log(stu2.name, stu2.age, stu2.sex, stu2.weight, stu2.score);

繼承組合

原型實(shí)現(xiàn)繼承
借用構(gòu)造函數(shù)實(shí)現(xiàn)繼承
組合繼承:原型繼承+借用構(gòu)造函數(shù)繼承

Person.prototype.sayHi = function () {
        console.log("hello")
    };

    function Student(name,age,sex,score){
        Person.call(this,name,age,sex);//使用call方法繼承屬性
        this.score = score;
    }

    Student.prototype = new Person();//使用原型繼承方法

    Student.prototype.eat = function () {
        console.log("eat something")
    };

    var stu = new Student("小黑",20,"男","100分");
    console.log(stu.name, stu.age, stu.sex, stu.score);

    stu.sayHi();
    stu.eat();

拷貝繼承

拷貝繼承;把一個(gè)對(duì)象中的屬性或者方法直接復(fù)制到另一個(gè)對(duì)象中

function Person() {

    }


    Person.prototype.age = 10;
    Person.prototype.sex = "male";
    Person.prototype.height = "180cm";
    Person.prototype.eat = function () {
        console.log('eat something');
    };

    var obj2 = {};//Person的構(gòu)造中有原型prototype,prototype就是一個(gè)對(duì)象,那么里面,age,sex,height,play都是該對(duì)象中的屬性或者方法

    for (var key in Person.prototype) {
        obj2[key] = Person.prototype[key];
    }

    console.dir(obj2);
    obj2.eat();

call&apply

作用:改變this的指向

 Person.prototype.sayHi = function (x, y) {
        console.log("你好呀:" + this.sex);
        return 1000;
    };

    var per = new Person(10, "男");
    per.sayHi();

    console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

    function Student(name, sex) {
        this.name = name;
        this.sex = sex;
    }

    var stu = new Student("小明","人妖");
    var r1 = per.sayHi.apply(stu, [10,20]);//你好呀:人妖
    var r2 = per.sayHi.call(stu,10,20);//你好呀:人妖
    console.log(r1);//1000
    console.log(r2)//1000

區(qū)別:參數(shù)傳遞的方式是不一樣的

  • apply的使用語(yǔ)法:
    • 函數(shù)名字.apply(對(duì)象,[參數(shù)1,參數(shù)2,...]);
    • 方法名字.apply(對(duì)象,[參數(shù)1,參數(shù)2,...]);
  • call的使用語(yǔ)法:
    • 函數(shù)名字.call(對(duì)象,參數(shù)1,參數(shù)2,...);
    • 方法名字.call(對(duì)象,參數(shù)1,參數(shù)2,...);

只要是想使用別的對(duì)象的方法,并且希望這個(gè)方法是當(dāng)前對(duì)象的,那么就可以使用apply或者是call的方法改變this的指向

apply和call方法實(shí)際上并不在函數(shù)這個(gè)實(shí)例對(duì)象中,而是在Function的prototype中

    function f1() {
        console.log(this+":======>調(diào)用了");
    }
    //f1是函數(shù)遗淳,也是對(duì)象
    console.dir(f1);
    //對(duì)象調(diào)用方法拍柒,說(shuō)明該對(duì)象中有這個(gè)方法
    f1.apply();
    f1.call();
    
    console.log(f1.__proto__ === Function.prototype);
    //所有的函數(shù)都是Function的實(shí)例對(duì)象
    console.log(Function.prototype);
    //apply和call方法實(shí)際上并不在函數(shù)這個(gè)實(shí)例對(duì)象中,而是在Function的prototype中
    console.dir(Function);

bind

  • bind方法是復(fù)制的意思,參數(shù)可以在復(fù)制的時(shí)候傳進(jìn)去,也可以在復(fù)制之后調(diào)用的時(shí)候傳入進(jìn)去
  • apply和call是調(diào)用的時(shí)候改變this指向
  • bind方法,是復(fù)制一份的時(shí)候,改變了this的指向
  • 使用的語(yǔ)法
    • 函數(shù)名字.bind(對(duì)象,參數(shù)1,參數(shù)2,...);---->返回值是復(fù)制之后的這個(gè)函數(shù)
    • 方法名字.bind(對(duì)象,參數(shù)1,參數(shù)2,...);---->返回值是復(fù)制之后的這個(gè)方法

閉包

概念

? 函數(shù)A中,有一個(gè)函數(shù)B屈暗,函數(shù)B中可以訪問(wèn)函數(shù)A中定義的變量或者是數(shù)據(jù),此時(shí)形成了閉包(不嚴(yán)謹(jǐn))

閉包模式

? 函數(shù)模式

? 對(duì)象模式

作用

? 緩存數(shù)據(jù)脂男,延長(zhǎng)作用于鏈

缺點(diǎn)

? 緩存數(shù)據(jù)

總結(jié)

? 如果想要緩存數(shù)據(jù),就把這個(gè)數(shù)據(jù)放在外層的函數(shù)和里層的函數(shù)的中間位置

? 局部變量是在函數(shù)中,函數(shù)使用結(jié)束后,局部變量就會(huì)被自動(dòng)的釋放

? 閉包后,里面的局部變量的使用作用域鏈就會(huì)被延長(zhǎng)

function f2() {
        num = 10;
        return function () {
            num ++;
            return num;
        }
    }

    var ff = f2();
    console.log(ff());
    console.log(ff());
    console.log(ff());
//產(chǎn)生相同的隨機(jī)數(shù)
    function f1() {
        var num = parseInt(Math.random()*10+1);
        return function () {
            console.log(num)
        }
    }

    var ff = f1();
    ff();
    ff();
    ff();

遞歸

函數(shù)中調(diào)用函數(shù)自己,此時(shí)就是遞歸,遞歸一定要有結(jié)束的條件

//求n個(gè)數(shù)字的和,5 計(jì)算1+2+3+4+5
    var sum = 0;
    for (var i = 0; i <= 5; i++) {
        sum += i;
    }
    console.log(sum);

    function getSum(x){
        if(x===1){
            return 1
        }
        return x + getSum(x-1);
    }

    console.log(getSum(5))

拷貝

淺拷貝

? 拷貝就是復(fù)制,就相當(dāng)于把一個(gè)對(duì)象中的所有的內(nèi)容,復(fù)制一份給另一個(gè)對(duì)象,直接復(fù)制,或者說(shuō),就是把一個(gè)對(duì)象的地址給了另一個(gè)對(duì)象,他們指向相同,兩個(gè)對(duì)象之間有共同的屬性或者方法,都可以使用

 var obj1={
      age:10,
      sex:"男",
      car:["奔馳","寶馬","特斯拉","奧拓"]
    };
    
    var obj2={};
    
    function extend(a,b) {
      for(var key in a){
        b[key]=a[key];
      }
    }
    extend(obj1,obj2);
    console.dir(obj2);
    console.dir(obj1);
    

深拷貝

? 拷貝還是復(fù)制,深:把一個(gè)對(duì)象中所有的屬性或者方法,一個(gè)一個(gè)的找到.并且在另一個(gè)對(duì)象中開(kāi)辟相應(yīng)的空間,一個(gè)一個(gè)的存儲(chǔ)到另一個(gè)對(duì)象中

var obj1={
      age:10,
      sex:"男",
      car:["奔馳","寶馬","特斯拉","奧拓"],
      dog:{
        name:"大黃",
        age:5,
        color:"黑白色"
      }
    };

    var obj2={};//空對(duì)象
    //通過(guò)函數(shù)實(shí)現(xiàn),把對(duì)象a中的所有的數(shù)據(jù)深拷貝到對(duì)象b中
    function extend(a,b) {
      for(var key in a){
        //先獲取a對(duì)象中每個(gè)屬性的值
        var item=a[key];
        //判斷這個(gè)屬性的值是不是數(shù)組
        if(item instanceof Array){
          //如果是數(shù)組,那么在b對(duì)象中添加一個(gè)新的屬性,并且這個(gè)屬性值也是數(shù)組
          b[key]=[];
          //調(diào)用這個(gè)方法养叛,把a(bǔ)對(duì)象中這個(gè)數(shù)組的屬性值一個(gè)一個(gè)的復(fù)制到b對(duì)象的這個(gè)數(shù)組屬性中
          extend(item,b[key]);
        }else if(item instanceof Object){//判斷這個(gè)值是不是對(duì)象類型的
     //如果是對(duì)象類型的,那么在b對(duì)象中添加一個(gè)屬性,是一個(gè)空對(duì)象
          b[key]={};
          //再次調(diào)用這個(gè)函數(shù),把a(bǔ)對(duì)象中的屬性對(duì)象的值一個(gè)一個(gè)的復(fù)制到b對(duì)象的這個(gè)屬性對(duì)象中
          extend(item,b[key]);
        }else{
          //如果值是普通的數(shù)據(jù),直接復(fù)制到b對(duì)象的這個(gè)屬性中
          b[key]=item;
        }
      }
    }

    extend(obj1,obj2);
    console.dir(obj1);
    console.dir(obj2);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宰翅,隨后出現(xiàn)的幾起案子弃甥,更是在濱河造成了極大的恐慌,老刑警劉巖汁讼,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淆攻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嘿架,警方通過(guò)查閱死者的電腦和手機(jī)瓶珊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耸彪,“玉大人伞芹,你說(shuō)我怎么就攤上這事〔跄龋” “怎么了唱较?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)召川。 經(jīng)常有香客問(wèn)我鹅巍,道長(zhǎng),這世上最難降的妖魔是什么村缸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任擅憔,我火速辦了婚禮,結(jié)果婚禮上坛增,老公的妹妹穿的比我還像新娘获雕。我一直安慰自己,他們只是感情好收捣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布届案。 她就那樣靜靜地躺著,像睡著了一般罢艾。 火紅的嫁衣襯著肌膚如雪楣颠。 梳的紋絲不亂的頭發(fā)上尽纽,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音童漩,去河邊找鬼弄贿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛矫膨,可吹牛的內(nèi)容都是我干的差凹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼侧馅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼危尿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起馁痴,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谊娇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后罗晕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體济欢,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年小渊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了法褥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粤铭,死狀恐怖挖胃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梆惯,我是刑警寧澤酱鸭,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站垛吗,受9級(jí)特大地震影響凹髓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怯屉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一蔚舀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锨络,春花似錦赌躺、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春缅叠,著一層夾襖步出監(jiān)牢的瞬間悄泥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工肤粱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弹囚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓领曼,卻偏偏與公主長(zhǎng)得像鸥鹉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庶骄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348