一悍汛、基本語法
1. 語句
- 1.1 每一行是一個語句,語句不需返回值仅父,表達(dá)式有返回值。
2. 變量
- 2.1 嚴(yán)格地說响鹃,var a = 1 與 a = 1是不完全一樣驾霜,delete命令無法刪除前者案训。不用var聲明的語句不利于表達(dá)意圖买置,且容易創(chuàng)建全局變量。
- 2.2 用var聲明同一個變量并賦值有覆蓋性强霎。
- 2.3 用var命令聲明的變量存在變量提升忿项,聲明語句都會被提升到代碼的頭部。
3. 標(biāo)識符
- 3.1 變量名首個不能是數(shù)字,不能包含 * 和運(yùn)算符轩触,不能用保留字寞酿,大小寫是不同的,中文可做變量名脱柱。
4. 注釋
- 4.1 也可用html的單行注釋(在行首伐弹,否則為運(yùn)算符)。
5榨为、區(qū)塊
- 5.1 JavaScript的區(qū)塊不構(gòu)成單獨(dú)的作用域惨好。
6、語句點(diǎn)
- 6.1 else代碼塊總是跟隨離自己最近的那個if語句随闺。
- 6.2 switch日川、case語句都可以使用表達(dá)式,在比較運(yùn)行結(jié)果時矩乐,采用的是===龄句,而不是==,比較時不會發(fā)生類型轉(zhuǎn)換散罕。
二分歇、數(shù)據(jù)類型
1. 對象
- 狹義的對象(object)
- 數(shù)組(array)
- 函數(shù)(function)
2. 類型
- number、string笨使、boolean卿樱、function、undefined硫椰、object(空數(shù)組和null也是)
3. 三種確定類型方法
- typeof運(yùn)算符
- instanceof運(yùn)算符
- Object.prototype.toString方法
4. 布爾值
- false: undefined繁调、null、false靶草、0蹄胰、NaN、 " "或' '(空字符串)
- ture :特別注意空數(shù)組([])和空對象({})
三奕翔、數(shù)值
1. 數(shù)值范圍
1.1 所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲存
1.2 JavaScript 浮點(diǎn)數(shù)的64個二進(jìn)制位裕寨,從最左邊開始:
第1位:符號位,0表示正數(shù)派继,1表示負(fù)數(shù)
第2位到第12位:指數(shù)部分
第13位到第64位:小數(shù)部分(即有效數(shù)字)
1.3 能表示的數(shù)值范圍為2^1024 到2^-1023(開區(qū)間)(否則返回Infinity)
2. 數(shù)值精度
2.1 從-(2^53-1) 到(2^53-1)宾袜,都可以精確表示
2.2 若只有整數(shù)才能完成的運(yùn)算,會自動把64位浮點(diǎn)數(shù)轉(zhuǎn)成32位整數(shù)
2.3 浮點(diǎn)數(shù)不是精確的值(小數(shù)的比較驾窟,如0.1+0.2===0.3 //false
)
2.4 小數(shù)點(diǎn)前的數(shù)字多于21位和其后的零多于5個會自動轉(zhuǎn)為科學(xué)計數(shù)法
3. 數(shù)值進(jìn)制
3.1 十進(jìn)制:沒有前導(dǎo)0的數(shù)值庆猫。
3.2 八進(jìn)制:有前綴0o或0O的數(shù)值,或者有前導(dǎo)0绅络、且只用到0-7的八個阿拉伯?dāng)?shù)字的數(shù)值月培。
3.3 十六進(jìn)制:有前綴0x或0X的數(shù)值嘁字。
3.4 二進(jìn)制:有前綴0b或0B的數(shù)值。
4.特殊數(shù)值
-
+0===-0
(1 / +0) === (1 / -0) // false +Infinity!=-Infinity
NaN === NaN // false
Infinity > (<) NaN // false
- isNaN為true的值杉畜,有可能不是NaN纪蜒,而是一個字符串、對象和數(shù)組此叠。
5. 全局方法
5.1 parselnt
- parseInt:將字符串轉(zhuǎn)為整數(shù)纯续,只返回字符串頭部可以轉(zhuǎn)為數(shù)字,第一個字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負(fù)號除外)灭袁,返回NaN杆烁。
parseInt('+') // NaN
parseInt('+1') // 1
- parseInt會將科學(xué)計數(shù)法的表示方法視為字符串
- 進(jìn)制轉(zhuǎn)換(2到36之間)
parseInt('1000', 2) // 2進(jìn)制-8
parseInt('1000', 8) // 8進(jìn)制512
parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10
5.2 parseFloat:將一個字符串轉(zhuǎn)為浮點(diǎn)數(shù)(會將空字符串轉(zhuǎn)為NaN)
(用法與parseInt類似)
四、字符串
1. 轉(zhuǎn)義符
轉(zhuǎn)義符 | 表達(dá) | 碼值 |
---|---|---|
\0 | null | (\u0000) |
\b | 后退鍵 | (\u0008) |
\f | 換頁符 | (\u000C) |
\n | 換行符 | (\u000A) |
\r | 回車鍵 | (\u000D) |
\t | 制表符 | (\u0009) |
\v | 垂直制表符 | (\u000B) |
' | 單引號 | (\u0027) |
" | 雙引號 | (\u0022) |
\ | 反斜杠 | (\u005C) |
- 在非特殊字符前面使用反斜杠简卧,則反斜杠會被省略
- charCodeAt:返回每個字節(jié)對應(yīng)的十進(jìn)制值
- 在JavaScript引擎內(nèi)部兔魂,所有字符都用Unicode表示
五、對象
1. 新建對象
var o1 = {};
var o2 = new Object();
var o3 = Object.create(Object.prototype); //用在需要對象繼承的場合
2. 注意事項
2.1 如果鍵名不符合標(biāo)識名的條件(比如第一個字符為數(shù)字举娩,或者含有空格或運(yùn)算符)析校,也不是數(shù)字,則必須加上引號铜涉,保留字可以不加引號當(dāng)作鍵名
2.2 行首是大括號為語句(即代碼塊)智玻。在大括號前加上圓括號為表達(dá)式(即對象)。
3. 屬性
- 3.1 讀取對象的屬性:點(diǎn)運(yùn)算符(數(shù)值鍵名不能使用(被當(dāng)成小數(shù)點(diǎn))
方括號運(yùn)算符(鍵名必須放在引號里面芙代,否則會被當(dāng)作變量處理吊奢。但數(shù)字鍵不加引號,因為會被當(dāng)作字符串處理)
o.p // "Hello World"
o['p'] // "Hello World"
- 3.2 用Object.keys方法查看一個對象本身的所有屬性纹烹。
- 3.3 delete命令用于刪除對象的屬性页滚,刪除成功后返回true,屬性就會返回undefined铺呵。
- 刪除一個不存在的屬性裹驰,delete不報錯,而且返回true片挂。
- 屬性存在幻林,且不得刪除,delete命令會返回false音念。
- delete命令不能刪除var命令聲明的變量沪饺,只能用來刪除屬性。
4. in
- 用于檢查對象是否包含某個屬性(檢查的是鍵名闷愤,不是鍵值)整葡,包含(true),否則(false)肝谭。(但不能識別對象繼承的屬性)
5.for...in循環(huán)
- 5.1 用來遍歷一個對象的全部屬性掘宪。
- 5.2 遍歷的是對象所有可遍歷的屬性,跳過不可遍歷的屬性攘烛,遍歷繼承的屬性魏滚。
- 5.3 用hasOwnProperty只遍歷對象本身的屬性
6. with
- 6.1 操作同一個對象的多個屬性時,提供一些書寫的方便
with (o) {
p1 = 1;
p2 = 2;
}
// 等同于
o.p1 = 1;
o.p2 = 2;
- 6.2 with區(qū)塊內(nèi)部的變量坟漱,必須是當(dāng)前對象已經(jīng)存在的屬性鼠次,否則會創(chuàng)造一個當(dāng)前作用域的全局變量,因為with區(qū)塊沒有改變作用域芋齿,它的內(nèi)部依然是當(dāng)前作用域腥寇。
六、數(shù)組
1.本質(zhì)
數(shù)組屬于一種特殊的對象觅捆。typeof運(yùn)算符會返回數(shù)組的類型是object赦役。
2. 類似數(shù)組的對象
- 2.1 類似數(shù)組的對象是函數(shù)的arguments對象,以及大多數(shù)DOM元素集栅炒,還有字符串掂摔。
- 2.2 數(shù)組的slice方法將類似數(shù)組的對象,變成真正的數(shù)組赢赊。
var arr = Array.prototype.slice.call(arrayLike);
- 2.3 length屬性不過濾空位空位乙漓,空位與某個位置是undefined,是不一樣的释移。使用數(shù)組的forEach方法叭披、for...in結(jié)構(gòu)、以及Object.keys方法進(jìn)行遍歷玩讳,空位都會被跳過涩蜘。
- 2.4 遍歷類似數(shù)組的對象,可以采用for循環(huán)熏纯,也可以采用數(shù)組的forEach方法皱坛。
七、函數(shù)
1. 函數(shù)聲明
- 1.1 function命令聲明的代碼區(qū)塊豆巨,就是一個函數(shù)
-用function命令聲明函數(shù)
function print(s) {
console.log(s);
}
- 1.2 采用變量賦值的寫法
var print = function(s) {
console.log(s);
};
- 1.3 Function構(gòu)造函數(shù)
var foo = new Function(
'return "hello world"'
);
// 等同于
function foo() {
return 'hello world';
}
- Function構(gòu)造函數(shù)可以不使用new命令剩辟,返回結(jié)果完全一樣,但不直觀往扔,一般不用這種方法贩猎。
2. 函數(shù)重復(fù)聲明
- 后面的聲明就會覆蓋前面的聲明
3.不能在條件語句中聲明函數(shù)
- 函數(shù)的toString方法返回函數(shù)的源碼,內(nèi)部的注釋也可以返回
- 變量在函數(shù)內(nèi)部定義萍膛,是一個局部變量吭服,函數(shù)之外無法讀取。
- 函數(shù)內(nèi)部定義的變量蝗罗,會在該作用域內(nèi)覆蓋同名全局變量艇棕。
4.arguments 對象
- arguments對象包含了函數(shù)運(yùn)行時的所有參數(shù)蝌戒,arguments[0]就是第一個參數(shù),arguments[1]就是第二個參數(shù)沼琉。這個對象只有在函數(shù)體內(nèi)部北苟,才可以使用。
- 還可以為參數(shù)賦值(嚴(yán)格模式不允許這種用法)
- 判斷函數(shù)調(diào)用時到底帶幾個參數(shù)
function f() {
return arguments.length;
}
5. 閉包(定義在一個函數(shù)內(nèi)部的函數(shù))
- 5.1 JavaScript有兩種作用域:全局作用域和函數(shù)作用域打瘪。函數(shù)內(nèi)部可以直接讀取全局變量友鼻。
- 在函數(shù)外部無法讀取函數(shù)內(nèi)部聲明的變量,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁闺骚。
- 可以看作是函數(shù)內(nèi)部作用域的一個接口彩扔。
- 是封裝對象的私有屬性和私有方法。
- 鏈?zhǔn)阶饔糜颉苯Y(jié)構(gòu)(chain scope)僻爽,子對象會一級一級地向上尋找所有父對象的變量虫碉。所以,父對象的所有變量胸梆,對子對象都是可見的蔗衡,反之則不成立。
- 在函數(shù)的內(nèi)部乳绕,再定義一個函數(shù)得到函數(shù)內(nèi)的局部變量
function f1() {
var n = 999;
function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result(); // 999
//函數(shù)f1的返回值就是函數(shù)f2绞惦,由于f2可以讀取f1的內(nèi)部變量,所以就可以在外部獲得f1的內(nèi)部變量了洋措。
- 上述代碼閉包就是函數(shù)f2济蝉,即能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
- 注意:外層函數(shù)每次運(yùn)行菠发,都會生成一個新的閉包王滤,而這個閉包又會保留外層函數(shù)的內(nèi)部變量,所以內(nèi)存消耗很大滓鸠。因此不能濫用閉包雁乡,否則會造成網(wǎng)頁的性能問題。
6. 調(diào)用
// 語句
function f() {}
// 表達(dá)式
var f = function f() {}
- 行首是function關(guān)鍵字之后糜俗,認(rèn)為這一段都是函數(shù)的定義踱稍,不應(yīng)該以圓括號結(jié)尾,所以就報錯了悠抹。
- 不要讓function出現(xiàn)在行首珠月,讓引擎將其理解成一個表達(dá)式。最簡單的處理楔敌,就是將其放在一個圓括號里面啤挎。
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
//最后的分號都是必須的
7. eval
- 將有獨(dú)自存在的意義字符串當(dāng)作語句執(zhí)行
- 沒有自己的作用域,都在當(dāng)前作用域內(nèi)執(zhí)行卵凑,因此可能會修改當(dāng)前作用域的變量的值庆聘,造成安全問題胜臊。
- eval有安全風(fēng)險。為了防止這種風(fēng)險規(guī)定伙判,如果使用嚴(yán)格模式象对,eval內(nèi)部聲明的變量,不會影響到外部作用域澳腹。
八、運(yùn)算符
1. 加法運(yùn)算符
// 加法
1 + 1 // 2
1 + true // 2
// 字符串連接
'1.1' + '1.1' // "1.11.1"
'1' + 1 // "11"
'1' + true // "1true"
//只要有一個運(yùn)算子是字符串杨何,則兩個運(yùn)算子都轉(zhuǎn)為字符串酱塔,執(zhí)行字符串連接運(yùn)算。
- 運(yùn)算子為對象危虱,先自動轉(zhuǎn)成原始類型的值(即先執(zhí)行該對象的valueOf方法羊娃,如果結(jié)果還不是原始類型的值,再執(zhí)行toString方法埃跷;如果對象是Date實例蕊玷,則先執(zhí)行toString方法)
2. 其他算術(shù)運(yùn)算符(比如減法、除法和乘法)
- 都不會發(fā)生重載弥雹。它們的規(guī)則是:所有運(yùn)算子一律轉(zhuǎn)為數(shù)值垃帅,再進(jìn)行相應(yīng)的數(shù)學(xué)運(yùn)算。
1 - '2' // -1
1 * '2' // 2
1 / '2' // 0.5
3. 余數(shù)運(yùn)算符(%)
- 需要注意的是剪勿,運(yùn)算結(jié)果的正負(fù)號由第一個運(yùn)算子的正負(fù)號決定贸诚。
- 為了得到正確的負(fù)數(shù)的余數(shù)值,需要先使用絕對值函數(shù).
4.對象間的比較
[2] > [11] // true
// 等同于 [2].valueOf().toString() > [11].valueOf().toString()
// 即 '2' > '11'
5. 嚴(yán)格相等運(yùn)算符
- 5.1 如果兩個值的類型不同厕吉,直接返回false酱固。
-5.2 類型的原始類型的值(數(shù)值、字符串头朱、布爾值)比較時运悲,值相同就返回true,值不同就返回false项钮。 - 5.3 同一類的復(fù)合類型值
- 兩個復(fù)合類型(對象班眯、數(shù)組、函數(shù))的數(shù)據(jù)比較時烁巫,不是比較它們的值是否相等鳖敷,而是比較它們是否指向同一個對象。
- 對于兩個對象的比較程拭,嚴(yán)格相等運(yùn)算符比較的是地址定踱,而大于或小于運(yùn)算符比較的是值。
- 5.4 undefined和null與自身嚴(yán)格相等恃鞋。
6.相等運(yùn)算符
- 6.1 原始類型的值
- 原始類型的數(shù)據(jù)會轉(zhuǎn)換成數(shù)值類型再進(jìn)行比較崖媚。
- 6.2 對象與原始類型值比較
- 對象(這里指廣義的對象亦歉,包括數(shù)組和函數(shù))與原始類型的值比較時,對象轉(zhuǎn)化成原始類型的值畅哑,再進(jìn)行比較肴楷。
7. 取反運(yùn)算符
- 形式上是一個感嘆號,用于將布爾值變?yōu)橄喾粗祵τ诜遣紶栔档臄?shù)據(jù)荠呐,取反運(yùn)算符會自動將其轉(zhuǎn)為布爾值赛蔫。
!!x
// 等同于
Boolean(x)
//兩次取反就是將一個值轉(zhuǎn)為布爾值的簡便寫法。
8. 位運(yùn)算符
- 8.1 位運(yùn)算符只對整數(shù)起作用泥张,如果一個運(yùn)算子不是整數(shù)呵恢,會自動轉(zhuǎn)為整數(shù)后再執(zhí)行。雖然在JavaScript內(nèi)部媚创,數(shù)值都是以64位浮點(diǎn)數(shù)的形式儲存渗钉,但是做位運(yùn)算的時候,是以32位帶符號的整數(shù)進(jìn)行運(yùn)算的钞钙,并且返回值也是一個32位帶符號的整數(shù)鳄橘。
i = i | 0;
//將i(不管是整數(shù)或小數(shù))轉(zhuǎn)為32位整數(shù)。
//利用這個特性芒炼,可以寫出一個函數(shù)瘫怜,將任意數(shù)值轉(zhuǎn)為32位整數(shù)。
- 8.2 否運(yùn)算
~ 3 // -4
- 一個數(shù)與自身的取反值相加本刽,等于-1宝磨。
- 對一個整數(shù)連續(xù)兩次“否運(yùn)算”,得到它自身盅安。
~~2.9 // 2
~~47.11 // 47
~~1.9999 // 1
//使用否運(yùn)算取整唤锉,是所有取整方法中最快的一種。
- 8.3 異或
- “異或運(yùn)算”有一個特殊運(yùn)用别瞭,連續(xù)對兩個數(shù)a和b進(jìn)行三次異或運(yùn)算窿祥,可以互換它們的值(詳見維基百科)。這意味著蝙寨,使用“異或運(yùn)算”可以在不引入臨時變量的前提下晒衩,互換兩個變量的值。
var a = 10;
var b = 99;
a ^= b, b ^= a, a ^= b;
a // 99
b // 10
- 異或運(yùn)算也可以用來取整墙歪。
12.9 ^ 0 // 12
- 8.4 左移運(yùn)算
- 如果左移0位听系,就相當(dāng)于將該數(shù)值轉(zhuǎn)為32位整數(shù),等同于取整虹菲,對于正數(shù)和負(fù)數(shù)都有效靠胜。
13.5 << 0
// 13
- 8.5 開關(guān)作用
var mask = FLAG_A | FLAG_B | FLAG_D;
// 0001 | 0010 | 1000 => 1011
//對ABD三個變量進(jìn)行“或運(yùn)算”,得到掩碼值為二進(jìn)制的1011。
flags = flags | mask;
//有了掩碼浪漠,“或運(yùn)算”可以確保打開指定的開關(guān)陕习。
flags = flags & mask;
//“與運(yùn)算”可以將當(dāng)前設(shè)置中凡是與開關(guān)設(shè)置不一樣的項,全部關(guān)閉址愿。
flags = flags ^ mask;
//“異或運(yùn)算”可以切換(toggle)當(dāng)前設(shè)置
//即第一次執(zhí)行可以得到當(dāng)前設(shè)置的相反值该镣,再執(zhí)行一次又得到原來的值。
flags = ~flags;
//“否運(yùn)算”可以翻轉(zhuǎn)當(dāng)前設(shè)置响谓,即原設(shè)置為0损合,運(yùn)算后變?yōu)?;原設(shè)置為1娘纷,運(yùn)算后變?yōu)?嫁审。
9. 逗號運(yùn)算符
'a', 'b' // "b"
//返回后一個表達(dá)式的值。
10.優(yōu)先級
- 從高到低依次為:小于等于(<=)失驶、嚴(yán)格相等(===)土居、或(||)枣购、三元(?:)嬉探、等號(=)。
- 圓括號(())可以用來提高運(yùn)算的優(yōu)先級棉圈,優(yōu)先級是最高的(圓括號不是運(yùn)算符涩堤,而是一種語法結(jié)構(gòu)。兩種用法:一是把表達(dá)式放在圓括號之中分瘾,提升運(yùn)算的優(yōu)先級胎围;二是跟在函數(shù)的后面,作用是調(diào)用函數(shù)德召。)
九白魂、數(shù)據(jù)類型轉(zhuǎn)換
1.強(qiáng)制轉(zhuǎn)換
- 1.1 Number()
- 比parseInt函數(shù)嚴(yán)格很多∩细冢基本上福荸,只要有一個字符無法轉(zhuǎn)成數(shù)值,整個字符串就會被轉(zhuǎn)為NaN肴掷。
valueOf->若原始類型的值->Number
valueOf->若對象->toString->若原始類型的值->Number
valueOf->若對象->toString->若對象->錯誤
- 比parseInt函數(shù)嚴(yán)格很多∩细冢基本上福荸,只要有一個字符無法轉(zhuǎn)成數(shù)值,整個字符串就會被轉(zhuǎn)為NaN肴掷。
- Number方法的參數(shù)是對象時敬锐,將返回NaN,除非是包含單個數(shù)值的數(shù)組
- 1.2 String()
- 數(shù)值:轉(zhuǎn)為相應(yīng)的字符串呆瞻。
- 字符串:轉(zhuǎn)換后還是原來的值台夺。
- 布爾值:true轉(zhuǎn)為"true",false轉(zhuǎn)為"false"痴脾。
- undefined:轉(zhuǎn)為"undefined"颤介。
- null:轉(zhuǎn)為"null"
- 對象
toString->若原始類型的值->String
toString->若對象->valueOf->若原始類型的值->String
toString->若對象->valueOf->若對象->報錯
- 1.3 Boolean()
- undefined、null、-0买窟、 0或+0丰泊、 NaN、' '(空字符串)
轉(zhuǎn)換結(jié)果為false始绍,其他的值全部為true瞳购。 - 注意,所有對象(包括空對象)的轉(zhuǎn)換結(jié)果都是true亏推,甚至連false對應(yīng)的布爾對象new Boolean(false)也是true学赛。
- undefined、null、-0买窟、 0或+0丰泊、 NaN、' '(空字符串)
2. 自動轉(zhuǎn)換
- 預(yù)期什么類型的值,就調(diào)用該類型的轉(zhuǎn)換函數(shù)吞杭。比如盏浇,某個位置預(yù)期為字符串,就調(diào)用String函數(shù)進(jìn)行轉(zhuǎn)換芽狗。如果該位置即可以是字符串绢掰,也可能是數(shù)值,那么默認(rèn)轉(zhuǎn)為數(shù)值童擎。
- 由于自動轉(zhuǎn)換具有不確定性滴劲,而且不易除錯,建議在預(yù)期為布爾值顾复、數(shù)值班挖、字符串的地方,全部使用Boolean芯砸、Number和String函數(shù)進(jìn)行顯式轉(zhuǎn)換萧芙。
// 寫法一
expression ? true : false
// 寫法二
!! expression
有時也用于將一個表達(dá)式轉(zhuǎn)為布爾值。它們內(nèi)部調(diào)用的也是Boolean函數(shù)假丧。
- 字符串的自動轉(zhuǎn)換双揪,主要發(fā)生在加法運(yùn)算時。當(dāng)一個值為字符串包帚,另一個值為非字符串渔期,則后者轉(zhuǎn)為字符串。
十婴噩、錯誤處理機(jī)制
1. Error對象
- 代碼解析或運(yùn)行時發(fā)生錯誤擎场,JavaScript引擎就會自動產(chǎn)生、并拋出一個Error對象的實例几莽,然后整個程序就中斷在發(fā)生錯誤的地方迅办,不再往下執(zhí)行。
- message:錯誤提示信息
- name:錯誤名稱(非標(biāo)準(zhǔn)屬性)
- stack:錯誤的堆棧(非標(biāo)準(zhǔn)屬性)
if (error.name){
console.log(error.name + ": " + error.message);
}
2. JavaScript的原生錯誤類型
- 2.1 SyntaxError:是解析代碼時發(fā)生的語法錯誤章蚣。
- 2.2ReferenceError:是引用一個不存在的變量時發(fā)生的錯誤站欺。
另一種是姨夹,將一個值分配給無法分配的對象,比如對函數(shù)的運(yùn)行結(jié)果或者this賦值矾策。
console.log() = 1
// ReferenceError: Invalid left-hand side in assignment
this = 1
// ReferenceError: Invalid left-hand side in assignment
- 2.3 RangeError是當(dāng)一個值超出有效范圍時發(fā)生的錯誤磷账。
- 數(shù)組長度為負(fù)數(shù)
- Number對象的方法參數(shù)超出范圍,以及函數(shù)堆棧超過最大值贾虽。
- 2.4 TypeError是變量或參數(shù)不是預(yù)期類型時發(fā)生的錯誤逃糟。如對字符串、布爾值蓬豁、數(shù)值等原始類型的值使用new命令绰咽,就會拋出這種錯誤,因為new命令的參數(shù)應(yīng)該是一個構(gòu)造函數(shù)地粪。
- 2.5 URIError是URI相關(guān)函數(shù)的參數(shù)不正確時拋出的錯誤取募,主要涉及
- encodeURI()
- decodeURI()
- encodeURIComponent()
- decodeURIComponent()
- escape()
- unescape()
- 2.6 eval函數(shù)沒有被正確執(zhí)行時,會拋出EvalError錯誤蟆技。該錯誤類型已經(jīng)不再在ES5中出現(xiàn)了玩敏,只是為了保證與以前代碼兼容,才繼續(xù)保留质礼。
3. 自定義錯誤
4. throw語句
- throw語句的作用是中斷程序執(zhí)行旺聚,拋出一個意外或錯誤。它接受一個表達(dá)式作為參數(shù)几苍,可以拋出各種值翻屈。
- throw可以接受各種值作為參數(shù)陈哑。JavaScript引擎一旦遇到throw語句妻坝,就會停止執(zhí)行后面的語句,并將throw語句的參數(shù)值惊窖,返回給用戶刽宪。
5. try…catch結(jié)構(gòu)
- 為了對錯誤進(jìn)行處理,需要使用try...catch結(jié)構(gòu)界酒。
- catch代碼塊捕獲錯誤之后圣拄,程序不會中斷,會按照正常流程繼續(xù)執(zhí)行下去毁欣。還可以再拋出錯誤庇谆,甚至使用嵌套的try...catch結(jié)構(gòu)
- catch捕獲錯誤之后,會判斷錯誤類型(EvalError還是RangeError)凭疮,進(jìn)行不同的處理饭耳。
- try...catch結(jié)構(gòu)允許在最后添加一個finally代碼塊,表示不管是否出現(xiàn)錯誤执解,都必需在最后運(yùn)行的語句寞肖。
6. finally
- 執(zhí)行finally代碼塊以后,程序就中斷在錯誤拋出的地方。
- 即使有return語句在前新蟆,finally代碼塊依然會得到執(zhí)行觅赊,且在其執(zhí)行完畢后千扔,才會顯示return語句的值植榕。return語句的執(zhí)行是排在finally代碼之前,只是等finally代碼執(zhí)行完畢后才返回伏伐。