JS基礎(chǔ)

1. 注釋

1.行注釋
//注釋內(nèi)容
2.塊注釋
/*注釋內(nèi)容*/

2. 規(guī)定

1. JS中嚴(yán)格區(qū)分大小寫
2. JS中每一條語句以分號(;)結(jié)尾
  - 如果不寫分號,瀏覽器會自動添加,但是會消耗一些系統(tǒng)資源,
  - 而且有些時候,瀏覽器會加錯分號凄贩,所以在開發(fā)中分號必須寫
3. JS中會忽略多個空格和換行,所以我們可以利用空格和換行對代碼進(jìn)行格式化

3. 字面量

1. 字面量是一些不可改變的值
  1 2 3 4 5 "hello" 
  字面量都是可以直接使用的,但是我們一般不會使用字面量

4. 變量

1. 變量可以用來保存字面量逸月, 是可以任意改變的值
2. 在JS中使用var關(guān)鍵字來聲明一個變量;
3. 要先用"="賦值再使用

5. 標(biāo)識符

在JS中所有的可以由我們自主命名的都可以稱為是標(biāo)識符
  - 例如:變量名遍膜、函數(shù)名碗硬、屬性名都屬于標(biāo)識符
  - 命名一個標(biāo)識符時需要遵守如下的規(guī)則:
    1.標(biāo)識符中可以含有字母、數(shù)字瓢颅、_、$
    2.標(biāo)識符不能以數(shù)字開頭
    3.標(biāo)識符不能是ES中的關(guān)鍵字或保留字
    4.標(biāo)識符一般都采用駝峰命名法
      - 首字母小寫,每個單詞的開頭字母大寫郊尝,其余字母小寫
        helloWorld xxxYyyZzz
      - JS底層保存標(biāo)識符時實際上是采用的Unicode編碼住涉,
        所以理論上講,所有的UTF-8中含有的內(nèi)容都可以作為標(biāo)識符

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

  • 前5個是基本數(shù)據(jù)類型,Object是引用數(shù)據(jù)類型
  • 可以使用一個運算符 typeof來檢查一個變量的類型
    語法:typeof 變量
    檢查字符串時冀偶,會返回string
    檢查數(shù)值時醒第,會返回number
    檢查布爾值時,會返回boolean
    檢查null時进鸠,會返回object
    檢查undefined時稠曼,會返回undefined
    檢查對象時,會返回object
    檢查函數(shù)時堤如,會返回function
    檢查數(shù)組時蒲列,會返回object
  • JS中的變量都是保存到棧內(nèi)存中的,
    * 基本數(shù)據(jù)類型的值直接在棧內(nèi)存中存儲搀罢,
    * 值與值之間是獨立存在蝗岖,修改一個變量不會影響其他的變量
  • 對象是保存到堆內(nèi)存中的,每創(chuàng)建一個新的對象榔至,就會在堆內(nèi)存中開辟出一個新的空間抵赢,
    * 而變量保存的是對象的內(nèi)存地址(對象的引用),如果兩個變量保存的是同一個對象引用唧取,
    * 當(dāng)一個通過一個變量修改屬性時铅鲤,另一個也會受到影響
  • 當(dāng)比較兩個基本數(shù)據(jù)類型的值時,就是比較值枫弟。
  • 而比較兩個引用數(shù)據(jù)類型時邢享,它是比較的對象的內(nèi)存地址,如果兩個對象是一摸一樣的淡诗,但是地址不同骇塘,它也會返回false

1. String 字符串

- 在JS中字符串需要使用引號引起來
- 使用雙引號或單引號都可以,但是不要混著用
- 引號不能嵌套韩容,雙引號不能放雙引號款违,單引號不能放單引號
  錯誤例子:var str = "我說:"今天天氣不錯"!";
  正確例子:var str = "我說:'今天天氣不錯' !";
- 在字符串中我們可以使用\作為轉(zhuǎn)義字符,
  當(dāng)表示一些特殊符號時可以使用\進(jìn)行轉(zhuǎn)義
    \" 表示 "
    \' 表示 '
    \n 表示換行
    \t 制表符
    \\ 表示\

2. Number 數(shù)值

- 在JS中所有的數(shù)值都是Number類型群凶,
  *  包括整數(shù)和浮點數(shù)(小數(shù))
- JS中可以表示的數(shù)字的最大值
  *  Number.MAX_VALUE=1.7976931348623157e+308
  *  Number.MIN_VALUE 大于0的最小值=5e-324
- 如果使用Number表示的數(shù)字超過了最大值插爹,則會返回一個
  *  Infinity 表示正無窮
  *  -Infinity 表示負(fù)無窮
  *  使用typeof檢查Infinity也會返回number
- NaN 是一個特殊的數(shù)字,表示Not A Number
  *  使用typeof檢查一個NaN也會返回number
  * NaN == NaN   //false
- 如果使用JS進(jìn)行浮點運算请梢,可能得到一個不精確的結(jié)果
  * 比如:var c = 0.1 + 0.2=0.30000000000000004
  *可以這樣解決:var c = (0.1*10 + 0.2*10)/10=0.3
  * 所以千萬不要使用JS進(jìn)行對精確度要求比較高的運算    

3. Boolean 布爾值

- 布爾值只有兩個赠尾,主要用來做邏輯判斷
  *  true 表示真
  *  false 表示假

4. Null 空值

- Null(空值)類型的值只有一個,就是null
- null這個值專門用來表示一個為空的對象
- 使用typeof檢查一個null值時毅弧,會返回object  

5. Undefined 未定義

- Undefined(未定義)類型的值只有一個萍虽,就undefined
- 當(dāng)聲明一個變量,但是并不給變量賦值時形真,它的值就是undefined
- 使用typeof檢查一個undefined時也會返回undefined

6. Object 對象

1. 只要不是上邊的5種杉编,全都是對象
    基本數(shù)據(jù)類型都是單一的值"hello" 123 true,值和值之間沒有任何的聯(lián)系超全。
2. 對象屬于一種復(fù)合的數(shù)據(jù)類型,在對象中可以保存多個不同數(shù)據(jù)類型的屬性邓馒。
3. 對象的分類
    1.內(nèi)建對象
        - 由ES標(biāo)準(zhǔn)中定義的對象嘶朱,在任何的ES的實現(xiàn)中都可以使用
        - 比如:Math String Number Boolean Function Object....
    2.宿主對象
        - 由JS的運行環(huán)境提供的對象,目前來講主要指由瀏覽器提供的對象
        - 比如 BOM DOM
    3.自定義對象
        - 由開發(fā)人員自己創(chuàng)建的對象
4. 創(chuàng)建對象
  - 使用new關(guān)鍵字調(diào)用的函數(shù)光酣,是構(gòu)造函數(shù)constructor
    構(gòu)造函數(shù)是專門用來創(chuàng)建對象的函數(shù)
      var obj = new Object();
  - 使用typeof檢查一個對象時疏遏,會返回object
  - 另一種方法
      var obj2 = {
                name:"豬八戒",
                age:13,
                gender:"男",
                test:{name:"沙僧"}
                
            };
5. 對象屬性
  - 在對象中保存的值稱為屬性
  - 向?qū)ο筇砑訉傩?      語法:對象.屬性名 = 屬性值;
  - 讀取對象中的屬性
      語法:對象.屬性名
      如果讀取對象中沒有的屬性,不會報錯而是會返回undefined
  - 刪除對象的屬性
      語法:delete 對象.屬性名
  - 修改對象的屬性值
      語法:對象.屬性名 = 新值
  - 對象的屬性名不強制要求遵守標(biāo)識符的規(guī)范什么亂七八糟的名字都可以使用
      但是我們使用是還是盡量按照標(biāo)識符的規(guī)范去做
  - 如果要使用特殊的屬性名救军,不能采用.的方式來操作需要使用另一種方式:
      語法:對象["屬性名"] = 屬性值
      讀取時也需要采用這種方式
      使用[]這種形式去操作屬性财异,更加的靈活,
      在[]中可以直接傳遞一個變量唱遭,這樣變量值是多少就會讀取那個屬性
  - in 運算符
      - 通過該運算符可以檢查一個對象中是否含有指定的屬性
        如果有則返回true戳寸,沒有則返回false
      - 語法:"屬性名" in 對象
  - 枚舉對象中的屬性
      -使用for ... in 語句
        語法:  
          for(var n in obj){
              console.log("屬性名:"+n);
              console.log("屬性值:"+obj[n]);
           }
          for...in語句 對象中有幾個屬性,循環(huán)體就會執(zhí)行幾次
          每次執(zhí)行時拷泽,會將對象中的一個屬性的名字賦值給變量

7. 強制類型轉(zhuǎn)換

- 指將一個數(shù)據(jù)類型強制轉(zhuǎn)換為其他的數(shù)據(jù)類型
- 類型轉(zhuǎn)換主要指疫鹊,將其他的數(shù)據(jù)類型,轉(zhuǎn)換為String Number Boolean
將其他的數(shù)據(jù)類型轉(zhuǎn)換為String
方式一:
  - 調(diào)用被轉(zhuǎn)換數(shù)據(jù)類型的toString()方法
  - 該方法不會影響到原變量司致,它會將轉(zhuǎn)換的結(jié)果返回
  - 對象也有這個方法拆吆,默認(rèn)生成這樣的“[object Object]”一個字符串
  - 但是注意:null和undefined這兩個值沒有toString()方法,如果調(diào)用他們的方法脂矫,會報錯
  - 對于Number調(diào)用toString()時可以在方法中傳遞一個整數(shù)作為參數(shù)
    此時它將會把數(shù)字轉(zhuǎn)換為指定的進(jìn)制,如果不指定則默認(rèn)轉(zhuǎn)換為10進(jìn)制
方式二:
- 調(diào)用String()函數(shù)枣耀,并將被轉(zhuǎn)換的數(shù)據(jù)作為參數(shù)傳遞給函數(shù)
- 該方法不會影響到原變量,它會將轉(zhuǎn)換的結(jié)果返回
- 使用String()函數(shù)做強制類型轉(zhuǎn)換時庭再,
  對于Number和Boolean實際上就是調(diào)用的toString()方法
  但是對于null和undefined捞奕,就不會調(diào)用toString()方法
    它會將 null 直接轉(zhuǎn)換為 "null"
    將 undefined 直接轉(zhuǎn)換為 "undefined"
方式三:
      我們只需要為任意的數(shù)據(jù)類型 + 一個 "" 即可將其轉(zhuǎn)換為String。
      這是一種隱式的類型轉(zhuǎn)換佩微,由瀏覽器自動完成缝彬,實際上它也是調(diào)用String()函數(shù)
將其他的數(shù)據(jù)類型轉(zhuǎn)換為Number
方式一:
使用Number()函數(shù)
  -  字符串 --> 數(shù)字
    -  如果是純數(shù)字的字符串萌焰,則直接將其轉(zhuǎn)換為數(shù)字
    -  如果字符串中有非數(shù)字的內(nèi)容哺眯,則轉(zhuǎn)換為NaN
    -  如果字符串是一個空串或者是一個全是空格的字符串,則轉(zhuǎn)換為0
  -  布爾 --> 數(shù)字
    -  true 轉(zhuǎn)成 1
    -  false 轉(zhuǎn)成 0
  -  null --> 數(shù)字     0
  -  undefined --> 數(shù)字 NaN
  - 對象-->數(shù)字
    - 永遠(yuǎn)是NaN 
