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對象
- 在JS中使用Date對象來表示一個時間
- 創(chuàng)建一個Date對象
如果直接使用構(gòu)造函數(shù)創(chuàng)建一個Date對象玉罐,則會封裝為當(dāng)前代碼執(zhí)行的時間
var d = new Date(); - 創(chuàng)建一個指定的時間對象
需要在構(gòu)造函數(shù)中傳遞一個表示時間的字符串作為參數(shù)
日期的格式 月份/日/年 時:分:秒
var d2 = new Date("2/18/2011 11:10:30"); - 獲取
- getDate()
- 獲取當(dāng)前日期對象是幾日
- getDay()
- 獲取當(dāng)前日期對象時周幾
- 會返回一個0-6的值
0 表示周日
1 表示周一 屈嗤。。吊输。
- getMonth()
- 獲取當(dāng)前時間對象的月份
- 會返回一個0-11的值
0 表示1月
1 表示2月
11 表示12月
- getFullYear()
- 獲取當(dāng)前日期對象的年份
- getHours()
- 獲取當(dāng)前日期對象的小時(0~23)
- getMinutes()
- 獲取當(dāng)前日期對象的分鐘(0~59)
- getSeconds()
- 獲取當(dāng)前日期對象的秒(0~59)
- getMilliseconds()
- 獲取當(dāng)前日期對象的毫秒(0~999)
- getTime()
- 獲取當(dāng)前日期對象的時間戳
- 時間戳饶号,指的是從格林威治標(biāo)準(zhǔn)時間的1970年1月1日,0時0分0秒到當(dāng)前日期所花費的毫秒數(shù)(1秒 = 1000毫秒)
- 計算機底層在保存時間時使用都是時間戳
- Date.now()
- 獲取執(zhí)行該行代碼時的時間戳
- var start = Date.now();
- var end = Date.now();
- 利用時間戳來測試代碼的執(zhí)行的性能
- toTimeString()
- 把 Date 對象的日期部分轉(zhuǎn)換為可讀字符串:
#25. Math
- Math和其他的對象不同季蚂,它不是構(gòu)造函數(shù)茫船,它屬于工具類不用創(chuàng)建對象琅束,它里邊封裝了數(shù)學(xué)運算相關(guān)的屬性和方法
- 比如:Math.PI 表示的圓周率
- abs()
可以用來計算一個數(shù)的絕對值
Math.abs(-1) = 1 - Math.ceil()
可以對一個數(shù)進(jìn)行向上取整,小數(shù)位只要有值就自動進(jìn)1
Math.ceil(1.1) = 2 - Math.floor()
可以對一個數(shù)進(jìn)行向下取整算谈,小數(shù)部分會被舍掉
Math.floor(1.99) = 1 - Math.round()
可以對一個數(shù)進(jìn)行四舍五入取整
Math.round(1.4) = 1 - Math.random()
- 可以用來生成一個(0涩禀,1)之間的隨機數(shù) 開區(qū)間
- 生成一個0-x之間的隨機數(shù)
Math.round(Math.random()*x) - 生成一個x-y之間的隨機數(shù)
Math.round(Math.random()*(y-x)+x)
- max() 可以獲取多個數(shù)中的最大值
var max = Math.max(10,45,30,100); - min() 可以獲取多個數(shù)中的最小值
var min = Math.min(10,45,30,100); - Math.pow(x,y)
返回x的y次冪 - Math.sqrt()
用于對一個數(shù)進(jìn)行開方運算
#26. 包裝類
- 在JS中為我們提供了三個包裝類,通過這三個包裝類可以將基本數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換為對象
- String()
- 可以將基本數(shù)據(jù)類型字符串轉(zhuǎn)換為String對象
- var num = new Number(3);
- Number()
- 可以將基本數(shù)據(jù)類型的數(shù)字轉(zhuǎn)換為Number對象
- var str = new String("hello");
- 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)方法
- 在底層字符串是以字符數(shù)組的形式保存的
["H","e","l"] - length屬性
- 可以用來獲取字符串的長度
- charAt()
- 可以返回字符串中指定位置的字符
- 根據(jù)索引獲取指定的字符
- charCodeAt()
- 獲取指定位置字符的字符編碼(Unicode編碼)
- String.formCharCode()
- 可以根據(jù)字符編碼去獲取字符
- concat() 不改變字符串
- 可以用來連接兩個或多個字符串
- 作用和+一樣
- indexof()
- 該方法可以檢索一個字符串中是否含有指定內(nèi)容
- 如果字符串中含有該內(nèi)容鲸匿,則會返回其第一次出現(xiàn)的索引,如果沒有找到指定的內(nèi)容爷怀,則返回-1
- 可以指定一個第二個參數(shù),指定開始查找的位置
- lastIndexOf();
- 該方法的用法和indexOf()一樣晒骇,不同的是indexOf是從前往后找霉撵,而lastIndexOf是從后往前找
- 也可以指定開始查找的位置
- slice() 不改變字符串
- 可以從字符串中截取指定的內(nèi)容
- 不會影響原字符串磺浙,而是將截取到內(nèi)容返回
- 參數(shù):
- 第一個洪囤,開始位置的索引(包括開始位置)
- 第二個,結(jié)束位置的索引(不包括結(jié)束位置)
- 如果省略第二個參數(shù)撕氧,則會截取到后邊所有的
- 也可以傳遞一個負(fù)數(shù)作為參數(shù)瘤缩,負(fù)數(shù)的話將會從后邊計算
- substring() 不改變字符串
- 可以用來截取一個字符串,可以slice()類似
- 參數(shù):
- 第一個:開始截取位置的索引(包括開始位置)
- 第二個:結(jié)束位置的索引(不包括結(jié)束位置)
- 不同的是這個方法不能接受負(fù)值作為參數(shù)伦泥,如果傳遞了一個負(fù)值剥啤,則默認(rèn)使用0
- 而且他還自動調(diào)整參數(shù)的位置,如果第二個參數(shù)小于第一個不脯,則自動交換
- substr 不改變字符串
- 用來截取字符串
- 參數(shù):
1.截取開始位置的索引
2.截取的長度
- split() 不改變字符串
- 可以將一個字符串拆分為一個數(shù)組
- 參數(shù):
- 需要一個字符串作為參數(shù)府怯,將會根據(jù)該字符串去拆分?jǐn)?shù)組
- 如果傳遞一個空串作為參數(shù),則會將每個字符都拆分為數(shù)組中的一個元素
- 方法中可以傳遞一個正則表達(dá)式作為參數(shù)防楷,這樣方法將會根據(jù)正則表達(dá)式去拆分字符串
- 這個方法即使正則表達(dá)式不指定全局匹配牺丙,也會全都拆分
- toUpperCase() 不改變字符串
- 將一個字符串轉(zhuǎn)換為大寫并返回
- toLowerCase() 不改變字符串
- 將一個字符串轉(zhuǎn)換為小寫并返回
- search()
- 可以搜索字符串中是否含有指定內(nèi)容
- 如果搜索到指定內(nèi)容,則會返回第一次出現(xiàn)的索引复局,如果沒有搜索到返回-1
- 它可以接受一個正則表達(dá)式作為參數(shù)冲簿,然后會根據(jù)正則表達(dá)式去檢索字符串
- serach()只會查找第一個,即使設(shè)置全局匹配也沒用
- match()
- 可以根據(jù)正則表達(dá)式亿昏,從一個字符串中將符合條件的內(nèi)容提取出來
- 默認(rèn)情況下我們的match只會找到第一個符合要求的內(nèi)容峦剔,找到以后就停止檢索
我們可以設(shè)置正則表達(dá)式為全局匹配模式,這樣就會匹配到所有的內(nèi)容
可以為一個正則表達(dá)式設(shè)置多個匹配模式角钩,且順序無所謂 - match()會將匹配到的內(nèi)容封裝到一個數(shù)組中返回吝沫,即使只查詢到一個結(jié)果
- replace()
- 可以將字符串中指定內(nèi)容替換為新的內(nèi)容
- 參數(shù):
1.被替換的內(nèi)容呻澜,可以接受一個正則表達(dá)式作為參數(shù)
2.新的內(nèi)容 - 默認(rèn)只會替換第一個
#28. 正則表達(dá)式
- 正則表達(dá)式用于定義一些字符串的規(guī)則,計算機可以根據(jù)正則表達(dá)式惨险,
來檢查一個字符串是否符合規(guī)則易迹,獲取將字符串中符合規(guī)則的內(nèi)容提取出來 - 創(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 - 正則表達(dá)式的方法:
test()- 使用這個方法可以用來檢查一個字符串是否符合正則表達(dá)式的規(guī)則,如果符合則返回true一屋,否則返回false
- 使用字面量來創(chuàng)建正則表達(dá)式
語法:var 變量 = /正則表達(dá)式/匹配模式- 使用字面量的方式創(chuàng)建更加簡單
- 使用構(gòu)造函數(shù)創(chuàng)建更加靈活,因為可以把變量作為一個正則表達(dá)式傳進(jìn)去
- 可以為一個正則表達(dá)式設(shè)置多個匹配模式窘疮,且順序無所謂
- 正則表達(dá)式規(guī)則
- 使用 | 表示或者的意思
- []里的內(nèi)容也是或的關(guān)系
[ab] == a|b - [a-z] 任意小寫字母
- [A-Z] 任意大寫字母
- [A-z] 任意字母
- [0-9] 任意數(shù)字
- [^ ] 除了
- 量詞
- 通過量詞可以設(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é)尾
- 元字符
- .
- 表示任意字符,除了換行和行結(jié)束符
- \w
- 任意字母诽嘉、數(shù)字蔚出、_ [A-z0-9_]
- \W
- 除了字母、數(shù)字虫腋、_ [^A-z0-9_]
- \d
- 任意的數(shù)字 [0-9]
- \D
- 除了數(shù)字 [^0-9]
- \s
- 空格
- \S
- 除了空格
- \b
- 單詞邊界
- \B
- 除了單詞邊界
#29. DOM
- DOM骄酗,全稱Document Object Model文檔對象模型。
- JS中通過DOM來對HTML文檔進(jìn)行操作悦冀。只要理解了DOM就可以隨
心所欲的操作WEB頁面趋翻。 - 文檔
- 文檔表示的就是整個的HTML網(wǎng)頁文檔
- 對象
- 對象表示將網(wǎng)頁中的每一個部分都轉(zhuǎn)換為了一個對象。
- 模型
- 使用模型來表示對象之間的關(guān)系盒蟆,這樣方便我們獲取對象。
- 節(jié)點
- Node——構(gòu)成HTML文檔最基本的單元历等。
- 常用節(jié)點分為四類
- 文檔節(jié)點:整個HTML文檔
- 元素節(jié)點:HTML文檔中的HTML標(biāo)簽
- 屬性節(jié)點:元素的屬性
- 文本節(jié)點:HTML標(biāo)簽中的文本內(nèi)容

- 文檔節(jié)點
- 文檔節(jié)點document讨惩,代表的是整個HTML文檔,網(wǎng)頁中的所有節(jié)點都是它的子節(jié)點寒屯。
- document對象作為window對象的屬性存在
的荐捻,我們不用獲取可以直接使用。 - 通過該對象我們可以在整個文檔訪問內(nèi)查找節(jié)
點對象浩螺,并可以通過該對象創(chuàng)建各種節(jié)點對象靴患。 - console.log(document);
- 元素節(jié)點
- HTML中的各種標(biāo)簽都是元素節(jié)點,這也是我們最常用的一個節(jié)點要出。
- 瀏覽器會將頁面中所有的標(biāo)簽都轉(zhuǎn)換為一個元素節(jié)點鸳君,我們可以通過document的方法來獲取元素節(jié)點。
- 比如:
- document.getElementById()
- 根據(jù)id屬性值獲取一個元素節(jié)點對象
- 文本節(jié)點(Text)
- 文本節(jié)點表示的是HTML標(biāo)簽以外的文本內(nèi)容患蹂,任意非HTML的文本都是文本節(jié)點或颊。
- 它包括可以字面解釋的純文本內(nèi)容砸紊。
- 文本節(jié)點一般是作為元素節(jié)點的子節(jié)點存在的。
- 獲取文本節(jié)點時囱挑,一般先要獲取元素節(jié)點醉顽。在通過元素節(jié)點獲取文本節(jié)點。
- 例如:
- 元素節(jié)點.firstChild;
- 獲取元素節(jié)點的第一個子節(jié)點平挑,一般為文本節(jié)點
- 屬性節(jié)點(Attr)
- 屬性節(jié)點表示的是標(biāo)簽中的一個一個的屬性
這里要注意的是屬性節(jié)點并非是元素節(jié)點的子節(jié)點游添,而是元素節(jié)點的一部分。 - 可以通過元素節(jié)點來獲取指定的屬性節(jié)點通熄。
- 例如:
- 元素節(jié)點.getAttributeNode("屬性名");
- 注意:我們一般不使用屬性節(jié)點
- 獲取元素節(jié)點
- 通過document對象調(diào)用
- getElementById()
- 通過id屬性獲取一個元素節(jié)點對象
- getElementsByTagName()
- 通過標(biāo)簽名獲取一組元素節(jié)點對象
- getElementsByName()
- 通過name屬性獲取一組元素節(jié)點對象
- 獲取元素節(jié)點的子節(jié)點
- 通過具體的元素節(jié)點調(diào)用
- getElementsByTagName()
- 方法唆涝,返回當(dāng)前節(jié)點的指定標(biāo)簽名后代節(jié)點
- childNodes
- 屬性,表示當(dāng)前節(jié)點的所有子節(jié)點唇辨,文本元素都有
- children
- 屬性廊酣,表示當(dāng)前節(jié)點的所有子節(jié)點,只有元素節(jié)點赏枚,推薦使用
- firstChild
- 屬性亡驰,表示當(dāng)前節(jié)點的第一個子節(jié)點,文本元素都有
- firstElementChild
- 獲取當(dāng)前元素的第一個子元素饿幅,只有元素節(jié)點凡辱,不支持ie8
- lastChild
- 屬性,表示當(dāng)前節(jié)點的最后一個子節(jié)點
- firstElementChild
- 獲取當(dāng)前元素的最后一個子元素诫睬,只有元素節(jié)點煞茫,不支持ie8
- 獲取父節(jié)點和兄弟節(jié)點
- 通過具體的節(jié)點調(diào)用
- parentNode
- 屬性帕涌,表示當(dāng)前節(jié)點的父節(jié)點
- parentElement
- 屬性摄凡,表示當(dāng)前節(jié)點的父元素
- previousSibling
- 屬性,表示當(dāng)前節(jié)點的前一個兄弟節(jié)點
- previousElementSibling
- 屬性蚓曼,表示當(dāng)前節(jié)點的前一個兄弟元素亲澡,不支持ie8
- nextSibling
- 屬性,表示當(dāng)前節(jié)點的后一個兄弟節(jié)點
- nextElementSibling
- 屬性纫版,表示當(dāng)前節(jié)點的后一個兄弟元素床绪,不支持ie8
- 元素節(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去除
- nodeValue
- 事件
- 事件梭伐,就是用戶和瀏覽器之間的交互行為痹雅,比如:點擊按鈕,鼠標(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("點擊了按鈕");
};
- 文檔的加載
- 瀏覽器在加載一個頁面時朴沿,是按照自上向下的順序加載的猜谚,讀取到一行就運行一行,
如果將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");
};
};
- DOM查詢的其他方法
- 獲取body標(biāo)簽
var body = document.body; - 獲取html 標(biāo)簽
var html = document.documentElement; - 獲取所有標(biāo)簽
var all = document.all;
var all = document.getElementsByTagName("*"); - 根據(jù)元素的class屬性值查詢一組元素節(jié)點對象
getElementsByClassName()可以根據(jù)class屬性值獲取一組元素節(jié)點對象沦零,
但是該方法不支持IE8及以下的瀏覽器 - CSS選擇器
- var div = document.querySelector(".box1 div");
- 需要一個選擇器的字符串作為參數(shù),可以根據(jù)一個CSS選擇器來查詢一個元素節(jié)點對象
- 雖然IE8中沒有g(shù)etElementsByClassName()但是可以使用querySelector()代替
- 使用該方法總會返回唯一的一個元素货岭,如果滿足條件的元素有多個路操,那么它只會返回第一個
2. document.querySelectorAll()
- 該方法和querySelector()用法類似,不同的是它會將符合條件的元素封裝到一個數(shù)組中返回
- 即使符合條件的元素只有一個千贯,它也會返回數(shù)組
- DOM增刪改
- document.createElement()
可以用于創(chuàng)建一個元素節(jié)點對象
它需要一個標(biāo)簽名作為參數(shù)屯仗,將會根據(jù)該標(biāo)簽名創(chuàng)建元素節(jié)點對象,并將創(chuàng)建好的對象作為返回值返回 - document.createTextNode()
可以用來創(chuàng)建一個文本節(jié)點對象
需要一個文本內(nèi)容作為參數(shù)搔谴,將會根據(jù)該內(nèi)容創(chuàng)建文本節(jié)點魁袜,并將新的節(jié)點返回 - appendChild()
- 向一個父節(jié)點中添加一個新的子節(jié)點
- 語法:父節(jié)點.appendChild(子節(jié)點);
- insertBefore()
- 可以在指定的子節(jié)點前插入新的子節(jié)點
- 語法:父節(jié)點.insertBefore(新節(jié)點,指定的子節(jié)點);
- replaceChild()
- 可以使用指定的子節(jié)點替換已有的子節(jié)點
- 語法:父節(jié)點.replaceChild(新節(jié)點,舊節(jié)點);
- removeChild()
- 可以刪除一個子節(jié)點
- 語法:父節(jié)點.removeChild(子節(jié)點);
子節(jié)點.parentNode.removeChild(子節(jié)點);
- DOM操作CSS
- 通過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
- 讀取元素的內(nèi)聯(lián)樣式
- 語法:元素.style.樣式名
- 通過style屬性設(shè)置和讀取的都是內(nèi)聯(lián)樣式蚁吝,無法讀取樣式表中的樣式
- 獲取元素的當(dāng)前顯示的樣式(IE)
- 語法:元素.currentStyle.樣式名
- 它可以用來讀取當(dāng)前元素正在顯示的樣式,如果當(dāng)前元素沒有設(shè)置該樣式舀射,則獲取它的默認(rèn)值
- currentStyle只有IE瀏覽器支持窘茁,其他的瀏覽器都不支持
- 獲取元素當(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屬性
-
兼容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]; }
其他樣式屬性
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. 事件對象
- 添加事件對象的三種辦法
- 通過HTML標(biāo)簽的屬性設(shè)置
- <button onclick="alert('hello');alert('world')">按鈕</button>
- 通過DOM對象的屬性綁定 (推薦)
- var btn = document.getElementById('btn');
btn.onclick = function(){
alert("hello");
};
- 設(shè)置事件監(jiān)聽器
- btn.addEventListener('click' , function(){alert("hello");});
- 當(dāng)事件的響應(yīng)函數(shù)被觸發(fā)時次员,瀏覽器每次都會將一個事件對象作為實參傳遞進(jìn)響應(yīng)函數(shù)
在事件對象中封裝了當(dāng)前事件相關(guān)的一切信息,比如:鼠標(biāo)的坐標(biāo) 鍵盤哪個按鍵被按下 鼠標(biāo)滾輪滾動的方向王带。淑蔚。 - 在IE8中,響應(yīng)函數(shù)被觸發(fā)時愕撰,瀏覽器不會傳遞事件對象刹衫,
在IE8及以下的瀏覽器中,是將事件對象作為window對象的屬性保存的
解決方法:
var event = event || window.event; - clientX和clientY用于獲取鼠標(biāo)在當(dāng)前的可見窗口的坐標(biāo)
#30. 事件冒泡
- 事件的冒泡(Bubble)
- 所謂的冒泡指的就是事件的向上傳導(dǎo)搞挣,當(dāng)后代元素上的事件被觸發(fā)時带迟,其祖先元素的相同事件也會被觸發(fā)
- 在開發(fā)中大部分情況冒泡都是有用的,如果不希望發(fā)生事件冒泡可以通過事件對象來取消冒泡
- 取消冒泡/捕獲
- 可以將事件對象的cancelBubble設(shè)置為true,即可取消冒泡/捕獲
event.cancelBubble = true;
在高級瀏覽器中使用stopPropagation()方法柿究;在IE下必須設(shè)置cancelBubble = true
#30. 事件委派
- 指將事件統(tǒng)一綁定給元素的共同的祖先元素邮旷,這樣當(dāng)后代元素上的事件觸發(fā)時,會一直冒泡到祖先元素蝇摸,從而通過祖先元素的響應(yīng)函數(shù)來處理事件。
- 事件委派是利用了冒泡办陷,通過委派可以減少事件綁定的次數(shù)貌夕,提高程序的性能
- 我們希望,只綁定一次事件民镜,即可應(yīng)用到多個的元素上啡专,即使元素是后添加的
#31. 事件綁定
- 使用 對象.事件 = 函數(shù) 的形式綁定響應(yīng)函數(shù),
- 它只能同時為一個元素的一個事件綁定一個響應(yīng)函數(shù)制圈,
- 不能綁定多個们童,如果綁定了多個畔况,則后邊會覆蓋掉前邊的
- 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);
- attachEvent()
- 在IE8中可以使用attachEvent()來綁定事件
- 參數(shù):
1.事件的字符串,要on
2.回調(diào)函數(shù) - 這個方法也可以同時為一個事件綁定多個處理函數(shù)甘磨,不同的是它是后綁定先執(zhí)行橡羞,執(zhí)行順序和addEventListener()相反
- 綜合
定義一個函數(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ā)祖先元素上的事件
- 在捕獲階段時從最外層的祖先元素璧诵,向目標(biāo)元素進(jìn)行事件的捕獲,但是默認(rèn)此時不會觸發(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)的信息
- 代表的是整個瀏覽器的窗口,同時window也是網(wǎng)頁中的全局對象
- 這些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);
- 屬性,可以獲取到當(dāng)成訪問的鏈接數(shù)量
- back()
- 可以用來回退到上一個頁面弧呐,作用和瀏覽器的回退按鈕一樣
history.back();
- 可以用來回退到上一個頁面弧呐,作用和瀏覽器的回退按鈕一樣
- forward()
- 可以跳轉(zhuǎn)下一個頁面闸迷,作用和瀏覽器的前進(jìn)按鈕一樣
history.forward();
- 可以跳轉(zhuǎn)下一個頁面闸迷,作用和瀏覽器的前進(jìn)按鈕一樣
- 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)用功能
- 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);
- clearInterval()
- 可以用來關(guān)閉一個定時器
- 方法中需要一個定時器的標(biāo)識作為參數(shù)酌摇,這樣將關(guān)閉標(biāo)識對應(yīng)的定時器
- clearInterval(timer);
- 功能
- 通過定時器解決瀏覽器連續(xù)按鍵卡頓問題 day17-06.移動div練習(xí)
- 輪播圖 day17
- setTimeout 延時調(diào)用
- 延時調(diào)用一個函數(shù)不馬上執(zhí)行膝舅,而是隔一段時間以后在執(zhí)行,而且只會執(zhí)行一次
延時調(diào)用和定時調(diào)用的區(qū)別妙痹,定時調(diào)用會執(zhí)行多次破停,而延時調(diào)用只會執(zhí)行一次
延時調(diào)用和定時調(diào)用實際上是可以互相代替的纬纪,在開發(fā)中可以根據(jù)自己需要去選擇 - var timer = setTimeout(function(){
console.log(num++);
},3000); - 使用clearTimeout()來關(guān)閉一個延時調(diào)用
clearTimeout(timer);
#39. JSON
- JS中的對象只有JS自己認(rèn)識重窟,其他的語言都不認(rèn)識充边,JSON的出現(xiàn)是為了讓js和其他語言交流
- JSON就是一個特殊格式的字符串犯建,這個字符串可以被任意的語言所識別,
并且可以轉(zhuǎn)換為任意語言中的對象诚啃,JSON在開發(fā)中主要用來數(shù)據(jù)的交互 - JSON
- JavaScript Object Notation JS對象表示法
- JSON和JS對象的格式一樣浆竭,只不過JSON字符串中的屬性名必須加雙引號
其他的和JS語法一致 - JSON分類:
1.對象 {}
2.數(shù)組 [] - JSON中允許的值
1.字符串
2.數(shù)值
3.布爾值
4.null
5.對象
6.數(shù)組
- 將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);
- JSON這個對象在IE7及以下的瀏覽器中不支持颠毙,所以在這些瀏覽器中調(diào)用時會報錯
如果需要兼容IE7及以下的JSON操作,則可以通過引入一個外部的js文件來處理 - eval()
- 這個函數(shù)可以用來執(zhí)行一段字符串形式的JS代碼砂碉,并將執(zhí)行結(jié)果返回
- 如果使用eval()執(zhí)行的字符串中含有{},它會將{}當(dāng)成是代碼塊
如果不希望將其當(dāng)成代碼塊解析蛀蜜,則需要在字符串前后各加一個() - eval()這個函數(shù)的功能很強大,可以直接執(zhí)行一個字符串中的js代碼增蹭,
但是在開發(fā)中盡量不要使用滴某,首先它的執(zhí)行性能比較差,然后它還具有安全隱患