JavaScript語法

一悍汛、基本語法

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->若對象->錯誤
  • 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学赛。

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í)行完畢后才返回伏伐。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帕翻,一起剝皮案震驚了整個濱河市规脸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熊咽,老刑警劉巖莫鸭,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異横殴,居然都是意外死亡被因,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門衫仑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梨与,“玉大人,你說我怎么就攤上這事文狱≈嘈” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵瞄崇,是天一觀的道長呻粹。 經(jīng)常有香客問我,道長苏研,這世上最難降的妖魔是什么等浊? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮摹蘑,結(jié)果婚禮上筹燕,老公的妹妹穿的比我還像新娘。我一直安慰自己衅鹿,他們只是感情好撒踪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著大渤,像睡著了一般制妄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兼犯,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天忍捡,我揣著相機(jī)與錄音集漾,去河邊找鬼。 笑死砸脊,一個胖子當(dāng)著我的面吹牛具篇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凌埂,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驱显,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞳抓?” 一聲冷哼從身側(cè)響起埃疫,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孩哑,沒想到半個月后栓霜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡横蜒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年胳蛮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丛晌。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡仅炊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澎蛛,到底是詐尸還是另有隱情抚垄,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布谋逻,位于F島的核電站呆馁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斤贰。R本人自食惡果不足惜智哀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一次询、第九天 我趴在偏房一處隱蔽的房頂上張望荧恍。 院中可真熱鬧,春花似錦屯吊、人聲如沸送巡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骗爆。三九已至,卻和暖如春蔽介,著一層夾襖步出監(jiān)牢的瞬間摘投,已是汗流浹背煮寡。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犀呼,地道東北人幸撕。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像外臂,于是被迫代替她去往敵國和親坐儿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

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