方式二:
這種方式專門用來對付字符串
  -  parseInt() 把一個字符串轉(zhuǎn)換為一個整數(shù)
    -  parseInt()可以將一個以數(shù)字或空格開頭的字符串中前面的有效的整數(shù)內(nèi)容讀出來扒俯,然后轉(zhuǎn)換為Number
  -  parseFloat() 把一個字符串轉(zhuǎn)換為一個浮點數(shù)
    -  parseFloat()作用和parseInt()類似奶卓,不同的是它可以獲得有效的小數(shù)
  -  可以在parseInt()/parseFloat()中傳遞一個第二個參數(shù),來指定數(shù)字的進(jìn)制
    -  a = parseInt("070",8);      //八進(jìn)制轉(zhuǎn)換撼玄,結(jié)果56
方式三:
*任何值做- * /運算時都會自動轉(zhuǎn)換為Number
  我們可以利用這一特點做隱式的類型轉(zhuǎn)換
  可以通過為一個值 -0 夺姑,*1 ,/1來將其轉(zhuǎn)換為Number
  原理和Number()函數(shù)一樣掌猛,使用起來更加簡單
*任何值做+一元運算盏浙,會自動轉(zhuǎn)換為Number
  a = "18";
  a = +a;    //a變number了
將其他的數(shù)據(jù)類型轉(zhuǎn)換為Boolean
- 使用Boolean()函數(shù)
  - 數(shù)字 ---> 布爾
    - 除了0和NaN眉睹,其余的都是true
  - 字符串 ---> 布爾
    - 除了空串,其余的都是true
  - null和undefined都會轉(zhuǎn)換為false
  - 對象也會轉(zhuǎn)換為true 
- 如果對非布爾值進(jìn)行取反废膘,則會將其轉(zhuǎn)換為布爾值竹海,然后再取反
  所以我們可以利用該特點,來將一個其他的數(shù)據(jù)類型轉(zhuǎn)換為布爾值
  可以為一個任意數(shù)據(jù)類型取兩次反丐黄,來將其轉(zhuǎn)換為布爾值斋配,
  原理和Boolean()函數(shù)一樣
var b = 10;
b = !!b;

8. 運算符

1.運算符也叫操作符
2.通過運算符可以對一個或多個值進(jìn)行運算,并獲取運算結(jié)果
  比如:typeof就是運算符,可以來獲得一個值的類型
  它會將該值的類型以字符串的形式返回
    number string boolean undefined object,function
3.算數(shù)運算符
  當(dāng)對非Number類型的值進(jìn)行運算時灌闺,會將這些值轉(zhuǎn)換為Number然后在運算
    任何值和NaN做運算都得NaN
  +
    +可以對兩個值進(jìn)行加法運算艰争,并將結(jié)果返回
    如果對兩個字符串進(jìn)行加法運算,則會做拼串,會將兩個字符串拼接為一個字符串桂对,并返回
    任何的值和字符串做加法運算甩卓,都會先轉(zhuǎn)換為字符串,然后再和字符串做拼串的操作接校。
      我們可以利用這一特點猛频,來將一個任意的數(shù)據(jù)類型轉(zhuǎn)換為String。
      我們只需要為任意的數(shù)據(jù)類型 + 一個 "" 即可將其轉(zhuǎn)換為String蛛勉。
      這是一種隱式的類型轉(zhuǎn)換鹿寻,由瀏覽器自動完成,實際上它也是調(diào)用String()函數(shù)
  -
    - 可以對兩個值進(jìn)行減法運算诽凌,并將結(jié)果返回
  *
    * 可以對兩個值進(jìn)行乘法運算
  /
    / 可以對兩個值進(jìn)行除法運算
  %
    % 取模運算(取余數(shù))

*任何值做- * /運算時都會自動轉(zhuǎn)換為Number
  我們可以利用這一特點做隱式的類型轉(zhuǎn)換
  可以通過為一個值 -0 毡熏,*1 ,/1來將其轉(zhuǎn)換為Number
  原理和Number()函數(shù)一樣侣诵,使用起來更加簡單
*任何值做+一元運算痢法,會自動轉(zhuǎn)換為Number
  a = true;
  a = "18";
  a = +a;    //a變number了

9. 邏輯運算

JS中為我們提供了三種邏輯運算符
 對于非布爾值進(jìn)行與或運算時,會先將其轉(zhuǎn)換為布爾值杜顺,然后再運算财搁,并且返回原值
1.! 非
  - !可以用來對一個值進(jìn)行非運算,返回結(jié)果是布爾值
  - 所謂非運算就是值對一個布爾值進(jìn)行取反操作,
      true變false躬络,false變true
  - 如果對一個值進(jìn)行兩次取反尖奔,它不會變化
  - 如果對非布爾值進(jìn)行取反,則會將其轉(zhuǎn)換為布爾值穷当,然后再取反
      所以我們可以利用該特點提茁,來將一個其他的數(shù)據(jù)類型轉(zhuǎn)換為布爾值
      可以為一個任意數(shù)據(jù)類型取兩次反,來將其轉(zhuǎn)換為布爾值馁菜,
      原理和Boolean()函數(shù)一樣
2. && 與
  - &&可以對符號兩側(cè)的值進(jìn)行與運算并返回結(jié)果茴扁,返回結(jié)果不一定是布爾值
  - 運算規(guī)則
    - 兩個值中只要有一個值為false就返回false,
        只有兩個值都為true時汪疮,才會返回true
    - JS中的“與”屬于短路的與峭火,
        如果第一個值為false毁习,則不會看第二個值
  - 對于非布爾值進(jìn)行與運算時,會先將其轉(zhuǎn)換為布爾值卖丸,然后再運算蜓洪,并且返回原值
    - 如果第一個值為true,則必然返回第二個值
    - 如果第一個值為false坯苹,則直接返回第一個值
3.|| 或
  - ||可以對符號兩側(cè)的值進(jìn)行或運算并返回結(jié)果
  - 運算規(guī)則:
    - 兩個值中只要有一個true隆檀,就返回true
        如果兩個值都為false,才返回false
    - JS中的“或”屬于短路的或
      如果第一個值為true粹湃,則不會檢查第二個值
  - 對于非布爾值進(jìn)行或運算時恐仑,會先將其轉(zhuǎn)換為布爾值,然后再運算为鳄,并且返回原值
    - 如果第一個值為true裳仆,則直接返回第一個值
    - 如果第一個值為false,則返回第二個值

10.關(guān)系運算符

- 通過關(guān)系運算符可以比較兩個值之間的大小關(guān)系孤钦,
    如果關(guān)系成立它會返回true歧斟,如果關(guān)系不成立則返回false
- 非數(shù)值的情況
  - 對于非數(shù)值進(jìn)行比較時,會將其轉(zhuǎn)換為數(shù)字然后在比較
  - 如果符號兩側(cè)的值都是字符串時偏形,不會將其轉(zhuǎn)換為數(shù)字進(jìn)行比較
    而會分別比較字符串中字符的Unicode編碼
- 比較兩個字符串時静袖,比較的是字符串的字符編碼
    //console.log("a" < "b");//true
  - 比較字符編碼時是一位一位進(jìn)行比較
  - 如果兩位一樣,則比較下一位俊扭,所以借用它來對英文進(jìn)行排序
    //console.log("abc" < "bcd");//true
  - 比較中文時沒有意義
  - 如果比較的兩個字符串型的數(shù)字队橙,可能會得到不可預(yù)期的結(jié)果
      注意:在比較兩個字符串型的數(shù)字時,一定一定一定要轉(zhuǎn)型

11. 相等運算符

1.相等 ==
 當(dāng)使用==來比較兩個值時萨惑,如果值的類型不同捐康,則會自動進(jìn)行類型轉(zhuǎn)換,將其轉(zhuǎn)換為相同的類型庸蔼,然后在比較解总,如果相等會返回true,否則返回false
 - undefined 衍生自 null姐仅,所以這兩個值做相等判斷時花枫,會返回true
 - NaN不和任何值相等,包括他本身
 - 可以通過isNaN()函數(shù)來判斷一個值是否是NaN萍嬉,如果該值是NaN則返回true乌昔,否則返回false
2. 不相等 !=
不相等也會對變量進(jìn)行自動的類型轉(zhuǎn)換隙疚,如果轉(zhuǎn)換后相等它會返回false
3. 全等 ===
用來判斷兩個值是否全等壤追,它和相等類似,不同的是它不會做自動的類型轉(zhuǎn)換供屉,如果兩個值的類型不同行冰,直接返回false
4.不全等 !==
用來判斷兩個值是否不全等溺蕉,和不等類似,不同的是它不會做自動的類型轉(zhuǎn)換悼做,如果兩個值的類型不同疯特,直接返回true

12. 函數(shù) function

- 函數(shù)也是一個對象
- 對象的屬性也可以說函數(shù)(方法)
- 函數(shù)中可以封裝一些功能(代碼),在需要時可以執(zhí)行這些功能(代碼)
- 函數(shù)中可以保存一些代碼在需要的時候調(diào)用
- 使用typeof檢查一個函數(shù)對象時肛走,會返回function

- 創(chuàng)建一個函數(shù)對象
  可以將要封裝的代碼以字符串的形式傳遞給構(gòu)造函數(shù)
    var fun = new Function("console.log('Hello 這是我的第一個函數(shù)');");
  封裝到函數(shù)中的代碼不會立即執(zhí)行
  函數(shù)中的代碼會在函數(shù)調(diào)用的時候執(zhí)行
* 我們在實際開發(fā)中很少使用構(gòu)造函數(shù)來創(chuàng)建一個函數(shù)對象漓雅,用下面的

- 使用 函數(shù)聲明 來創(chuàng)建一個函數(shù)
                    function 函數(shù)名([形參1,形參2...形參N]){
                        語句...
                    }
- 使用 函數(shù)表達(dá)式 來創(chuàng)建一個函數(shù)
              var 函數(shù)名  = function([形參1,形參2...形參N]){
                 語句....
               }
- 調(diào)用函數(shù) 語法:函數(shù)對象()
  當(dāng)調(diào)用函數(shù)時,函數(shù)中封裝的代碼會按照順序執(zhí)行
  fun();

13. 函數(shù)參數(shù)

- 可以在函數(shù)的()中來指定一個或多個形參(形式參數(shù))朽色,多個形參之間使用,隔開邻吞,聲明形參就相當(dāng)于在函數(shù)內(nèi)部聲明了對應(yīng)的變量,但是并不賦值
- 調(diào)用函數(shù)時葫男,解析器不會檢查實參的類型抱冷,也不會檢查實參的數(shù)量
  - 多余實參不會被賦值
  - 如果實參的數(shù)量少于形參的數(shù)量,則沒有對應(yīng)實參的形參將是undefined

14. 返回值

1. 可以使用 return 來設(shè)置函數(shù)的返回值
2. 語法:return 值
3. return后的值將會作為函數(shù)的執(zhí)行結(jié)果返回,可以定義一個變量梢褐,來接收該結(jié)果
4. 在函數(shù)中return后的語句都不會執(zhí)行
5. 如果return語句后不跟任何值就相當(dāng)于返回一個undefined旺遮,如果函數(shù)中不寫return,則也會返回undefined
6. return后可以跟任意類型的值

