如今大部分公司的管理者都會經過技術面試來考察開發者的能力。若是你成爲了候選人,那你必定須要去經歷面試。html
大部分的面試相信你們必定經歷過,可是其實咱們不該該過分關注於語法和一些怪異生僻的特性中。誠然這些能考察到候選人的基礎功紮實與否,但咱們應該更多的是從全局來考慮,詢問架構和範例(這方面決定會對整個項目有重大的影響)。程序員
語法和特性其實都能在谷歌中找到。可是軟件工程師的智慧和JS開發者在經驗中得到的通用範例和用法是沒法從谷歌中得到的。web
Javascript是特殊的,他如今幾乎在全部大型應用中都扮演中重要的角色。那你又知道JS和其餘的語言有什麼不一樣之處嗎?面試
接下來的幾個問題會幫助你探索真正須要關注的內容:算法
Javascript是多範式語言:命令式/過程式,函數式,面向對象。Javascript支持經過原型繼承實現面向對象編程編程
優秀回答:安全
紅色預警: -不知道範式是什麼,也沒有說起原型面向對象或者函數式編程性能優化
參考:服務器
www.cnblogs.com/sirkevin/p/…網絡
函數式編程,能夠歸結爲面向過程的程序設計,可是結合了更多的數學計算的思想。函數式編程就是一種抽象程度很高的編程範式,純粹的函數式編程語言編寫的函數沒有變量,所以,任意一個函數,只要輸入是肯定的,輸出就是肯定的,這種純函數咱們稱之爲沒有反作用。而容許使用變量的程序設計語言,因爲函數內部的變量狀態不肯定,一樣的輸入,可能獲得不一樣的輸出,所以,這種函數是有反作用的。
函數式編程是JavaScript中的一個基本概念(JavaScript兩大支柱之一(原型繼承和函數式編程))
優秀回答:
紅色預警:
類繼承: JavaScript原本是沒有類繼承的,咱們能夠經過關鍵詞new來將構造函數實例化,call和apply方法爲類式繼承提供了支持。經過改變this的做用環境,使得子類自己具備父類的各類屬性。固然,咱們如今擁有了ES6的calss,也可使用calss來實現類繼承。
原型繼承: 實例直接從其餘對象繼承。實例一般經過工廠函數或「Object.create()」實例化。實例能夠由許多不一樣的對象組成,從而能夠方便地選擇繼承。
在JavaScript中,原型繼承比類繼承更簡單、更靈活。
優秀回答:
紅色預警:
面向對象編程的優勢: 很容易理解對象的基本概念,也很容易解釋調用方法的含義。面向對象編程更傾向於命令式而不是聲明式,聲明式讀起來就像是給計算機遵循的直接命令
面向對象編程的缺點: 面向對象編程一般依賴於共享狀態。對象和行爲一般鏈接在同一個實體上,該實體能夠被任意數量的順序不肯定的函數隨機訪問,這可能致使不須要的行爲,如競爭條件。
函數式編程的優勢: 使用函數式編程,程序員能夠避免任何共享狀態或反作用,從而消除因爲多個函數爭奪相同資源而致使的錯誤。與面向對象編程相比,函數式編程從根本上簡化,並易於從新組合,以得到更廣泛可重用的代碼。
函數式編程傾向於聲明式和外延式,它們不詳細說明操做的一步一步的指令,而是專一於作什麼,讓底層函數來處理如何作。這爲重構和性能優化留下了巨大的空間,甚至容許你用更高效的算法替換整個算法,而只需不多的代碼更改。
使用純函數進行計算,也容易跨多個處理器或跨分佈式計算集羣擴展,而無需擔憂線程資源衝突、競爭條件等問題。
函數式編程的缺點: 過分使用函數式編程特性(如大型組合)可能會下降可讀性,由於生成的代碼一般更抽象、更簡潔、更不具體。
與函數式編程相比,更多人熟悉面向對象編程和命令式編程,所以即便是函數式編程中的常見習慣用法也可能讓新團隊成員感到困惑。
函數式編程的學習曲線要比面向對象編程陡峭得多,由於面向對象編程的普遍流行使面向對象編程的語言和學習材料變得更加語義化,而函數式編程的語言則趨向於更加學術化和形式化。函數式編程概念常常涉及到使用lambda演算、代數和範疇理論中的習慣用法和符號,全部這些都須要去了解這些領域的知識。
優秀回答:
紅色預警:
答案是啥時候都不適合,多層次的類結構是反模式。 優秀回答:
原型繼承有多種類型:
每種類型的原型繼承都有本身的建立方法,可是它們合成對象的能力都同樣,它建立了has-a或uses-a或can-do關係,而不是類繼承建立的is-a的關係。
優秀回答:
紅色預警:
Object.assign()
代碼重用應該經過將較小的功能單元組裝到新對象中來實現,而不是繼承類並建立對象分類法。
換句話說,使用can-do,has-a或使用關係而不是is-a關係。 優秀回答:
紅色預警:
雙向數據綁定意味着View層數據變化,Model層的數據也會相應變化,反之亦然。
單向數據流意味着Model層數據變化會引發View層數據變化,但View層數據變化沒法引發Model層的數據變化,數據老是朝着一個方向流動(就像React裏的store)。這使得理解起來更容易。
單向數據流具備是肯定性的,而雙向綁定可能致使更難以遵循和理解的反作用。
優秀回答:
紅色預警:
所謂的單體架構就是把全部的業務模塊編寫在一個項目中,最終會打包成一個war包,而後進行部署
微服務架構意味着應用程序由許多較小的獨立應用程序組成,這些應用程序可以在本身的內存空間中運行,而且可能在許多不一樣的機器上相互獨立地進行擴展和協做。
單體架構優勢:
單片架構的主要優勢是大多數應用程序能夠共用不少東西,例如日誌記錄,速率限制以及審計跟蹤和DOS保護等安全功能。
還有性能優點,由於共享內存訪問比進程間通訊(IPC)更快。
單體架構缺點: 隨着應用程序的發展,應用程序服務每每會緊密耦合和糾纏,從而難以將服務隔離並獨立擴展出來,而且實現代碼可維護性等。 單體架構也很難理解,由於當你查看特定服務或控制器時,可能存在依賴性,反作用等不明顯的隱形問題
它們還能夠根據組織方式得到性能優點,由於能夠獨立於應用程序的其餘部分,與核心服務隔離並對其進行伸縮。
微服務架構優勢 微服務體系結構一般組織得更好,由於每一個微服務都有一個很是特定的任務,而且不關心其餘組件的任務。解耦的服務也更容易從新組合和配置,以知足不一樣應用程序的須要(例如,同時服務於web客戶機和公共API)。
微服務架構缺點 微服務部署在虛擬機或容器上,致使VM爭用工做激增。 運維複雜度提供
優秀回答:
紅色預警:
同步編程意味着,除了條件和函數調用以外,代碼從上到下依次執行,阻塞長時間運行的任務,如網絡請求和磁盤I / O等。
異步編程意味着引擎在一個事件循環中運行。當須要阻塞操做時,將啓動請求,而且代碼將繼續運行,而不會阻塞結果。當響應就緒時,將觸發一箇中斷,這時運行一個事件處理程序,其中控制流將繼續運行。經過這種方式,一個程序線程能夠處理許多併發操做。
用戶界面本質上是異步的,而且花費大部分時間等待用戶輸入來中斷事件循環並觸發事件處理程序。
默認狀況下,Node是異步的,這意味着服務器的工做方式大體相同,在循環中等待網絡請求,並在處理第一個請求時接受更多的傳入請求。
這在JavaScript中很重要,由於它很是適合UI代碼,而且很是有利於服務器上的性能。
優秀回答:
紅色預警: