事件委託:javascript
給父元素綁定事件監聽,子元素經過事件冒泡觸發事件 好處:1.內存佔用減小 2.刪除子元素時不須要解綁事件java
===========================編程
this對象:基於執行環境綁定數組
匿名函數執行環境具備全局性,因此this指向window瀏覽器
===========================服務器
閉包:在一個函數內部定義的函數會將包含函數的活動對象添加到它的做用域鏈中網絡
爲何使用閉包
1.利用閉包實現數據私有化或模擬私有方法框架
2.柯里化異步
===========================
原型繼承:
===========================
(function foo(){ })()
和(function foo(){ }())
。以上函數不會暴露到全局做用域
===========================
null
、undefined
和未聲明變量之間有什麼區別:1.沒有提早使用var
、let
或const
聲明變量,就爲一個變量賦值時,該變量是未聲明變量,未聲明變量會脫離當前做用域,成爲全局做用域下定義的變量。
2.當一個變量已經聲明,但沒有賦值時,該變量的值是undefined
。若是一個函數的執行結果被賦值給一個變量,可是這個函數卻沒有返回任何值,那麼該變量的值是undefined
。
3.null
只能被顯式賦值給變量。它表示空值
===========================
.forEach
和.map()
的主要區別在於.map()
返回一個新的數組。若是你想獲得一個結果,但不想改變原始數組,用.map()
。若是你只須要在數組上作迭代修改,用forEach
。
===========================
匿名函數能夠在 IIFE 中使用,來封裝局部做用域內的代碼,以便其聲明的變量不會暴露到全局做用域。
匿名函數能夠做爲只用一次,不須要在其餘地方使用的回調函數。當處理函數在調用它們的程序內部被定義時,代碼具備更好地自閉性和可讀性
匿名函數能夠用於函數式編程或 Lodash(相似於回調函數)
===========================
Object.creat()與new
===========================
Ajax(asynchronous JavaScript and XML)是使用客戶端上的許多 Web 技術,建立異步 Web 應用的一種 Web 開發技術。藉助 Ajax,Web 應用能夠異步(在後臺)向服務器發送數據和從服務器檢索數據,而不會干擾現有頁面的顯示和行爲。經過將數據交換層與表示層分離,Ajax 容許網頁和擴展 Web 應用程序動態更改內容,而無需從新加載整個頁面。實際上,如今一般將 XML 替換爲 JSON,由於 JavaScript 對 JSON 有原生支持優點。
優勢
缺點
===========================
JS模板:Handlebars、Underscore、Lodash、AngularJS 和 JSX
===========================
「Attribute」 是在 HTML 中定義的,而 「property」 是在 DOM 上定義的。
===========================
'use strict' 是用於對整個腳本或單個函數啓用嚴格模式的語句。嚴格模式是可選擇的一個限制 JavaScript 的變體一種方式 。
優勢:
this
的值爲undefined
。缺點:
function.caller
和function.arguments
。===========================
在現代的 SPA 中,客戶端渲染取而代之。瀏覽器從服務器加載初始頁面、整個應用程序所需的腳本(框架、庫、應用代碼)和樣式表。當用戶導航到其餘頁面時,不會觸發頁面刷新。該頁面的 URL 經過 HTML5 History API 進行更新。瀏覽器經過 AJAX 請求向服務器檢索新頁面所需的數據(一般採用 JSON 格式)。而後,SPA 經過 JavaScript 來動態更新頁面,這些 JavaScript 在初始頁面加載時已經下載。這種模式相似於原生移動應用的工做方式。
好處:
壞處:
===========================
Promise
代替回調函數有什麼優缺點?優勢:
.then()
編寫的順序異步代碼,既簡單又易讀。Promise.all()
編寫並行異步代碼變得很容易。缺點:
===========================、
對象:
for
循環:for (var property in obj) { console.log(property); }
。可是,這還會遍歷到它的繼承屬性,在使用以前,你須要加入obj.hasOwnProperty(property)
檢查。Object.keys()
:Object.keys(obj).forEach(function (property) { ... })
。Object.keys()
方法會返回一個由一個給定對象的自身可枚舉屬性組成的數組。Object.getOwnPropertyNames()
:Object.getOwnPropertyNames(obj).forEach(function (property) { ... })
。Object.getOwnPropertyNames()
方法返回一個由指定對象的全部自身屬性的屬性名(包括不可枚舉屬性但不包括 Symbol 值做爲名稱的屬性)組成的數組。數組:
for
loops:for (var i = 0; i < arr.length; i++)
。這裏的常見錯誤是var
是函數做用域而不是塊級做用域,大多數時候你想要迭代變量在塊級做用域中。ES2015 引入了具備塊級做用域的let
,建議使用它。因此就變成了:for (let i = 0; i < arr.length; i++)
。forEach
:arr.forEach(function (el, index) { ... })
。這個語句結構有時會更精簡,由於若是你所須要的只是數組元素,你沒必要使用index
。還有every
和some
方法可讓你提早終止遍歷。大多數狀況下,我更喜歡.forEach
方法,但這取決於你想要作什麼。for
循環有更強的靈活性,好比使用break
提早終止循環,或者遞增步數大於一。
===========================
柯里化(currying)是一種模式,其中具備多個參數的函數被分解爲多個函數,當被串聯調用時,將一次一個地累積全部須要的參數。這種技術幫助編寫函數式風格的代碼,使代碼更易讀、緊湊。值得注意的是,對於須要被 curry 的函數,它須要從一個函數開始,而後分解成一系列函數,每一個函數都須要一個參數。
===========================
===========================
===========================