總結JS知識點

事件委託:javascript

給父元素綁定事件監聽,子元素經過事件冒泡觸發事件    好處:1.內存佔用減小 2.刪除子元素時不須要解綁事件java

===========================編程

this對象:基於執行環境綁定數組

匿名函數執行環境具備全局性,因此this指向window瀏覽器

===========================服務器

閉包:在一個函數內部定義的函數會將包含函數的活動對象添加到它的做用域鏈中網絡

爲何使用閉包

1.利用閉包實現數據私有化或模擬私有方法框架

2.柯里化異步

===========================

原型繼承:

===========================

(function foo(){ })()(function foo(){ }())。以上函數不會暴露到全局做用域

===========================

nullundefined和未聲明變量之間有什麼區別:

1.沒有提早使用varletconst聲明變量,就爲一個變量賦值時,該變量是未聲明變量,未聲明變量會脫離當前做用域,成爲全局做用域下定義的變量。

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 有原生支持優點。

優勢

  • 交互性更好。來自服務器的新內容能夠動態更改,無需從新加載整個頁面。
  • 減小與服務器的鏈接,由於腳本和樣式只須要被請求一次。
  • 狀態能夠維護在一個頁面上。JavaScript 變量和 DOM 狀態將獲得保持,由於主容器頁面未被從新加載。
  • 基本上包括大部分 SPA 的優勢。

缺點

  • 動態網頁很難收藏。
  • 若是 JavaScript 已在瀏覽器中被禁用,則不起做用。
  • 有些網絡爬蟲不執行 JavaScript,也不會看到 JavaScript 加載的內容。
  • 基本上包括大部分 SPA 的缺點

===========================

JS模板:Handlebars、Underscore、Lodash、AngularJS 和 JSX

===========================

「Attribute」 是在 HTML 中定義的,而 「property」 是在 DOM 上定義的。

===========================

'use strict' 是用於對整個腳本或單個函數啓用嚴格模式的語句。嚴格模式是可選擇的一個限制 JavaScript 的變體一種方式 。

優勢:

  • 沒法再意外建立全局變量。
  • 會使引發靜默失敗(silently fail,即:不報錯也沒有任何效果)的賦值操拋出異常。
  • 試圖刪除不可刪除的屬性時會拋出異常(以前這種操做不會產生任何效果)。
  • 要求函數的參數名惟一。
  • 全局做用域下,this的值爲undefined
  • 捕獲了一些常見的編碼錯誤,並拋出異常。
  • 禁用使人困惑或欠佳的功能。

缺點:

  • 缺失許多開發人員已經習慣的功能。
  • 沒法訪問function.callerfunction.arguments
  • 以不一樣嚴格模式編寫的腳本合併後可能致使問題。

===========================

在現代的 SPA 中,客戶端渲染取而代之。瀏覽器從服務器加載初始頁面、整個應用程序所需的腳本(框架、庫、應用代碼)和樣式表。當用戶導航到其餘頁面時,不會觸發頁面刷新。該頁面的 URL 經過 HTML5 History API 進行更新。瀏覽器經過 AJAX 請求向服務器檢索新頁面所需的數據(一般採用 JSON 格式)。而後,SPA 經過 JavaScript 來動態更新頁面,這些 JavaScript 在初始頁面加載時已經下載。這種模式相似於原生移動應用的工做方式。

好處:

  • 用戶感知響應更快,用戶切換頁面時,再也不看到因頁面刷新而致使的白屏。
  • 對服務器進行的 HTTP 請求減小,由於對於每一個頁面加載,沒必要再次下載相同的資源。
  • 客戶端和服務器之間的關注點分離。能夠爲不一樣平臺(例如手機、聊天機器人、智能手錶)創建新的客戶端,而無需修改服務器代碼。只要 API 沒有修改,能夠單獨修改客戶端和服務器上的代碼。

壞處:

  • 因爲加載了多個頁面所需的框架、應用代碼和資源,致使初始頁面加載時間較長。
  • 服務器還須要進行額外的工做,須要將全部請求路由配置到單個入口點,而後由客戶端接管路由。
  • SPA 依賴於 JavaScript 來呈現內容,但並不是全部搜索引擎都在抓取過程當中執行 JavaScript,他們可能會在你的頁面上看到空的內容。這無心中損害了應用的搜索引擎優化(SEO)。然而,當你構建應用時,大多數狀況下,搜索引擎優化並非最重要的因素,由於並不是全部內容都須要經過搜索引擎進行索引。爲了解決這個問題,能夠在服務器端渲染你的應用,或者使用諸如 Prerender 的服務來「在瀏覽器中呈現你的 javascript,保存靜態 HTML,並將其返回給爬蟲」。

 

===========================

Promise代替回調函數有什麼優缺點?

優勢:

  • 避免可讀性極差的回調地獄。
  • 使用.then()編寫的順序異步代碼,既簡單又易讀。
  • 使用Promise.all()編寫並行異步代碼變得很容易。

缺點:

  • 輕微地增長了代碼的複雜度(這點存在爭議)。
  • 在不支持 ES2015 的舊版瀏覽器中,須要引入 polyfill 才能使用。

===========================、

你使用什麼語句遍歷對象的屬性和數組的元素?

對象:

  • 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++)
  • forEacharr.forEach(function (el, index) { ... })。這個語句結構有時會更精簡,由於若是你所須要的只是數組元素,你沒必要使用index。還有everysome方法可讓你提早終止遍歷。

大多數狀況下,我更喜歡.forEach方法,但這取決於你想要作什麼。for循環有更強的靈活性,好比使用break提早終止循環,或者遞增步數大於一。

===========================

柯里化(currying)是一種模式,其中具備多個參數的函數被分解爲多個函數,當被串聯調用時,將一次一個地累積全部須要的參數。這種技術幫助編寫函數式風格的代碼,使代碼更易讀、緊湊。值得注意的是,對於須要被 curry 的函數,它須要從一個函數開始,而後分解成一系列函數,每一個函數都須要一個參數。

===========================

===========================

===========================

相關文章
相關標籤/搜索