react利用虛擬dom和diff算法,進行新dom和舊dom的差別計算,再進行對應dom片斷的真實dom更新,其算法有三個級別:tree(樹)、component(組件)、element(元素),性能依次加強。html
在dom更新時,react會遍歷一遍新的dom判斷與舊dom的差別,diff算法的巧妙就在於,若是element只是位置發生了變化,若是進行刪除增長的方法,影響性能。所 以react制定了一個規則去將舊dom排序。vue
排序規則以下: 若是element在舊dom中的位置比新dom中的位置小,就將element右移,若是element在舊dom中的位置比新dom中的位置同樣或者大,不改變它 的位置, react只須要改動前者,就會將位置差別的dom排列完成。react
好比一個dom列表爲 A B C D , 將要渲染的dom列表變成了 B A D C , react會將B右移, D右移。從不會將A、C左移的操做。jquery
在遍歷插入組件時,咱們常會設置一個key值給組件,這即是react的diff算法時須要的key,若是沒有了這個key值,react無法進行新dom與舊dom中element的匹配,從而無法進行判斷element是否只是位置發生了變化,所以只能進行刪除和插入的操做,對dom的刪除插入,所以下降性能。es6
1. angular的雙向數據綁定 - 髒檢查機制ajax
angular的$scope掛在了全部的雙向數據綁定的屬性,在頁面渲染完畢後,angular會將全部的可能改變數據模式的行爲進行監聽,如事件、ajax請求、timeout等。一旦有這些行爲須要觸發,angular在每個行爲完成後都會進行$digist循環,來進行髒值檢查,若是有新的值,那麼angular就發佈更新,使得響應到視圖。算法
因爲這個特性,所以咱們用原生js或者jqeury等外部的行爲改變數據模型的值,angular並沒有法檢測,所以沒法進入髒值檢查階段,這時候咱們就須要$apply方法手動進入$digist循環,它會檢查全部監聽的內容。promise
2. vue的雙向數據綁定 - 數據劫持瀏覽器
vue的雙向數據綁定離不開Object.defineProperty方法,此方法沒法兼容ie9之前,所以vue不兼容老版本ie瀏覽器。網絡
vue在實例化過程當中,保存了全部data中的屬性,而且給每個屬性定義監聽器,在定義監聽器同時,會建立一個發佈器,該發佈器會添加訂閱者到該屬性下,當某一時刻,數據模型發生了改變,該發佈器會觸發響應,通知全部訂閱者引發更新,經過訂閱/發佈模式來進行交互。
Promise歸入了es6標準以前,angular、jquery等的類Promise的實現,並不是標準的 Promise,這裏記錄一下Promise的標準語法
1. Promise對象
var p = new Promise(function (resolve, reject) { setTimeout(function () { var ra = Math.random() ra < 0.5 ? resolve() : reject() }, 1000) }) p.then(function () { console.log('成功') }, function () { console.log('失敗') })
new Promise() 構造函數創建一個Promise對象
其最多見的就是then方法,then方法可接收3個函數,通常傳遞2個,最多見傳遞1個。
分別爲 成功回調、失敗回調、完成回調
若是隻想定義失敗回調能夠這樣定義
var p = new Promise(function (resolve, reject) { // ... }) p.then(null, function () { console.log('失敗') })
promise對象還有一個方法是catch,捕捉異常。利用這個方法改進上面方法
var p = new Promise(function (resolve, reject) { // ... }) p.catch(function (err) { console.log('失敗') })
catch來處理全部的失敗狀況。
then方法能夠多個調用,return不會終止then方法繼續調用,若是須要終止then方法的往下執行,throw拋出異常。
var p = new Promise(function (resolve, reject) { // ... }) p.then(function () { console.log('第一次then') // 未成功阻止 return false }).then(function (falg) { console.log('第二次then, falg = ' + flag) // false throw new Error('終止') }).then(function (){ console.log('執行不到') }).catch(function () { console.log('失敗') })
then方法中全部的return值都會傳遞給下一個then,就像一個加工流水線,一個一個往下傳。一個then中執行一類操做。
2. 返回新的Promise對象
then方法中能夠返回新的promise對象
p.then(function (res) { console.log('第一個Promise') // 未成功阻止 return new Promise(function () { // ... }) }).then(function (res) { console.log('第二個Promise對象') }).catch(function () { console.log('失敗') })
第一個then中return的Promise內,resolve的值會傳遞給第二個then的res參數。
3. Promise.all 並行執行全部promise對象
var arr = [] arr[0] = new Promise(function (resolve, reject) { // ... }) arr[1] = new Promise(function (resolve, reject) { // ... }) Promise.all(arr).then(function (resArr) { // .. }).catch(function (err) { // .. })
執行全部Promise對象,resArr保存着相對應的結果
4. Promise.resolve()
Promise.resolve().then(function () { console.log('開始') }).catch(function (err) { // .. }) console.log('最後') // 最後 // 開始
Promise.resolve方法直接返回一個發佈成功的Promise,此方法用來將then方法延遲,如上。then方法會延遲到當前函數棧調用的最後,所以改變了console.log的順序