JavaScript錯誤處理機制
- javaScript 解析或運行時,一旦發生錯誤,引擎就會拋出一個錯誤對象。JavaScript 原生提供Error構造函數,全部拋出的錯誤都是這個構造函數的實例
- Error是最普通的錯誤對象,JavaScript在它的基礎上還設置了6種錯誤對象,也就是說存在Error的6個派生對象
- SyntaxError對象是解析代碼時發生的語法錯誤
- ReferenceError(引用錯誤)對象是引用一個不存在的變量時發生的錯誤,另外一種觸發場景是,將一個值分配給沒法分配的對象,好比對函數的運行結果或者this賦值
- RangeError對象是一個值超出有效範圍時發生的錯誤。主要有幾種狀況,一是數組長度爲負數,二是Number對象的方法參數超出範圍,以及函數堆棧超過最大值
- TypeError對象是變量或參數不是預期類型時發生的錯誤。好比,對字符串、布爾值、數值等原始類型的值使用new命令,就會拋出這種錯誤,由於new命令的參數應該是一個構造函數
object對象
- JavaScript的全部對象都是繼承之object,即那些對象都是object的實例
- Object對象的原生方法分爲兩種:Object自身的方法和Object實例方法
- Object自身的方法:就只直接定義在object上面的方法
- Object實例方法:所謂實例方法就是定義在object.prototype上面的方法,他能夠被object實例直接使用
數組
- 數組的靜態方法: Array.isArray(arr);判斷參數是否爲數組,返回值爲布爾值
- 數組的實例方法:
- push():表示在數組的末尾添加一個數
- pop():表示在數組的末尾刪除一個數
- unshift():表示在數組的開頭添加一個元素
- shift():表示在數組的開頭位置刪除一個元素
- join():將指定參數做爲分隔符,將全部數組成員鏈接成一個字符串方法,經過call給方法也能夠用於字符串和相似數組的對象:Array.prototype.join.call('hello','-');
- concat():用於多個數組的合併,將新數組添加在舊數組的後面
- reverse():用於顛倒數組元素的排列
- slice(start,end):用於提取目標數組的一部分,他有一個重要的做用就是將相似數組的對象轉化爲真正的對象,Array.prototype.slice.call(obj);
- splice(start,count,newEle1,newEle2):用於刪除原數組的一部分,並在刪除元素的位置添加新的元素
- sort():對數組成員進行排序,注意點:默認是按照字典順序排序的
- map():將數組成員依次傳入參數函數,而後把每一次的執行結果組成一個新數組方法,也就是說它是有return語句的
- forEach():將數組的全部成員依次傳入參數函數,作相應的處理,它跟map最大的區別就是map是有返回值的,forEach只是對數據的處理,是沒有返回值的
- filter():用於過濾數組成員,知足條件的數組成員組成一個新數組方法
- some():斷言方法,表示數組的成員是否知足一種條件,只要有一個知足就會返回true,不然返回false
- every():他跟some方法的區別是必須全部的數組成員知足的時候纔會返回true,不然返回false
- reduce():依次對數組的成員進行累加最後返回一個值,他和reduceRight()的區別是reduce是從左向右,reduceRight()從右向左
- indexOf():返回給定元素在數組中國第一次出現的位置,若是沒有出現返回-1
- lastIndexof():返回給定元素在數組中最後一次出現的位置,若是沒有返回-1
- ES6對數組的擴展方法
- Array.from():表示將兩類對象轉化爲真正的數組:相似數組的對象和可遍歷的對象(Iterator),還能夠接受第二個參數,做用相似於數組的map方法
- Array.of():用於將一組值轉化爲數組 Array.of(1,2,3,4,5);[1,2,3,4,5]
- copyWithIn(target,start,end):將指定位置的成員複製到其餘地方,target表示目標位置,start表示開始位置,end表示結束位置
- find():用於找出第一個複合條件的數組成員,參數爲一個函數,若是沒有找到返回undefined
- findIndex():用於找出最後一個複合條件的數組成員,參數也是一個函數
- fill():使用給定製填充一個數組
- entries():用於遍歷數組,entries是對鍵值對的遍歷
- keys():用於遍歷數組,keys是對鍵名的遍歷
- values():用於遍歷數組,values是對鍵值的遍歷
- includes():返回一個布爾值,表示一個數組是否包含給定的值
,[Nan].includes(Nan); //true
,而indexof內部採用的是‘===’,所以[NaN].indexOf(NaN);//false
- flat():數組的成員有時候仍是數組,經過這個方法能夠將數組轉變爲一個一維數組,注意點默認參數是1,表示只拉平一層
- flatMap():參數爲一個函數,其用法和flat()差很少
- 數組的擴展運算符:
- 數組的擴展運算符至關於rest參數的逆運算,將一個數組轉化爲用逗號分隔的參數序列console.log(...[1,2,3,4,5]);//1,2,3,4,5
- 若是將數組的擴展運算符放在括號中,JavaScript引擎會認爲是函數調運就會報錯
(...[1,2,3,4,5])//會報錯
- 替代函數的apply方法
- 合併數組
- 與結構賦值結合使用,與結構賦值使用只能放在最後一位
- 字符串的使用
- call、apply、bind方法
- call():能夠指定函數內部this的指向,也能夠簡單理解改變函數內部this的指向,call()方法的參數應該是一個對象,若是默認傳入空、null、 undefined 則表示默認傳入全局對象,若是傳入的是this表示綁定當前此環境(對象)
- apply():它和call惟一的區別是它接受一個數組做爲參數的其餘參數,其他的問題都是和call同樣
- bind():將函數內部的this綁定到某個對象,而後返回一個新對象
- 數組的空位:指數組的某一個位置徹底沒有值,空位不是undefined,數組的一個位置爲undefined表示徹底是有值的
[,,,]//表示這是數組的空位
- ES5對空位的處理是跳過忽略,而ES6對空位的處理是用undefined填充,不會忽略空位的
面向對象編程
- 構造函數
- 背景:面向對象編程的第一步就是生成對象,典型的面向對象的編程語言如java c++中都有類的概念,可是在JavaScript中不是基於類的而是基於構造函數(constructor)和原型(prototype)
- 定義:構造函數其實就是一個函數,只不過這個函數是用來生成對象模板的,
- 特色:函數體內部使用了this關鍵字,表示所生成的對象實例、生成對象的時候必須使用new關鍵字
- new關鍵字的使用原理
- 使用new命令,new關鍵字後面的函數一次執行下面的四步操做:
- 建立一個空對象,做爲將要返回的對象實例
- 將這個空對象的原型,指向構造函數的的prototype屬性
- 將這個空對象賦值給函數體內部的this關鍵字
- 開始執行構造函數內部的代碼
- 注意點:若是構造函數內部有return語句,並且return後面跟着一個對象,則返回return指定的對象,不然就會忽略return,返回this指定的對象
- new.target:函數內部可使用new.target命令,若是當前函數是new關鍵字建立的new.target指向當前函數,不然爲undefined。咱們可使用這個命令判斷函數調運的時候是否使用的new關鍵字
- Object.create():建立實例對象,構造函數做爲模板,能夠生成實例對象。可是,有時拿不到構造函數,只能拿到一個現有的對象。咱們但願以這個現有的對象做爲模板,生成新的實例對象,這時就可使用Object.create()方法。
- this關鍵字
- 含義:this關鍵字就是指屬性和方法當前所在的對象
- this關鍵字的使用場合:
- 在全局對象中,表示頂層對象window
- 構造函數中,表示實例對象
- 對象的方法中,表示該方法運行是所在的對象,注意點:若是this所在的方法不在對象的第一層,這時this只是指向當前一層的對象,而不會繼承更上面的層。
- this關鍵字使用的注意點:
- 避免多層嵌套使用this關鍵字
- 避免數組的map和forEach()方法中使用this關鍵字,可是這個問題在箭頭函數中獲得了很好的解決
- 避免回調函數中使用this,回調函數中的this每每會改變this的指向
- 對象的繼承
- 對象的繼承說白了就是代碼的複用,把幾個對象相同的代碼能夠抽離爲一個公共的父級
- 構造函數的缺點:同一個構造函數的多個實例之間,沒法共享屬性,從而形成對系統資源的浪費。
- prototype屬性的做用:原型對象的全部屬性和方法,實例對象是徹底能夠共享的
- 原型鏈:JavaScript規定,全部對象都有本身的原型,一層一層上溯頂層對象
Object.prototype
的原型爲null
- constructor屬性:prototype對象默認是有一個constructor屬性,默認是指向原型對象所在的所在的構造函數,做用:咱們能夠經過這個屬性判斷某個對象的構造函數
- instanceof運算符:返回一個布爾值,表示對象是否爲某個構造函數的實例
- instanceof工做原理:instanceof運算符的左邊是對象右邊是構造函數,它會判斷右邊構造函數的原型是否在左邊對象的原型上
function Person(name){
this.name = name;
}
var obj = new Perosn('lucy');
obj instanceof Perosn// true
複製代碼
json
- json是一種輕量級的數據交換格式,並且是文本格式
- json存在的意義就是取代繁瑣笨重的XML
- 相比xml,json的特色是:書寫簡單,一目瞭然
- json對值的格式和類型有嚴格的要求:
- 複合類型的值只能是對象或數組,而不能是函數、正則表達式對象、日期對象
- 原始類型的值只有四種分別是:字符串、數值、Boolean、null(不能使用NaN、infinity、-infinity、undefined)
- 字符串必須使用雙引號表示,不能使用單引號表示
- 對象的鍵名必須放在雙引號裏面
- 數組或對象的最後一個成員後面不能加逗號
- 靜態方法
- json.stringify():用於將一個值轉化爲json字符串,該字符串複合json格式
- json.parse():用於將json字符串轉化爲對應的值