14. 立即執(zhí)行函數(shù)

函數(shù)對象()
- 函數(shù)定義完盈咳,立即被調(diào)用耿眉,這種函數(shù)叫做立即執(zhí)行函數(shù)
- 立即執(zhí)行函數(shù)往往只會執(zhí)行一次
(function(){
                alert("我是一個匿名函數(shù)~~~");
            })();

15. 作用域

- 作用域指一個變量的作用的范圍
- 聲明提前
  1.變量的聲明提前
    - 使用var關(guān)鍵字聲明的變量,會在所有的代碼執(zhí)行之前被聲明(但是不會賦值)  
        但是如果聲明變量時不適用var關(guān)鍵字鱼响,則變量不會被聲明提前
  2.函數(shù)的聲明提前
    - 使用函數(shù)聲明形式創(chuàng)建的函數(shù) function 函數(shù)(){}
        它會在所有的代碼執(zhí)行之前就被創(chuàng)建跷敬,所以我們可以在函數(shù)聲明前來調(diào)用函數(shù)
    - 使用函數(shù)表達(dá)式創(chuàng)建的函數(shù),不會被聲明提前热押,所以不能在聲明前調(diào)用
- 在JS中一共有兩種作用域:
  1.全局作用域
    - 直接編寫在script標(biāo)簽中的JS代碼西傀,都在全局作用域
    - 全局作用域在頁面打開時創(chuàng)建,在頁面關(guān)閉時銷毀
    - 在全局作用域中有一個全局對象window桶癣,
        它代表的是一個瀏覽器的窗口拥褂,它由瀏覽器創(chuàng)建我們可以直接使用
    - 在全局作用域中:
        創(chuàng)建的變量都會作為window對象的屬性保存
        創(chuàng)建的函數(shù)都會作為window對象的方法保存
    - 全局作用域中的變量都是全局變量,
        在頁面的任意的部分都可以訪問的到
  2.函數(shù)作用域
  - 調(diào)用函數(shù)時創(chuàng)建函數(shù)作用域牙寞,函數(shù)執(zhí)行完畢以后饺鹃,函數(shù)作用域銷毀
  - 每調(diào)用一次函數(shù)就會創(chuàng)建一個新的函數(shù)作用域,他們之間是互相獨立的
  - 在函數(shù)作用域中可以訪問到全局作用域的變量
     在全局作用域中無法訪問到函數(shù)作用域的變量
  - 當(dāng)在函數(shù)作用域操作一個變量時间雀,它會先在自身作用域中尋找悔详,如果有就直接使用
     如果沒有則向上一級作用域中尋找,直到找到全局作用域惹挟,
     如果全局作用域中依然沒有找到茄螃,則會報錯ReferenceError
  - 在函數(shù)中要訪問全局變量可以使用window對象
  - 在函數(shù)中,不使用var聲明的變量都會成為全局變量
  - 定義形參就相當(dāng)于在函數(shù)作用域中聲明了變量

16.this

解析器在調(diào)用函數(shù)每次都會向函數(shù)內(nèi)部傳遞進(jìn)一個隱含的參數(shù),
  這個隱含的參數(shù)就是this连锯,this指向的是一個對象归苍,
  這個對象我們稱為函數(shù)執(zhí)行的 上下文對象用狱,
  根據(jù)函數(shù)的調(diào)用方式的不同,this會指向不同的對象
    1.以函數(shù)形式調(diào)用時拼弃,this永遠(yuǎn)都是window
    2.以方法的形式調(diào)用時夏伊,this是調(diào)用方法的對象
    3.以構(gòu)造函數(shù)的形式調(diào)用時,this是新創(chuàng)建的那個對象
    4.使用call和apply調(diào)用時吻氧,this是指定的那個對象
    5.在事件中溺忧,this指向觸發(fā)這個事件的對象,特殊的是盯孙,IE中的attachEvent中的this總是指向全局對象Window

17.構(gòu)造函數(shù)

1.構(gòu)造函數(shù)就是一個普通的函數(shù)砸狞,創(chuàng)建方式和普通函數(shù)沒有區(qū)別,
  不同的是構(gòu)造函數(shù)習(xí)慣上首字母大寫
2.構(gòu)造函數(shù)和普通函數(shù)的區(qū)別就是調(diào)用方式的不同
  普通函數(shù)是直接調(diào)用,而構(gòu)造函數(shù)需要使用new關(guān)鍵字來調(diào)用
3.構(gòu)造函數(shù)的執(zhí)行流程:
  1.立刻創(chuàng)建一個新的對象
  2.將新建的對象設(shè)置為函數(shù)中this,在構(gòu)造函數(shù)中可以使用this來引用新建的對象
  3.逐行執(zhí)行函數(shù)中的代碼
  4.將新建的對象作為返回值返回
4.this的情況:
  1.當(dāng)以函數(shù)的形式調(diào)用時镀梭,this是window
  2.當(dāng)以方法的形式調(diào)用時刀森,誰調(diào)用方法this就是誰
  3.當(dāng)以構(gòu)造函數(shù)的形式調(diào)用時,this就是新創(chuàng)建的那個對象
5.例子
function Person(name , age , gender){
                this.name = name;
                this.age = age;
                this.gender = gender;
            }
//向原型中添加sayName方法报账,可以使所有的對象共享同一個方法
            Person.prototype.sayName = function(){
                alert("Hello大家好研底,我是:"+this.name);
            };
var per = new Person("孫悟空",18,"男");
6.使用instanceof可以檢查一個對象是否是一個類的實例
  - 語法:
      對象 instanceof 構(gòu)造函數(shù)
  - 如果是,則返回true透罢,否則返回false
  - console.log(per instanceof Person);
  - 所有的對象都是Object的后代榜晦,
    所以任何對象和Object在instanceof檢查時都會返回true

18.原型 prototype

1.我們所創(chuàng)建的每一個函數(shù),解析器都會向函數(shù)中添加一個屬性prototype
  這個屬性對應(yīng)著一個對象羽圃,這個對象就是我們所謂的原型對象
2.如果函數(shù)作為普通函數(shù)調(diào)用prototype沒有任何作用
3.當(dāng)函數(shù)以構(gòu)造函數(shù)的形式調(diào)用時乾胶,它所創(chuàng)建的對象中都會有一個隱含的屬性,
  指向該構(gòu)造函數(shù)的原型對象朽寞,我們可以通過__proto__來訪問該屬性
4.原型對象就相當(dāng)于一個公共的區(qū)域识窿,所有同一個類的實例都可以訪問到這個原型對象,
  我們可以將對象中共有的內(nèi)容脑融,統(tǒng)一設(shè)置到原型對象中喻频。
5.當(dāng)我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找肘迎,如果有則直接使用甥温,
  如果沒有則會去原型對象中尋找,如果找到則直接使用
6.以后我們創(chuàng)建構(gòu)造函數(shù)時妓布,可以將這些對象共有的屬性和方法姻蚓,統(tǒng)一添加到構(gòu)造函數(shù)的原型對象中,
  這樣不用分別為每一個對象添加匣沼,也不會影響到全局作用域狰挡,就可以使每個對象都具有這些屬性和方法了
7.使用in檢查對象中是否含有某個屬性時,如果對象中沒有但是原型中有,也會返回true
7.可以使用對象的hasOwnProperty()來檢查對象自身中是否含有該屬性圆兵,而含有原型中還有
  使用該方法只有當(dāng)對象自身中含有屬性時,才會返回true
8.原型對象也是對象枢贿,所以它也有原型殉农,當(dāng)我們使用一個對象的屬性或方法時,會現(xiàn)在自身中尋找
  自身中如果有局荚,則直接使用超凳,
  如果沒有則去原型對象中尋找,如果原型對象中有耀态,則使用轮傍,
  如果沒有則去原型的原型中尋找,直到找到Object對象的原型,
  Object對象的原型沒有原型首装,如果在Object原型中依然沒有找到创夜,則返回undefined

19. 垃圾回收 GC

- 就像人生活的時間長了會產(chǎn)生垃圾一樣,程序運行過程中也會產(chǎn)生垃圾
  這些垃圾積攢過多以后仙逻,會導(dǎo)致程序運行的速度過慢驰吓,
  所以我們需要一個垃圾回收的機制,來處理程序運行過程中產(chǎn)生垃圾
- 當(dāng)一個對象沒有任何的變量或?qū)傩詫λM(jìn)行引用系奉,此時我們將永遠(yuǎn)無法操作該對象檬贰,
  此時這種對象就是一個垃圾,這種對象過多會占用大量的內(nèi)存空間缺亮,導(dǎo)致程序運行變慢翁涤,
  所以這種垃圾必須進(jìn)行清理。
- 在JS中擁有自動的垃圾回收機制萌踱,會自動將這些垃圾對象從內(nèi)存中銷毀葵礼,
  我們不需要也不能進(jìn)行垃圾回收的操作
- 我們需要做的只是要將不再使用的對象設(shè)置null即可

20. 數(shù)組 Array

- 數(shù)組也是一個對象
- 它和我們普通對象功能類似,也是用來存儲一些值的
- 不同的是普通對象是使用字符串作為屬性名的并鸵,而數(shù)組時使用數(shù)字來作為索引操作元素
- 索引:從0開始的整數(shù)就是索引
- 數(shù)組的存儲性能比普通對象要好章咧,在開發(fā)中我們經(jīng)常使用數(shù)組來存儲一些數(shù)據(jù)
- 創(chuàng)建數(shù)組對象
  var arr = new Array();
- 向數(shù)組中添加元素
  語法:數(shù)組[索引] = 值
- 讀取數(shù)組中的元素
  語法:數(shù)組[索引]
  如果讀取不存在的索引,他不會報錯而是返回undefined
- 獲取數(shù)組的長度
  可以使用length屬性來獲取數(shù)組的長度(元素的個數(shù))
  語法:數(shù)組.length
  對于連續(xù)的數(shù)組能真,使用length可以獲取到數(shù)組的長度(元素的個數(shù))
  對于非連續(xù)的數(shù)組赁严,使用length會獲取到數(shù)組的最大的索引+1,盡量不要創(chuàng)建非連續(xù)的數(shù)組
- 修改length
  如果修改的length大于原長度粉铐,則多出部分會空出來
  如果修改的length小于原長度疼约,則多出的元素會被刪除,變?yōu)閡ndefined
- 向數(shù)組的最后一個位置添加元素
  語法:數(shù)組[數(shù)組.length] = 值;
- 使用字面量來創(chuàng)建數(shù)組
  語法:[]
  var arr = [];
- 使用字面量創(chuàng)建數(shù)組時蝙泼,可以在創(chuàng)建時就指定數(shù)組中的元素
  var arr = [1,2,3,4,5,10];
- 使用構(gòu)造函數(shù)創(chuàng)建數(shù)組時程剥,也可以同時添加元素,將要添加的元素作為構(gòu)造函數(shù)的參數(shù)傳遞元素之間使用,隔開
  var arr2 = new Array(10,20,30);
- 創(chuàng)建一個長度為10的數(shù)組
  arr2 = new Array(10);
- 數(shù)組中的元素可以是任意的數(shù)據(jù)類型,甚至對象织鲸,函數(shù)和數(shù)組
  arr = ["hello",1,true,null,undefined,{name:"孫悟空"},function(){alert(1)},[1,2,3]];

