Error對(duì)象
JavaScript解析或執(zhí)行時(shí)飞崖,一旦發(fā)生錯(cuò)誤,引擎就會(huì)拋出一個(gè)錯(cuò)誤對(duì)象谨胞。JavaScript原生提供一個(gè)Error構(gòu)造函數(shù)固歪,所有拋出的錯(cuò)誤都是這個(gè)構(gòu)造函數(shù)的實(shí)例。
根據(jù)語言標(biāo)準(zhǔn)胯努,Error對(duì)象的實(shí)例必須有message屬性牢裳,表示出錯(cuò)時(shí)的提示信息,其他屬性則沒有提及叶沛。大多數(shù)JavaScript引擎蒲讯,對(duì)Error實(shí)例還提供name和stack屬性,分別表示錯(cuò)誤的名稱和錯(cuò)誤的堆棧灰署,但它們是非標(biāo)準(zhǔn)的判帮,不是每種實(shí)現(xiàn)都有。
message:錯(cuò)誤提示信息
name:錯(cuò)誤名稱(非標(biāo)準(zhǔn)屬性)
stack:錯(cuò)誤的堆棧(非標(biāo)準(zhǔn)屬性)
JavaScript 原生錯(cuò)誤類型
Error對(duì)象是最一般的錯(cuò)誤類型溉箕,在它的基礎(chǔ)上晦墙,JavaScript還定義了其他6種錯(cuò)誤,也就是說约巷,存在Error的6個(gè)派生對(duì)象偎痛。
SyntaxError
SyntaxError是解析代碼時(shí)發(fā)生的語法錯(cuò)誤。
// 變量名錯(cuò)誤
var 1a;
// SyntaxError: Invalid or unexpected token
// 缺少括號(hào)
console.log 'hello');
// SyntaxError: Unexpected string
ReferenceError
ReferenceError是引用一個(gè)不存在的變量時(shí)發(fā)生的錯(cuò)誤独郎。
a
// ReferenceError: a is not defined
另一種觸發(fā)場景是踩麦,將一個(gè)值分配給無法分配的對(duì)象,比如對(duì)函數(shù)的運(yùn)行結(jié)果或者this賦值氓癌。
console.log() = 1
// ReferenceError: Invalid left-hand side in assignment
this = 1
// ReferenceError: Invalid left-hand side in assignment
RangeError
RangeError是當(dāng)一個(gè)值超出有效范圍時(shí)發(fā)生的錯(cuò)誤谓谦。主要有幾種情況,一是數(shù)組長度為負(fù)數(shù)贪婉,二是Number對(duì)象的方法參數(shù)超出范圍反粥,以及函數(shù)堆棧超過最大值。
new Array(-1)
// RangeError: Invalid array length
(1234).toExponential(21)
// RangeError: toExponential() argument must be between 0 and 20
TypeError
TypeError是變量或參數(shù)不是預(yù)期類型時(shí)發(fā)生的錯(cuò)誤疲迂。比如才顿,對(duì)字符串、布爾值尤蒿、數(shù)值等原始類型的值使用new命令郑气,就會(huì)拋出這種錯(cuò)誤,因?yàn)閚ew命令的參數(shù)應(yīng)該是一個(gè)構(gòu)造函數(shù)腰池。
new 123
// TypeError: 123 is not a constructor
var obj = {};
obj.unknownMethod()
// TypeError: obj.unknownMethod is not a function
URIError
URIError是URI相關(guān)函數(shù)的參數(shù)不正確時(shí)拋出的錯(cuò)誤尾组,主要涉及encodeURI()碉纺、decodeURI()强衡、encodeURIComponent()、decodeURIComponent()、escape()和unescape()這六個(gè)函數(shù)箱吕。
decodeURI('%2')
// URIError: URI malformed
EvalError
eval函數(shù)沒有被正確執(zhí)行時(shí)创千,會(huì)拋出EvalError錯(cuò)誤掏秩。該錯(cuò)誤類型已經(jīng)不再在ES5中出現(xiàn)了疯特,只是為了保證與以前代碼兼容,才繼續(xù)保留歹叮。
(摘自 JavaScript 標(biāo)準(zhǔn)參考教程)