程式報錯的型別
一般我們執行程式碼的時候,在控制檯報錯會相應的顯示你錯誤的行數,找到那一行,查詢你相應的錯誤
1、xxx is not defined
xxx 沒有定義
2、xxx is not a function
xxx 不是一個函式
xxx此時是undefined
3、Cannot read property 'xxx' of undefined
不能讀取undefined的xxx屬性
xxx前面的變數是undefined
4、Cannot set property 'xxx' of null
不能給null設定xxx屬性
xxx前面的變數是null
5、Invalid or unexpected token
標點符號可能是中文
6、Unexpected token a in JSON at position 0
使用JSON.parse進行解析json字串時,解析的內容不合法
7、XMLHttpRequest cannot load http://XXXXXX. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://XXXXXX' is therefore not allowed access.
使用ajax請求資料時,產生跨域了
8、Illegal break statement
出現了非法語句
9、SyntaxError(語法錯誤)
SyntaxError是解析程式碼時發生的語法錯誤
// 變數名錯誤
var 1a;
// 缺少括號
console.log ('hello';
10、ReferenceErro(引用錯誤)
ReferenceError是引用一個不存在的變數時發生的錯誤。
unknownVariable
// ReferenceError: unknownVariable is not defined
另一種觸發場景是,將一個值分配給無法分配的物件,比如對函式的執行結果或者this賦值。
console.log() = 1
// ReferenceError: Invalid left-hand side in assignment this = 1
// ReferenceError: Invalid left-hand side in assignment
上面程式碼對函式console.log的執行結果和this賦值,結果都引發了ReferenceError錯誤
11、RangeError(範圍錯誤)
RangeError是當一個值超出有效範圍時發生的錯誤。主要有幾種情況,一是陣列長度為負數,二是Number物件的方法引數超出範圍,以及函式堆疊超過最大值。
new Array(-1)
// RangeError: Invalid array length
(1234).toExponential(21)
// RangeError: toExponential() argument must be between 0 and 20
12、TypeError(型別錯誤)
TypeError是變數或引數不是預期型別時發生的錯誤。比如,對字串、布林值、數值等原始型別的值使用new命令,就會丟擲這種錯誤,因為new命令的引數應該是一個建構函式。
new 123
//TypeError: number is not a func var obj = {}; obj.unknownMethod()
// TypeError: undefined is not a function
上面程式碼的第二種情況,呼叫物件不存在的方法,會丟擲TypeError錯誤。
13、URIError(URI錯誤)
URIError是URI相關函式的引數不正確時丟擲的錯誤,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()這六個函式。
decodeURI('%2')
// URIError: URI malformed
14、EvalError(eval錯誤)
eval函式沒有被正確執行時,會丟擲EvalError錯誤。該錯誤型別已經不再在ES5中出現了,只是為了保證與以前程式碼相容,才繼續保留。
以上這6種派生錯誤,連同原始的Error物件,都是建構函式。開發者可以使用它們,人為生成錯誤物件的例項。
new Error("出錯了!");
new RangeError("出錯了,變數超出有效範圍!");
new TypeError("出錯了,變數型別無效!");
上面程式碼表示新建錯誤物件的例項,實質就是手動丟擲錯誤。可以看到,錯誤物件的建構函式接受一個引數,代表錯誤提示資訊(message)。
15、錯誤舉例
-
找不到引入的.js檔案
引用的.js檔案找不到,chrome報錯資訊如下:
GET file:///D:/JavaBooks/js/jquery%20validation/src-gzh/jquery.validate-1.7.src net::ERR_FILE_NOT_FOUND
可能原因:.js檔名字拼寫錯誤(比如,少了檔案字尾.js)
-
js函式缺少括號),函式體缺少大括號}
如果函式缺少括號或者函式體缺少括號,瀏覽器debug時都會提示報錯資訊。這裡分2種情況:
1、一般報錯資訊都在報在錯誤的地方,這種情況比較好說。
2、但是有的時候會報在其他的地方,這個時候要明白的是,報錯資訊缺少括號這一點是確定無疑的,現在就是要定位到具體是哪一行報錯。
例如
報錯函式/函式體缺少括號,報錯的地方不是函式/函式體的末尾,而是報在呼叫該函式的地方。
-
css程式碼使用了//註釋,導致有的div內容出不來,然後也不報錯
css註釋,只能使用/* 註釋內容 */,而不能使用雙斜槓//。
-
定義了多個同名的變數
瀏覽器會報錯。
-
文件未載入完畢,就開始執行js程式碼導致的錯誤
文件/DOM未載入完畢,就開始執行js程式碼。
比如,js程式碼寫在html程式碼的前面,而且document.getElementById('traffic')這樣來訪問DOM(即文件的元素),那麼這個時候就會報TypeError: a is null(火狐瀏覽器,注:a變數沒用,只會起誤導作用)或者Uncaught TypeError: Cannot read property 'click2' of null(谷歌瀏覽器)。
-
js 物件的函式未定義
瀏覽器報錯,說物件的函式未定義,這個時候可以肯定的一點是,當前這個物件是沒有這個函式的。
比如,高德地圖物件函式未定義,是因為地圖物件被2.5維地圖物件覆蓋了。
出現這種bug時,問題在函式,往往是因為物件被重複定義,或者被重新賦值了。