21. 數(shù)組的方法 補充:for in舔腾,forEach, for of的區(qū)別

1. push()                               改變數(shù)組
- 該方法可以向數(shù)組的末尾添加一個或多個元素搂擦,并返回數(shù)組的新的長度
- 可以將要添加的元素作為方法的參數(shù)傳遞稳诚,這樣這些元素將會自動添加到數(shù)組的末尾
- 該方法會將數(shù)組新的長度作為返回值返回

2. pop()                                改變數(shù)組
- 該方法可以刪除數(shù)組的最后一個元素,并將被刪除的元素作為返回值返回

3. unshift()                                改變數(shù)組
- 向數(shù)組開頭添加一個或多個元素,并返回新的數(shù)組長度
- 向前邊插入元素以后瀑踢,其他的元素索引會依次調(diào)整

4. shift()                                改變數(shù)組
- 可以刪除數(shù)組的第一個元素扳还,并將被刪除的元素作為返回值返回

5. forEach()
- 一般我們都是使用for循環(huán)去遍歷數(shù)組,JS中還為我們提供了一個方法橱夭,用來遍歷數(shù)組:forEach()
- 這個方法只支持IE8以上的瀏覽器氨距,IE8及以下的瀏覽器均不支持該方法,
  所以如果需要兼容IE8棘劣,則不要使用forEach俏让,還是使用for循環(huán)來遍歷
- forEach()方法需要一個函數(shù)作為參數(shù)
  - 像這種函數(shù),由我們創(chuàng)建但是不由我們調(diào)用的茬暇,我們稱為回調(diào)函數(shù)
  - 數(shù)組中有幾個元素函數(shù)就會執(zhí)行幾次舆驶,每次執(zhí)行時,瀏覽器會將遍歷到的元素
    以實參的形式傳遞進(jìn)來而钞,我們可以來定義形參沙廉,來讀取這些內(nèi)容
  - 瀏覽器會在回調(diào)函數(shù)中傳遞三個參數(shù):
    第一個參數(shù),就是當(dāng)前正在遍歷的元素
    第二個參數(shù)臼节,就是當(dāng)前正在遍歷的元素的索引
    第三個參數(shù)撬陵,就是正在遍歷的數(shù)組
-例子 :
      arr.forEach(function(value , index , obj){
                console.log(index);
            });

6. slice()                                不改變數(shù)組
- 可以用來從數(shù)組提取指定元素
- 該方法不會改變元素數(shù)組,而是將截取到的元素封裝到一個新數(shù)組中返回
- 參數(shù):
  1.截取開始的位置的索引,包含開始索引
  2.截取結(jié)束的位置的索引,不包含結(jié)束索引
    - 第二個參數(shù)可以省略不寫,此時會截取從開始索引往后的所有元素
  3.索引可以傳遞一個負(fù)值网缝,如果傳遞一個負(fù)值巨税,則從后往前計算
      -1 倒數(shù)第一個
      -2 倒數(shù)第二個

7. splice()                                改變數(shù)組
- 可以用于刪除數(shù)組中的指定元素
- 使用splice()會影響到原數(shù)組狱庇,會將指定元素從原數(shù)組中刪除碳抄,并將被刪除的元素作為返回值返回
- 參數(shù):
  第一個,表示開始位置的索引
  第二個舀凛,表示刪除的數(shù)量
  第三個及以后扼仲。远寸。可以傳遞一些新的元素屠凶,這些元素將會自動插入到開始位置索引前邊

8. concat()                                不改變數(shù)組
-可以連接兩個或多個數(shù)組驰后,并將新的數(shù)組返回
- 該方法不會對原數(shù)組產(chǎn)生影響
- var result = arr.concat(arr2,arr3,"牛魔王","鐵扇公主");

9. join()                                不改變數(shù)組
- 該方法可以將數(shù)組轉(zhuǎn)換為一個字符串
- 該方法不會對原數(shù)組產(chǎn)生影響,而是將轉(zhuǎn)換后的字符串作為結(jié)果返回
- 在join()中可以指定一個字符串作為參數(shù)矗愧,這個字符串將會成為數(shù)組中元素的連接符
  如果不指定連接符灶芝,則默認(rèn)使用,作為連接符
- result = arr.join("@-@");
  孫悟空@-@豬八戒@-@沙和尚@-@唐僧

10. reverse()                                                   改變數(shù)組
- 該方法用來反轉(zhuǎn)數(shù)組(前邊的去后邊,后邊的去前邊)
- 該方法會直接修改原數(shù)組

11. sort()                                                               改變數(shù)組
- 可以用來對數(shù)組中的元素進(jìn)行排序
- 也會影響原數(shù)組,默認(rèn)會按照Unicode編碼進(jìn)行排序
- 即使對于純數(shù)字的數(shù)組夜涕,使用sort()排序時犯犁,也會按照Unicode編碼來排序,
  所以對數(shù)字進(jìn)排序時女器,可能會得到錯誤的結(jié)果酸役。
- 我們可以自己來指定排序的規(guī)則
    我們可以在sort()添加一個回調(diào)函數(shù),來指定排序規(guī)則晓避,回調(diào)函數(shù)中需要定義兩個形參簇捍,
    瀏覽器將會分別使用數(shù)組中的元素作為實參去調(diào)用回調(diào)函數(shù)只壳,
    使用哪個元素調(diào)用不確定俏拱,但是肯定的是在數(shù)組中a一定在b前邊
  - 瀏覽器會根據(jù)回調(diào)函數(shù)的返回值來決定元素的順序,
      如果返回一個大于0的值吼句,則元素會交換位置
      如果返回一個小于0的值锅必,則元素位置不變
      如果返回一個0,則認(rèn)為兩個元素相等惕艳,也不交換位置
  - 如果需要升序排列搞隐,則返回 a-b
  - 如果需要降序排列,則返回b-a
12. map()                                      不改變數(shù)組
  - 返回一個新數(shù)組远搪,數(shù)組中的元素為原始數(shù)組元素調(diào)用函數(shù)處理后的值劣纲。
  - array.map(function(currentValue,index,arr), thisValue)
    - currentValue  必須。當(dāng)前元素的值
    - index  可選谁鳍。當(dāng)前元素的索引值
    - arr  可選癞季。當(dāng)前元素屬于的數(shù)組對象
    - thisValue  可選。對象作為該執(zhí)行回調(diào)時使用倘潜,傳遞給函數(shù)绷柒,用作 "this" 的值。
      如果省略了 thisValue涮因,或者傳入 null废睦、undefined,那么回調(diào)函數(shù)的 this 為全局對象养泡。
12. filter()                                      不改變數(shù)組
  - 遍歷過濾出一個新的子數(shù)組嗜湃, 返回條件為true的值
  - array.filter(function(currentValue,index,arr), thisValue)
    - currentValue  必須。當(dāng)前元素的值
    - index  可選澜掩。當(dāng)前元素的索引值
    - arr  可選净蚤。當(dāng)前元素屬于的數(shù)組對象
    - thisValue  可選。對象作為該執(zhí)行回調(diào)時使用输硝,傳遞給函數(shù)今瀑,用作 "this" 的值。
      如果省略了 thisValue,或者傳入 null橘荠、undefined屿附,那么回調(diào)函數(shù)的 this 為全局對象。
13. indexOf(value)           不改變數(shù)組
- 得到值在數(shù)組中的第一個下標(biāo)
14. astIndexOf(value)    不改變數(shù)組
- 得到值在數(shù)組中的最后一個下標(biāo)
15. Array.prototype.includes(value) : 判斷數(shù)組中是否包含指定value
16. array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
參數(shù)  描述
total   必需哥童。初始值, 或者計算結(jié)束后的返回值挺份。
currentValue    必需。當(dāng)前元素
currentIndex    可選贮懈。當(dāng)前元素的索引
arr 可選匀泊。當(dāng)前元素所屬的數(shù)組對象。
initialValue    可選朵你。傳遞給函數(shù)的初始值
接收一個函數(shù)作為累加器各聘,數(shù)組中的每個值(從左到右)開始縮減,最終計算為一個值

22. 函數(shù)的方法

1. call()和apply()
- 這兩個方法都是函數(shù)對象的方法抡医,需要通過函數(shù)對象來調(diào)用
- 當(dāng)對函數(shù)調(diào)用call()和apply()都會調(diào)用函數(shù)執(zhí)行
- 在調(diào)用call()和apply()可以將一個對象指定為第一個參數(shù)
  此時這個對象將會成為函數(shù)執(zhí)行時的this
- call()方法可以將實參在對象之后依次傳遞
- apply()方法需要將實參封裝到一個數(shù)組中統(tǒng)一傳遞
- this的情況:
  1.以函數(shù)形式調(diào)用時躲因,this永遠(yuǎn)都是window
  2.以方法的形式調(diào)用時,this是調(diào)用方法的對象
  3.以構(gòu)造函數(shù)的形式調(diào)用時忌傻,this是新創(chuàng)建的那個對象
  4.使用call和apply調(diào)用時大脉,this是指定的那個對象
2. bind()
- 作用: 將函數(shù)內(nèi)的this綁定為obj, 并將函數(shù)返回
- 區(qū)別bind()與call()和apply()?
  * 都能指定函數(shù)中的this
  * call()/apply()是立即調(diào)用函數(shù)
  * bind()是將函數(shù)返回
  * bind()傳參和call一樣,都是在要綁定的this后依次寫上水孩,用镰矿,隔開
```F
#23. arguments

在調(diào)用函數(shù)時,瀏覽器每次都會傳遞進(jìn)兩個隱含的參數(shù):
1.函數(shù)的上下文對象 this
2.封裝實參的對象 arguments
- arguments是一個偽數(shù)組對象,它也可以通過索引來操作數(shù)據(jù)俘种,也可以獲取長度
- 在調(diào)用函數(shù)時秤标,我們所傳遞的實參都會在arguments中保存
- arguments.length可以用來獲取實參的長度
- 我們即使不定義形參,也可以通過arguments來使用實參安疗,只不過比較麻煩
arguments[0] 表示第一個實參
arguments[1] 表示第二個實參 抛杨。。荐类。
- 它里邊有一個屬性叫做callee怖现,這個屬性對應(yīng)一個函數(shù)對象,就是當(dāng)前正在指向的函數(shù)的對象

#24. Date對象
  1. 在JS中使用Date對象來表示一個時間
  2. 創(chuàng)建一個Date對象
    如果直接使用構(gòu)造函數(shù)創(chuàng)建一個Date對象玉罐,則會封裝為當(dāng)前代碼執(zhí)行的時間
    var d = new Date();
  3. 創(chuàng)建一個指定的時間對象
    需要在構(gòu)造函數(shù)中傳遞一個表示時間的字符串作為參數(shù)
    日期的格式 月份/日/年 時:分:秒
    var d2 = new Date("2/18/2011 11:10:30");
  4. 獲取
  5. getDate()
  • 獲取當(dāng)前日期對象是幾日
  1. getDay()
  • 獲取當(dāng)前日期對象時周幾
  • 會返回一個0-6的值
    0 表示周日
    1 表示周一 屈嗤。。吊输。
  1. getMonth()
  • 獲取當(dāng)前時間對象的月份
  • 會返回一個0-11的值
    0 表示1月
    1 表示2月
    11 表示12月
  1. getFullYear()
  • 獲取當(dāng)前日期對象的年份
  1. getHours()
  • 獲取當(dāng)前日期對象的小時(0~23)
  1. getMinutes()
  • 獲取當(dāng)前日期對象的分鐘(0~59)
  1. getSeconds()
  • 獲取當(dāng)前日期對象的秒(0~59)
  1. getMilliseconds()
  • 獲取當(dāng)前日期對象的毫秒(0~999)
  1. getTime()
  • 獲取當(dāng)前日期對象的時間戳
  • 時間戳饶号,指的是從格林威治標(biāo)準(zhǔn)時間的1970年1月1日,0時0分0秒到當(dāng)前日期所花費的毫秒數(shù)(1秒 = 1000毫秒)
  • 計算機底層在保存時間時使用都是時間戳
  1. Date.now()
  • 獲取執(zhí)行該行代碼時的時間戳
  • var start = Date.now();
  • var end = Date.now();
  • 利用時間戳來測試代碼的執(zhí)行的性能
  1. toTimeString()
  • 把 Date 對象的日期部分轉(zhuǎn)換為可讀字符串:
#25. Math
  • Math和其他的對象不同季蚂,它不是構(gòu)造函數(shù)茫船,它屬于工具類不用創(chuàng)建對象琅束,它里邊封裝了數(shù)學(xué)運算相關(guān)的屬性和方法
  • 比如:Math.PI 表示的圓周率
  1. abs()
    可以用來計算一個數(shù)的絕對值
    Math.abs(-1) = 1
  2. Math.ceil()
    可以對一個數(shù)進(jìn)行向上取整,小數(shù)位只要有值就自動進(jìn)1
    Math.ceil(1.1) = 2
  3. Math.floor()
    可以對一個數(shù)進(jìn)行向下取整算谈,小數(shù)部分會被舍掉
    Math.floor(1.99) = 1
  4. Math.round()
    可以對一個數(shù)進(jìn)行四舍五入取整
    Math.round(1.4) = 1
  5. Math.random()
  • 可以用來生成一個(0涩禀,1)之間的隨機數(shù) 開區(qū)間
  • 生成一個0-x之間的隨機數(shù)
    Math.round(Math.random()*x)
  • 生成一個x-y之間的隨機數(shù)
    Math.round(Math.random()*(y-x)+x)
  1. max() 可以獲取多個數(shù)中的最大值
    var max = Math.max(10,45,30,100);
  2. min() 可以獲取多個數(shù)中的最小值
    var min = Math.min(10,45,30,100);
  3. Math.pow(x,y)
    返回x的y次冪
  4. Math.sqrt()
    用于對一個數(shù)進(jìn)行開方運算
#26. 包裝類
  • 在JS中為我們提供了三個包裝類,通過這三個包裝類可以將基本數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換為對象
  1. String()
  • 可以將基本數(shù)據(jù)類型字符串轉(zhuǎn)換為String對象
  • var num = new Number(3);
  1. Number()
  • 可以將基本數(shù)據(jù)類型的數(shù)字轉(zhuǎn)換為Number對象
  • var str = new String("hello");
  1. Boolean()
  • 可以將基本數(shù)據(jù)類型的布爾值轉(zhuǎn)換為Boolean對象
  • var bool = new Boolean(true);
  • 但是注意:我們在實際應(yīng)用中不會使用基本數(shù)據(jù)類型的對象然眼,
    如果使用基本數(shù)據(jù)類型的對象艾船,在做一些比較時可能會帶來一些不可預(yù)期的結(jié)果
  • 方法和屬性只能添加給對象,不能添加給基本數(shù)據(jù)類型
    當(dāng)我們對一些基本數(shù)據(jù)類型的值去調(diào)用屬性和方法時高每,
    瀏覽器會臨時使用包裝類將其轉(zhuǎn)換為對象屿岂,然后在調(diào)用對象的屬性和方法
    調(diào)用完以后,再將其轉(zhuǎn)換為基本數(shù)據(jù)類型
#27. 字符串的相關(guān)方法
  1. 在底層字符串是以字符數(shù)組的形式保存的
    ["H","e","l"]
  2. length屬性
  • 可以用來獲取字符串的長度
  1. charAt()
  • 可以返回字符串中指定位置的字符
  • 根據(jù)索引獲取指定的字符
  1. charCodeAt()
  • 獲取指定位置字符的字符編碼(Unicode編碼)
  1. String.formCharCode()
  • 可以根據(jù)字符編碼去獲取字符
  1. concat() 不改變字符串
  • 可以用來連接兩個或多個字符串
  • 作用和+一樣
  1. indexof()
  • 該方法可以檢索一個字符串中是否含有指定內(nèi)容
  • 如果字符串中含有該內(nèi)容鲸匿,則會返回其第一次出現(xiàn)的索引,如果沒有找到指定的內(nèi)容爷怀,則返回-1
  • 可以指定一個第二個參數(shù),指定開始查找的位置
  1. lastIndexOf();
  • 該方法的用法和indexOf()一樣晒骇,不同的是indexOf是從前往后找霉撵,而lastIndexOf是從后往前找
  • 也可以指定開始查找的位置
  1. slice() 不改變字符串
  • 可以從字符串中截取指定的內(nèi)容
  • 不會影響原字符串磺浙,而是將截取到內(nèi)容返回
  • 參數(shù):
    • 第一個洪囤,開始位置的索引(包括開始位置)
    • 第二個,結(jié)束位置的索引(不包括結(jié)束位置)
      • 如果省略第二個參數(shù)撕氧,則會截取到后邊所有的
    • 也可以傳遞一個負(fù)數(shù)作為參數(shù)瘤缩,負(fù)數(shù)的話將會從后邊計算
  1. substring() 不改變字符串
  • 可以用來截取一個字符串,可以slice()類似
  • 參數(shù):
    • 第一個:開始截取位置的索引(包括開始位置)
    • 第二個:結(jié)束位置的索引(不包括結(jié)束位置)
    • 不同的是這個方法不能接受負(fù)值作為參數(shù)伦泥,如果傳遞了一個負(fù)值剥啤,則默認(rèn)使用0
    • 而且他還自動調(diào)整參數(shù)的位置,如果第二個參數(shù)小于第一個不脯,則自動交換
  1. substr 不改變字符串
  • 用來截取字符串
  • 參數(shù):
    1.截取開始位置的索引
    2.截取的長度
  1. split() 不改變字符串
  • 可以將一個字符串拆分為一個數(shù)組
  • 參數(shù):
    • 需要一個字符串作為參數(shù)府怯,將會根據(jù)該字符串去拆分?jǐn)?shù)組
    • 如果傳遞一個空串作為參數(shù),則會將每個字符都拆分為數(shù)組中的一個元素
    • 方法中可以傳遞一個正則表達(dá)式作為參數(shù)防楷,這樣方法將會根據(jù)正則表達(dá)式去拆分字符串
    • 這個方法即使正則表達(dá)式不指定全局匹配牺丙,也會全都拆分
  1. toUpperCase() 不改變字符串
  • 將一個字符串轉(zhuǎn)換為大寫并返回
  1. toLowerCase() 不改變字符串
  • 將一個字符串轉(zhuǎn)換為小寫并返回
  1. search()
  • 可以搜索字符串中是否含有指定內(nèi)容
  • 如果搜索到指定內(nèi)容,則會返回第一次出現(xiàn)的索引复局,如果沒有搜索到返回-1
  • 它可以接受一個正則表達(dá)式作為參數(shù)冲簿,然后會根據(jù)正則表達(dá)式去檢索字符串
  • serach()只會查找第一個,即使設(shè)置全局匹配也沒用
  1. match()
  • 可以根據(jù)正則表達(dá)式亿昏,從一個字符串中將符合條件的內(nèi)容提取出來
  • 默認(rèn)情況下我們的match只會找到第一個符合要求的內(nèi)容峦剔,找到以后就停止檢索
    我們可以設(shè)置正則表達(dá)式為全局匹配模式,這樣就會匹配到所有的內(nèi)容
    可以為一個正則表達(dá)式設(shè)置多個匹配模式角钩,且順序無所謂
  • match()會將匹配到的內(nèi)容封裝到一個數(shù)組中返回吝沫,即使只查詢到一個結(jié)果
  1. replace()
  • 可以將字符串中指定內(nèi)容替換為新的內(nèi)容
  • 參數(shù):
    1.被替換的內(nèi)容呻澜,可以接受一個正則表達(dá)式作為參數(shù)
    2.新的內(nèi)容
  • 默認(rèn)只會替換第一個
#28. 正則表達(dá)式
  1. 正則表達(dá)式用于定義一些字符串的規(guī)則,計算機可以根據(jù)正則表達(dá)式惨险,
    來檢查一個字符串是否符合規(guī)則易迹,獲取將字符串中符合規(guī)則的內(nèi)容提取出來
  2. 創(chuàng)建正則表達(dá)式的對象
    語法:
    var 變量 = new RegExp("正則表達(dá)式","匹配模式");
    使用typeof檢查正則對象,會返回object
    var reg = new RegExp("a"); 這個正則表達(dá)式可以來檢查一個字符串中是否含有a
    在構(gòu)造函數(shù)中可以傳遞一個匹配模式作為第二個參數(shù)平道,可以是
    i 忽略大小寫
    g 全局匹配模式. 查找所有匹配而并非在找到帶一個匹配后停止
    可以為一個正則表達(dá)式設(shè)置多個匹配模式睹欲,且順序無所謂 /[a-z]/ig
  3. 正則表達(dá)式的方法:
    test()
    • 使用這個方法可以用來檢查一個字符串是否符合正則表達(dá)式的規(guī)則,如果符合則返回true一屋,否則返回false
  4. 使用字面量來創(chuàng)建正則表達(dá)式
    語法:var 變量 = /正則表達(dá)式/匹配模式
    • 使用字面量的方式創(chuàng)建更加簡單
    • 使用構(gòu)造函數(shù)創(chuàng)建更加靈活,因為可以把變量作為一個正則表達(dá)式傳進(jìn)去
    • 可以為一個正則表達(dá)式設(shè)置多個匹配模式窘疮,且順序無所謂
  5. 正則表達(dá)式規(guī)則
    1. 使用 | 表示或者的意思
    2. []里的內(nèi)容也是或的關(guān)系
      [ab] == a|b
    3. [a-z] 任意小寫字母
    4. [A-Z] 任意大寫字母
    5. [A-z] 任意字母
    6. [0-9] 任意數(shù)字
    7. [^ ] 除了
  6. 量詞
  • 通過量詞可以設(shè)置一個內(nèi)容出現(xiàn)的次數(shù)
  • 量詞只對它前邊的一個內(nèi)容起作用
  • {n} 正好出現(xiàn)n次
  • {m,n} 出現(xiàn)m-n次
  • {m,} m次以上
    • 至少一個,相當(dāng)于{1,}
    • 0個或多個冀墨,相當(dāng)于{0,}
  • ? 0個或1個闸衫,相當(dāng)于{0,1}
  • ^ 表示開頭
  • $ 表示結(jié)尾
  1. 元字符
  2. .
  • 表示任意字符,除了換行和行結(jié)束符
  1. \w
  • 任意字母诽嘉、數(shù)字蔚出、_ [A-z0-9_]
  1. \W
  • 除了字母、數(shù)字虫腋、_ [^A-z0-9_]
  1. \d
  • 任意的數(shù)字 [0-9]
  1. \D
  • 除了數(shù)字 [^0-9]
  1. \s
  • 空格
  1. \S
  • 除了空格
  1. \b
  • 單詞邊界
  1. \B
  • 除了單詞邊界
#29. DOM
  1. DOM骄酗,全稱Document Object Model文檔對象模型。
  2. JS中通過DOM來對HTML文檔進(jìn)行操作悦冀。只要理解了DOM就可以隨
    心所欲的操作WEB頁面趋翻。
  3. 文檔
  • 文檔表示的就是整個的HTML網(wǎng)頁文檔
  1. 對象
  • 對象表示將網(wǎng)頁中的每一個部分都轉(zhuǎn)換為了一個對象。
  1. 模型
  • 使用模型來表示對象之間的關(guān)系盒蟆,這樣方便我們獲取對象。
  1. 節(jié)點
  • Node——構(gòu)成HTML文檔最基本的單元历等。
  • 常用節(jié)點分為四類
    • 文檔節(jié)點:整個HTML文檔
    • 元素節(jié)點:HTML文檔中的HTML標(biāo)簽
    • 屬性節(jié)點:元素的屬性
    • 文本節(jié)點:HTML標(biāo)簽中的文本內(nèi)容
![QQ瀏覽器截圖20200121175011.png](https://upload-images.jianshu.io/upload_images/20262498-294267c6e146ac2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  1. 文檔節(jié)點
  • 文檔節(jié)點document讨惩,代表的是整個HTML文檔,網(wǎng)頁中的所有節(jié)點都是它的子節(jié)點寒屯。
  • document對象作為window對象的屬性存在
    的荐捻,我們不用獲取可以直接使用。
  • 通過該對象我們可以在整個文檔訪問內(nèi)查找節(jié)
    點對象浩螺,并可以通過該對象創(chuàng)建各種節(jié)點對象靴患。
  • console.log(document);
  1. 元素節(jié)點
  • HTML中的各種標(biāo)簽都是元素節(jié)點,這也是我們最常用的一個節(jié)點要出。
  • 瀏覽器會將頁面中所有的標(biāo)簽都轉(zhuǎn)換為一個元素節(jié)點鸳君,我們可以通過document的方法來獲取元素節(jié)點。
  • 比如:
    • document.getElementById()
    • 根據(jù)id屬性值獲取一個元素節(jié)點對象
  1. 文本節(jié)點(Text)
  • 文本節(jié)點表示的是HTML標(biāo)簽以外的文本內(nèi)容患蹂,任意非HTML的文本都是文本節(jié)點或颊。
  • 它包括可以字面解釋的純文本內(nèi)容砸紊。
  • 文本節(jié)點一般是作為元素節(jié)點的子節(jié)點存在的。
  • 獲取文本節(jié)點時囱挑,一般先要獲取元素節(jié)點醉顽。在通過元素節(jié)點獲取文本節(jié)點。
  • 例如:
    • 元素節(jié)點.firstChild;
    • 獲取元素節(jié)點的第一個子節(jié)點平挑,一般為文本節(jié)點
  1. 屬性節(jié)點(Attr)
  • 屬性節(jié)點表示的是標(biāo)簽中的一個一個的屬性
    這里要注意的是屬性節(jié)點并非是元素節(jié)點的子節(jié)點游添,而是元素節(jié)點的一部分。
  • 可以通過元素節(jié)點來獲取指定的屬性節(jié)點通熄。
  • 例如:
    • 元素節(jié)點.getAttributeNode("屬性名");
  • 注意:我們一般不使用屬性節(jié)點
  1. 獲取元素節(jié)點
  • 通過document對象調(diào)用
    1. getElementById()
    • 通過id屬性獲取一個元素節(jié)點對象
    1. getElementsByTagName()
    • 通過標(biāo)簽名獲取一組元素節(jié)點對象
    1. getElementsByName()
    • 通過name屬性獲取一組元素節(jié)點對象
  1. 獲取元素節(jié)點的子節(jié)點
  • 通過具體的元素節(jié)點調(diào)用
    1. getElementsByTagName()
    • 方法唆涝,返回當(dāng)前節(jié)點的指定標(biāo)簽名后代節(jié)點
    1. childNodes
    • 屬性,表示當(dāng)前節(jié)點的所有子節(jié)點唇辨,文本元素都有
    1. children
    • 屬性廊酣,表示當(dāng)前節(jié)點的所有子節(jié)點,只有元素節(jié)點赏枚,推薦使用
    1. firstChild
    • 屬性亡驰,表示當(dāng)前節(jié)點的第一個子節(jié)點,文本元素都有
    1. firstElementChild
    • 獲取當(dāng)前元素的第一個子元素饿幅,只有元素節(jié)點凡辱,不支持ie8
    1. lastChild
    • 屬性,表示當(dāng)前節(jié)點的最后一個子節(jié)點
    1. firstElementChild
    • 獲取當(dāng)前元素的最后一個子元素诫睬,只有元素節(jié)點煞茫,不支持ie8
  1. 獲取父節(jié)點和兄弟節(jié)點
  • 通過具體的節(jié)點調(diào)用
    1. parentNode
    • 屬性帕涌,表示當(dāng)前節(jié)點的父節(jié)點
    1. parentElement
    • 屬性摄凡,表示當(dāng)前節(jié)點的父元素
    1. previousSibling
    • 屬性,表示當(dāng)前節(jié)點的前一個兄弟節(jié)點
    1. previousElementSibling
    • 屬性蚓曼,表示當(dāng)前節(jié)點的前一個兄弟元素亲澡,不支持ie8
    1. nextSibling
    • 屬性,表示當(dāng)前節(jié)點的后一個兄弟節(jié)點
    1. nextElementSibling
    • 屬性纫版,表示當(dāng)前節(jié)點的后一個兄弟元素床绪,不支持ie8
  1. 元素節(jié)點的屬性
  • 獲取,元素對象.屬性名
    例:element.value
    element.id
    element.className
  • 設(shè)置其弊,元素對象.屬性名=新的值
    例:element.value = “hello”
    element.id = “id01”
    element.className = “newClass”
  • 其他屬性
    • nodeValue
      • 文本節(jié)點可以通過nodeValue屬性獲取和設(shè)置文本節(jié)點的內(nèi)容
    • innerHTML
      • 元素節(jié)點通過該屬性獲取和設(shè)置標(biāo)簽內(nèi)部的html代碼
      • innerHTML對于自結(jié)束標(biāo)簽癞己,這個屬性沒有意義
    • innerText
      • 該屬性可以獲取到元素內(nèi)部的文本內(nèi)容
        • 它和innerHTML類似,不同的是它會自動將html去除
  1. 事件
  • 事件梭伐,就是用戶和瀏覽器之間的交互行為痹雅,比如:點擊按鈕,鼠標(biāo)移動糊识、關(guān)閉窗口绩社。摔蓝。。
  • 可以為按鈕的對應(yīng)事件綁定處理函數(shù)的形式來響應(yīng)事件愉耙,這樣當(dāng)事件被觸發(fā)時贮尉,其對應(yīng)的函數(shù)將會被調(diào)用
    //綁定一個單擊事件
    //像這種為單擊事件綁定的函數(shù),我們稱為單擊響應(yīng)函數(shù)
    btn.onclick = function(){
    alert("點擊了按鈕");
    };
  1. 文檔的加載
  • 瀏覽器在加載一個頁面時朴沿,是按照自上向下的順序加載的猜谚,讀取到一行就運行一行,
    如果將script標(biāo)簽寫到頁面的上邊,在代碼執(zhí)行時赌渣,頁面還沒有加載龄毡,
    頁面沒有加載DOM對象也沒有加載,會導(dǎo)致無法獲取到DOM對象
  • onload事件會在整個頁面加載完成之后才觸發(fā)
    為window綁定一個onload事件
    該事件對應(yīng)的響應(yīng)函數(shù)將會在頁面加載完成之后執(zhí)行锡垄,
    這樣可以確保我們的代碼執(zhí)行時所有的DOM對象已經(jīng)加載完畢了
  • window.onload = function(){
    var btn = document.getElementById("btn");
    btn.onclick = function(){
    alert("hello");
    };
    };
  1. DOM查詢的其他方法
  2. 獲取body標(biāo)簽
    var body = document.body;
  3. 獲取html 標(biāo)簽
    var html = document.documentElement;
  4. 獲取所有標(biāo)簽
    var all = document.all;
    var all = document.getElementsByTagName("*");
  5. 根據(jù)元素的class屬性值查詢一組元素節(jié)點對象
    getElementsByClassName()可以根據(jù)class屬性值獲取一組元素節(jié)點對象沦零,
    但是該方法不支持IE8及以下的瀏覽器
  6. CSS選擇器
  7. var div = document.querySelector(".box1 div");
- 需要一個選擇器的字符串作為參數(shù),可以根據(jù)一個CSS選擇器來查詢一個元素節(jié)點對象
- 雖然IE8中沒有g(shù)etElementsByClassName()但是可以使用querySelector()代替
- 使用該方法總會返回唯一的一個元素货岭,如果滿足條件的元素有多個路操,那么它只會返回第一個
2.  document.querySelectorAll()
- 該方法和querySelector()用法類似,不同的是它會將符合條件的元素封裝到一個數(shù)組中返回
- 即使符合條件的元素只有一個千贯,它也會返回數(shù)組
  1. DOM增刪改
  2. document.createElement()
    可以用于創(chuàng)建一個元素節(jié)點對象
    它需要一個標(biāo)簽名作為參數(shù)屯仗,將會根據(jù)該標(biāo)簽名創(chuàng)建元素節(jié)點對象,并將創(chuàng)建好的對象作為返回值返回
  3. document.createTextNode()
    可以用來創(chuàng)建一個文本節(jié)點對象
    需要一個文本內(nèi)容作為參數(shù)搔谴,將會根據(jù)該內(nèi)容創(chuàng)建文本節(jié)點魁袜,并將新的節(jié)點返回
  4. appendChild()
- 向一個父節(jié)點中添加一個新的子節(jié)點
- 語法:父節(jié)點.appendChild(子節(jié)點);
  1. insertBefore()
- 可以在指定的子節(jié)點前插入新的子節(jié)點
- 語法:父節(jié)點.insertBefore(新節(jié)點,指定的子節(jié)點);
  1. replaceChild()
- 可以使用指定的子節(jié)點替換已有的子節(jié)點
- 語法:父節(jié)點.replaceChild(新節(jié)點,舊節(jié)點);
  1. removeChild()
- 可以刪除一個子節(jié)點
- 語法:父節(jié)點.removeChild(子節(jié)點);
       子節(jié)點.parentNode.removeChild(子節(jié)點);
  1. DOM操作CSS
  2. 通過JS修改元素的樣式:
- 語法:元素.style.樣式名 = 樣式值
- 注意:如果CSS的樣式名中含有-,這種名稱在JS中是不合法的比如background-color
  需要將這種樣式名修改為駝峰命名法敦第,去掉-峰弹,然后將-后的字母大寫
- 我們通過style屬性設(shè)置的樣式都是內(nèi)聯(lián)樣式,而內(nèi)聯(lián)樣式有較高的優(yōu)先級芜果,所以通過JS修改的樣式往往會立即顯示
  但是如果在樣式中寫了!important鞠呈,則此時樣式會有最高的優(yōu)先級,即使通過JS也不能覆蓋該樣式右钾,
  此時將會導(dǎo)致JS修改樣式失效,所以盡量不要為樣式添加!important
  1. 讀取元素的內(nèi)聯(lián)樣式
- 語法:元素.style.樣式名
- 通過style屬性設(shè)置和讀取的都是內(nèi)聯(lián)樣式蚁吝,無法讀取樣式表中的樣式
  1. 獲取元素的當(dāng)前顯示的樣式(IE)
- 語法:元素.currentStyle.樣式名
- 它可以用來讀取當(dāng)前元素正在顯示的樣式,如果當(dāng)前元素沒有設(shè)置該樣式舀射,則獲取它的默認(rèn)值
- currentStyle只有IE瀏覽器支持窘茁,其他的瀏覽器都不支持
  1. 獲取元素當(dāng)前的樣式(其他)
- var obj = getComputedStyle(box1,null);
- 在其他瀏覽器中可以使用
- getComputedStyle()這個方法來獲取元素當(dāng)前的樣式
- 這個方法是window的方法,可以直接使用
- 需要兩個參數(shù)
  第一個:要獲取樣式的元素
  第二個:可以傳遞一個偽元素脆烟,一般都傳null
- 該方法會返回一個對象山林,對象中封裝了當(dāng)前元素對應(yīng)的樣式
- 可以通過對象.樣式名來讀取樣式
- 如果獲取的樣式?jīng)]有設(shè)置,則會獲取到真實的值浩淘,而不是默認(rèn)值
  比如:沒有設(shè)置width捌朴,它不會獲取到auto吴攒,而是一個長度
- 但是該方法不支持IE8及以下的瀏覽器
- 通過currentStyle和getComputedStyle()讀取到的樣式都是只讀的,
- 不能修改砂蔽,如果要修改必須通過style屬性
  1. 兼容IE8和其他瀏覽器的獲取樣式
    定義一個函數(shù)洼怔,用來獲取指定元素的當(dāng)前的樣式
    * 參數(shù):
    * obj 要獲取樣式的元素
    * name 要獲取的樣式名
    function getStyle(obj , name){

           if(window.getComputedStyle){
               //正常瀏覽器的方式,具有g(shù)etComputedStyle()方法
               return getComputedStyle(obj , null)[name];
           }else{
               //IE8的方式左驾,沒有g(shù)etComputedStyle()方法
               return obj.currentStyle[name];
           }
    
  2. 其他樣式屬性

  3. clientWidth和clientHeight

- 這兩個屬性可以獲取元素的可見寬度和高度
- 這些屬性都是不帶px的镣隶,返回都是一個數(shù)字,可以直接進(jìn)行計算
- 會獲取元素寬度和高度诡右,包括內(nèi)容區(qū)和內(nèi)邊距
- 這些屬性都是只讀的安岂,不能修改
2. offsetWidth和offsetHeight
- 獲取元素的整個的寬度和高度,包括內(nèi)容區(qū)帆吻、內(nèi)邊距和邊框
3. offsetParent
- 可以用來獲取當(dāng)前元素的定位父元素
- 會獲取到離當(dāng)前元素最近的開啟了定位的祖先元素
  如果所有的祖先元素都沒有開啟定位域那,則返回body
4. offsetLeft
- 當(dāng)前元素相對于其定位父元素的水平偏移量
5. offsetTop
- 當(dāng)前元素相對于其定位父元素的垂直偏移量
6. scrollWidth和scrollHeight
- 可以獲取元素整個滾動區(qū)域的寬度和高度
7. scrollLeft和scrollTop
- 可以獲取水平滾動條滾動的距離和垂直滾動條滾動的距離
8. 當(dāng)滿足scrollHeight - scrollTop == clientHeight,說明垂直滾動條滾動到底了
    當(dāng)滿足scrollWidth - scrollLeft == clientWidth猜煮,說明水平滾動條滾動到底
#30. 事件對象
  1. 添加事件對象的三種辦法
    1. 通過HTML標(biāo)簽的屬性設(shè)置
    • <button onclick="alert('hello');alert('world')">按鈕</button>
    1. 通過DOM對象的屬性綁定 (推薦)
    • var btn = document.getElementById('btn');
      btn.onclick = function(){
      alert("hello");
      };
    1. 設(shè)置事件監(jiān)聽器
    • btn.addEventListener('click' , function(){alert("hello");});
  2. 當(dāng)事件的響應(yīng)函數(shù)被觸發(fā)時次员,瀏覽器每次都會將一個事件對象作為實參傳遞進(jìn)響應(yīng)函數(shù)
    在事件對象中封裝了當(dāng)前事件相關(guān)的一切信息,比如:鼠標(biāo)的坐標(biāo) 鍵盤哪個按鍵被按下 鼠標(biāo)滾輪滾動的方向王带。淑蔚。
  3. 在IE8中,響應(yīng)函數(shù)被觸發(fā)時愕撰,瀏覽器不會傳遞事件對象刹衫,
    在IE8及以下的瀏覽器中,是將事件對象作為window對象的屬性保存的
    解決方法:
    var event = event || window.event;
  4. clientX和clientY用于獲取鼠標(biāo)在當(dāng)前的可見窗口的坐標(biāo)
#30. 事件冒泡
  1. 事件的冒泡(Bubble)
  • 所謂的冒泡指的就是事件的向上傳導(dǎo)搞挣,當(dāng)后代元素上的事件被觸發(fā)時带迟,其祖先元素的相同事件也會被觸發(fā)
  • 在開發(fā)中大部分情況冒泡都是有用的,如果不希望發(fā)生事件冒泡可以通過事件對象來取消冒泡
  1. 取消冒泡/捕獲
  • 可以將事件對象的cancelBubble設(shè)置為true,即可取消冒泡/捕獲
    event.cancelBubble = true;
    在高級瀏覽器中使用stopPropagation()方法柿究;在IE下必須設(shè)置cancelBubble = true
#30. 事件委派
  1. 指將事件統(tǒng)一綁定給元素的共同的祖先元素邮旷,這樣當(dāng)后代元素上的事件觸發(fā)時,會一直冒泡到祖先元素蝇摸,從而通過祖先元素的響應(yīng)函數(shù)來處理事件。
  2. 事件委派是利用了冒泡办陷,通過委派可以減少事件綁定的次數(shù)貌夕,提高程序的性能
  3. 我們希望,只綁定一次事件民镜,即可應(yīng)用到多個的元素上啡专,即使元素是后添加的
#31. 事件綁定
  1. 使用 對象.事件 = 函數(shù) 的形式綁定響應(yīng)函數(shù),
  • 它只能同時為一個元素的一個事件綁定一個響應(yīng)函數(shù)制圈,
  • 不能綁定多個们童,如果綁定了多個畔况,則后邊會覆蓋掉前邊的
  1. addEventListener()
  • 通過這個方法也可以為元素綁定響應(yīng)函數(shù)
  • 參數(shù):
    1.事件的字符串,不要on
    2.回調(diào)函數(shù)慧库,當(dāng)事件觸發(fā)時該函數(shù)會被調(diào)用
    3.是否在捕獲階段觸發(fā)事件跷跪,需要一個布爾值,一般都傳false
  • 使用addEventListener()可以同時為一個元素的相同事件同時綁定多個響應(yīng)函數(shù)齐板,
    這樣當(dāng)事件被觸發(fā)時吵瞻,響應(yīng)函數(shù)將會按照函數(shù)的綁定順序執(zhí)行
  • 這個方法不支持IE8及以下的瀏覽器
  • btn01.addEventListener("click",function(){
    alert(1);
    },false);
  1. attachEvent()
  • 在IE8中可以使用attachEvent()來綁定事件
  • 參數(shù):
    1.事件的字符串,要on
    2.回調(diào)函數(shù)
  • 這個方法也可以同時為一個事件綁定多個處理函數(shù)甘磨,不同的是它是后綁定先執(zhí)行橡羞,執(zhí)行順序和addEventListener()相反
  1. 綜合
    定義一個函數(shù),用來為指定元素綁定響應(yīng)函數(shù)
  • addEventListener()中的this济舆,是綁定事件的對象
    attachEvent()中的this卿泽,是window
    需要統(tǒng)一兩個方法this
  • 參數(shù):
    obj 要綁定事件的對象
    eventStr 事件的字符串(不要on)
    callback 回調(diào)函數(shù)
  • function bind(obj , eventStr , callback){
    if(obj.addEventListener){
    //大部分瀏覽器兼容的方式
    obj.addEventListener(eventStr , callback , false);
    }else{
    /*
    * this是誰由調(diào)用方式?jīng)Q定
    * callback.call(obj)
    */
    //IE8及以下
    obj.attachEvent("on"+eventStr , function(){
    //在匿名函數(shù)中調(diào)用回調(diào)函數(shù),這一步是為了this能指向元素滋觉,而不是window
    callback.call(obj);
    });
    }
    }
#32. 事件傳播
  • 關(guān)于事件的傳播網(wǎng)景公司和微軟公司有不同的理解
  • 微軟公司認(rèn)為事件應(yīng)該是由內(nèi)向外傳播又厉,也就是當(dāng)事件觸發(fā)時,應(yīng)該先觸發(fā)當(dāng)前元素上的事件椎瘟,
    然后再向當(dāng)前元素的祖先元素上傳播覆致,也就說事件應(yīng)該在冒泡階段執(zhí)行。
  • 網(wǎng)景公司認(rèn)為事件應(yīng)該是由外向內(nèi)傳播的肺蔚,也就是當(dāng)前事件觸發(fā)時煌妈,應(yīng)該先觸發(fā)當(dāng)前元素的最外層的祖先元素的事件,
    然后在向內(nèi)傳播給后代元素
  • W3C綜合了兩個公司的方案宣羊,將事件傳播分成了三個階段
    1.捕獲階段
    • 在捕獲階段時從最外層的祖先元素璧诵,向目標(biāo)元素進(jìn)行事件的捕獲,但是默認(rèn)此時不會觸發(fā)事件
      2.目標(biāo)階段
    • 事件捕獲到目標(biāo)元素仇冯,捕獲結(jié)束開始在目標(biāo)元素上觸發(fā)事件
      3.冒泡階段
    • 事件從目標(biāo)元素向他的祖先元素傳遞之宿,依次觸發(fā)祖先元素上的事件
  • 如果希望在捕獲階段就觸發(fā)事件,可以將addEventListener()的第三個參數(shù)設(shè)置為true
    一般情況下我們不會希望在捕獲階段觸發(fā)事件苛坚,所以這個參數(shù)一般都是false
  • IE8及以下的瀏覽器中沒有捕獲階段
#33. 拖拽事件&&滾輪事件&&鍵盤事件

JS源碼-day16
JS源碼-day17 鍵盤事件-移動div

#34. BOM
  • 瀏覽器對象模型
  • BOM可以使我們通過JS來操作瀏覽器
  • 在BOM中為我們提供了一組對象比被,用來完成對瀏覽器的操作
  • BOM對象
    1.Window
    • 代表的是整個瀏覽器的窗口,同時window也是網(wǎng)頁中的全局對象
      2.Navigator
    • 代表的當(dāng)前瀏覽器的信息泼舱,通過該對象可以來識別不同的瀏覽器
      3.Location
    • 代表當(dāng)前瀏覽器的地址欄信息等缀,通過Location可以獲取地址欄信息,或者操作瀏覽器跳轉(zhuǎn)頁面
      4.History
    • 代表瀏覽器的歷史記錄娇昙,可以通過該對象來操作瀏覽器的歷史記錄
      由于隱私原因尺迂,該對象不能獲取到具體的歷史記錄,只能操作瀏覽器向前或向后翻頁
      而且該操作只在當(dāng)次訪問時有效
      5.Screen
    • 代表用戶的屏幕的信息,通過該對象可以獲取到用戶的顯示器的相關(guān)的信息
  • 這些BOM對象在瀏覽器中都是作為window對象的屬性保存的噪裕,
    可以通過window對象來使用蹲盘,也可以直接使用
#35. Navigator
  • 代表的當(dāng)前瀏覽器的信息,通過該對象可以來識別不同的瀏覽器
  • 由于歷史原因膳音,Navigator對象中的大部分屬性都已經(jīng)不能幫助我們識別瀏覽器了
  • 一般我們只會使用userAgent來判斷瀏覽器的信息召衔,
    userAgent是一個字符串,這個字符串中包含有用來描述瀏覽器信息的內(nèi)容严蓖,
    不同的瀏覽器會有不同的userAgent
    火狐的userAgent
    Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
    Chrome的userAgent
    Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
    IE8
    Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
    IE9
    Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
    IE10
    Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
    IE11
    Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; rv:11.0) like Gecko
  • 在IE11中已經(jīng)將微軟和IE相關(guān)的標(biāo)識都已經(jīng)去除了薄嫡,
    所以我們基本已經(jīng)不能通過UserAgent來識別一個瀏覽器是否是IE了
  • 如果通過UserAgent不能判斷,還可以通過一些瀏覽器中特有的對象颗胡,來判斷瀏覽器的信息
    比如:ActiveXObject
  • 判斷手段
    var ua = navigator.userAgent;
    if(/firefox/i.test(ua)){
    alert("你是火狐:辽睢!毒姨!");
    }else if(/chrome/i.test(ua)){
    alert("你是Chrome");
    }else if(/msie/i.test(ua)){
    alert("你是IE瀏覽器~~~");
    }else if("ActiveXObject" in window){
    alert("你是IE11哑蔫,槍斃了你~~~");
    }
#36. History
  • 對象可以用來操作瀏覽器向前或向后翻頁
  • length
    • 屬性,可以獲取到當(dāng)成訪問的鏈接數(shù)量
      alert(history.length);
  • back()
    • 可以用來回退到上一個頁面弧呐,作用和瀏覽器的回退按鈕一樣
      history.back();
  • forward()
    • 可以跳轉(zhuǎn)下一個頁面闸迷,作用和瀏覽器的前進(jìn)按鈕一樣
      history.forward();
  • go()
    • 可以用來跳轉(zhuǎn)到指定的頁面
    • 它需要一個整數(shù)作為參數(shù)
      1:表示向前跳轉(zhuǎn)一個頁面 相當(dāng)于forward()
      2:表示向前跳轉(zhuǎn)兩個頁面
      -1:表示向后跳轉(zhuǎn)一個頁面
      -2:表示向后跳轉(zhuǎn)兩個頁面
#37. Location
  • 該對象中封裝了瀏覽器的地址欄的信息
  • 如果直接打印location,則可以獲取到地址欄的信息(當(dāng)前頁面的完整路徑)
    alert(location);
  • 如果直接將location屬性修改為一個完整的路徑俘枫,或相對路徑
    則我們頁面會自動跳轉(zhuǎn)到該路徑腥沽,并且會生成相應(yīng)的歷史記錄
  • assign()
    用來跳轉(zhuǎn)到其他的頁面,作用和直接修改location一樣
  • reload()
    用于重新加載當(dāng)前頁面鸠蚪,作用和刷新按鈕一樣
    如果在方法中傳遞一個true今阳,作為參數(shù),則會強制清空緩存刷新頁面
    location.reload(true);//CTRL+F5
  • replace()
    可以使用一個新的頁面替換當(dāng)前頁面茅信,調(diào)用完畢也會跳轉(zhuǎn)頁面
    不會生成歷史記錄盾舌,不能使用回退按鈕回退
#38. window的時間調(diào)用功能
  1. setInterval()
  • 定時調(diào)用
  • 可以將一個函數(shù),每隔一段時間執(zhí)行一次
  • 參數(shù):
    1.回調(diào)函數(shù)蘸鲸,該函數(shù)會每隔一段時間被調(diào)用一次
    2.每次調(diào)用間隔的時間妖谴,單位是毫秒
  • 返回值:返回一個Number類型的數(shù)據(jù),這個數(shù)字用來作為定時器的唯一標(biāo)識
  • eg:
    var timer = setInterval(function(){
    count.innerHTML = num++;
    },1000);
  1. clearInterval()
  • 可以用來關(guān)閉一個定時器
  • 方法中需要一個定時器的標(biāo)識作為參數(shù)酌摇,這樣將關(guān)閉標(biāo)識對應(yīng)的定時器
  • clearInterval(timer);
  1. 功能
  2. 通過定時器解決瀏覽器連續(xù)按鍵卡頓問題 day17-06.移動div練習(xí)
  3. 輪播圖 day17
  4. setTimeout 延時調(diào)用
  5. 延時調(diào)用一個函數(shù)不馬上執(zhí)行膝舅,而是隔一段時間以后在執(zhí)行,而且只會執(zhí)行一次
    延時調(diào)用和定時調(diào)用的區(qū)別妙痹,定時調(diào)用會執(zhí)行多次破停,而延時調(diào)用只會執(zhí)行一次
    延時調(diào)用和定時調(diào)用實際上是可以互相代替的纬纪,在開發(fā)中可以根據(jù)自己需要去選擇
  6. var timer = setTimeout(function(){
    console.log(num++);
    },3000);
  7. 使用clearTimeout()來關(guān)閉一個延時調(diào)用
    clearTimeout(timer);
#39. JSON
  1. JS中的對象只有JS自己認(rèn)識重窟,其他的語言都不認(rèn)識充边,JSON的出現(xiàn)是為了讓js和其他語言交流
  2. JSON就是一個特殊格式的字符串犯建,這個字符串可以被任意的語言所識別,
    并且可以轉(zhuǎn)換為任意語言中的對象诚啃,JSON在開發(fā)中主要用來數(shù)據(jù)的交互
  3. JSON
  • JavaScript Object Notation JS對象表示法
  • JSON和JS對象的格式一樣浆竭,只不過JSON字符串中的屬性名必須加雙引號
    其他的和JS語法一致
  • JSON分類:
    1.對象 {}
    2.數(shù)組 []
  • JSON中允許的值
    1.字符串
    2.數(shù)值
    3.布爾值
    4.null
    5.對象
    6.數(shù)組
  1. 將JSON字符串轉(zhuǎn)換為JS中的對象
  • 在JS中,為我們提供了一個工具類吧秕,就叫JSON
  • 這個對象可以幫助我們將一個JSON轉(zhuǎn)換為JS對象琉闪,也可以將一個JS對象轉(zhuǎn)換為JSON
  • json --> js對象
    • 語法:JSON.parse()
    • 可以將以JSON字符串轉(zhuǎn)換為js對象
    • 它需要一個JSON字符串作為參數(shù),會將該字符串轉(zhuǎn)換為JS對象并返回
    • var o = JSON.parse(json);
  • JS對象 ---> JSON
    • 語法:JSON.stringify()
    • 可以將一個JS對象轉(zhuǎn)換為JSON字符串
    • 需要一個js對象作為參數(shù)砸彬,會返回一個JSON字符串
    • var str = JSON.stringify(obj3);
  1. JSON這個對象在IE7及以下的瀏覽器中不支持颠毙,所以在這些瀏覽器中調(diào)用時會報錯
    如果需要兼容IE7及以下的JSON操作,則可以通過引入一個外部的js文件來處理
  2. eval()
  • 這個函數(shù)可以用來執(zhí)行一段字符串形式的JS代碼砂碉,并將執(zhí)行結(jié)果返回
  • 如果使用eval()執(zhí)行的字符串中含有{},它會將{}當(dāng)成是代碼塊
    如果不希望將其當(dāng)成代碼塊解析蛀蜜,則需要在字符串前后各加一個()
  • eval()這個函數(shù)的功能很強大,可以直接執(zhí)行一個字符串中的js代碼增蹭,
    但是在開發(fā)中盡量不要使用滴某,首先它的執(zhí)行性能比較差,然后它還具有安全隱患
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滋迈,一起剝皮案震驚了整個濱河市霎奢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饼灿,老刑警劉巖幕侠,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碍彭,居然都是意外死亡晤硕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門硕旗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窗骑,“玉大人,你說我怎么就攤上這事漆枚〈匆耄” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵墙基,是天一觀的道長软族。 經(jīng)常有香客問我,道長残制,這世上最難降的妖魔是什么立砸? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮初茶,結(jié)果婚禮上颗祝,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好螺戳,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布搁宾。 她就那樣靜靜地躺著,像睡著了一般倔幼。 火紅的嫁衣襯著肌膚如雪盖腿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天损同,我揣著相機與錄音翩腐,去河邊找鬼。 笑死膏燃,一個胖子當(dāng)著我的面吹牛茂卦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹄梢,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼疙筹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了禁炒?” 一聲冷哼從身側(cè)響起而咆,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幕袱,沒想到半個月后暴备,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡们豌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年涯捻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片望迎。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡障癌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辩尊,到底是詐尸還是另有隱情涛浙,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布摄欲,位于F島的核電站轿亮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胸墙。R本人自食惡果不足惜我注,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迟隅。 院中可真熱鬧但骨,春花似錦励七、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽补履。三九已至添坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箫锤,已是汗流浹背贬蛙。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谚攒,地道東北人阳准。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像馏臭,于是被迫代替她去往敵國和親野蝇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 11括儒、數(shù)據(jù)類型檢測與toString方法的理解 1绕沈,typeof value (檢測一個值的類型:原始類型或者引用...
    萌妹撒閱讀 827評論 0 0
  • 15、正則 正則就是一個規(guī)則帮寻,用來處理字符串的規(guī)則1乍狐、正則匹配編寫一個規(guī)則,驗證某個字符串是否符合這個規(guī)則固逗,正則匹...
    萌妹撒閱讀 1,448評論 0 1
  • 概要 64學(xué)時 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,221評論 0 3
  • 簡介Document Object Model 文檔對象模型浅蚪,通過DOM可以來任意來修改網(wǎng)頁中各個內(nèi)容。文檔指的是...
    xiaohan_zhang閱讀 288評論 0 1
  • 剛認(rèn)識時烫罩,相互矜持著惜傲,禮讓著,說話猶如三月春風(fēng)拂過贝攒,如沫春風(fēng)般的享受女孩間的純純友誼盗誊。時間長了,那些被刻意壓制的惡...
    炸毛的霸王龍臣曦閱讀 319評論 0 0