原文地址javascript
JavaScript 是多范式语言,支持 命令式/程序式编程,以及 OOP(面向对象编程)和函数编程。JavaScript 经过原型继承支持 OOP。html
红牌警告:java
了解更多:git
函数编程经过建立数学意义上的方法来避免共享状态和修改数据来生成程序。Lisp 是最先支持函数编程的,受到 lambda 的启发。Lisp 和 不少Lisp 家族语言至今仍然使用。程序员
函数式编程是 JavaScript 基本概念。一些常见的函数工具在 ES5 中被添加。github
红牌警告:面试
了解更多:算法
类继承:继承来自类(相似蓝图-类的一种描述),建立子类关系:等级分类法。经过构造函数的 new
关键字实例化。类继承可能在 ES6 中不容许使用 class
关键字。编程
原型继承:实例继承直接来自另外一个对象。实例是经过工厂方法或者 Object.create()
实现。实例可能从多个不一样的对象中组成,容许容易地选择性继承。设计模式
在 JavaScript 中,原型继承比类继承更加简单和可扩展。
红牌警告:
OOP优势:容易理解对象的基本概念,容易理解方法调用的意义。OOP 倾向使用命令式风格而不是声明式风格,它读起来像是直接指示计算机去作什么。
OOP缺点:OOP 典型地依赖共享状态。对象和行为被一个实体跟踪,也就是说任何数量的无序命令用函数能够随机访问,会致使像竞争条件同样的不可描述的行为。
FP优势:函数式范式,程序员能够避免共享状态和反作用,也就消灭了同个资源的多个函数计算引发的bug。这种特性是 point-free风格的可用性。相较于 OOP,函数倾向于快速简单而容易的重组通用的可复用代码。
函数式编程更喜欢声明和声明风格,它不会一步步指示操做,而是结合要作的事,让潜在的方法关系如何去作。这为重构和性能优化留下巨大的空间,甚至容许你替换所有算法只须要一点点代码改变,这种更有效的方式(好比:内存管理,使用懒惰评估替换有限评估)
利用纯函数的计算也很容易在多个处理器或跨分布式计算集群中扩展,而没必要担忧线程资源冲突,竞争条件等...
FP缺点:过分使用FP功能(如无点样式和大型组合)可能会下降可读性,由于生成的代码一般更抽象地指定,更简洁,更具体。
与函数式编程相比,更多人熟悉OO和命令式编程,所以即便是函数式编程中常见的习惯也会让新团队成员感到困惑。
FP比OOP有更陡峭的学习曲线,由于OOP的普遍流行使得OOP的语言和学习材料变得更具会话性,而FP的语言每每更具学术性和正式性。 FP概念常常被写成使用来自lambda演算,代数和类别理论的习语和符号,全部这些都须要在这些领域中的先验知识基础被理解。
红牌警告:没法列出一种风格或另外一种风格的缺点-有经验的人对任何风格都能说出一些限制。
了解更多
答案永远不会,或者几乎从不。 固然永远不会超过一个级别。 多级类层次结构是反模式。 多年来我一直在发出这个挑战,我听过的惟一答案属于几种常见的错误观念之一。 更常见的是,挑战是沉默。
“若是某个功能有时颇有用 有时很危险 若是有更好的选择 而后老是使用更好的选择。“ -- Douglas Crockford
了解更多
原型继承有多种类型:
Object.assign()
)。每种类型的原型继承都有本身的一组用例,但它们在启用组合方面一样有用,它建立了有一个或用一个或能够作一个的关系而不是使用类继承建立是一个的关系。
红牌警告:
Object.assign()
。了解更多
这是“设计模式:可重用的面向对象软件的元素”的引用。 这意味着代码重用应该经过将较小的功能单元组装到新对象中而不是从类继承并建立对象分类来实现。
换句话说,使用can-do,has-a或 uses-a 关系而不是is-a关系。
但愿听到:
红牌警告:
双向数据绑定意味着 UI 表单被绑定,用来动态地建模数据,使得当 UI 表单改变时,模型数据随之改变,反之亦然。
单向数据流意味着模型是单一的事实来源。 UI中的更改触发消息,指示用户对模型的意图(或React中的“存储”)。 只有模型才有权更改应用程序的状态。 结果是数据老是在单一方向上流动,这使得它更容易理解。
单向数据流是肯定性的,而双向绑定可能致使更难以遵循和理解的反作用。
红牌警告:
单一体系结构意味着您的应用程序是做为一个有凝聚力的代码单元编写的,其组件旨在协同工做,共享相同的内存空间和资源。
微服务架构意味着您的应用程序由许多较小的独立应用程序组成,这些应用程序可以在本身的内存空间中运行,而且可能在许多不一样的机器上相互独立地进行扩展。
单一优势:单一架构的主要优点在于大多数应用程序一般都有大量的交叉问题,例如日志记录,速率限制以及审计跟踪和DOS保护等安全功能。
当一切都在同一个应用程序中运行时,很容易将组件与这些跨领域的问题联系起来。
还有性能优点,由于共享内存访问比进程间通讯(IPC)更快。
单一架构缺点:随着应用程序的发展,单一应用程序服务每每会紧密耦合并纠缠在一块儿,所以很难将服务隔离,例如独立扩展或代码可维护性。
单一体系结构也很难理解,由于当您查看特定服务或控制器时,可能存在依赖性,反作用和魔法,这些并不明显。
微服务优势:微服务架构一般组织得更好,由于每一个微服务都有很是特定的工做,而且不关心其余组件的工做。解耦服务也更容易重构和从新配置,以知足不一样应用程序的需求(例如,同时提供Web客户端和公共API)。
它们还能够具备性能优点,具体取决于它们的组织方式,由于它能够隔离热服务并将其扩展为独立于应用程序的其他部分。
微服务缺点:当您构建新的微服务架构时,您可能会发现许多在设计时没有预料到的跨领域问题。一个单一的应用程序能够创建共享的魔术助手或中间件来处理这些跨领域的问题,而不须要太多的努力。
在微服务架构中,您须要为每一个交叉问题产生单独模块的开销,或者将交叉问题封装在全部流量路由经过的另外一个服务层中。
最终,即便是单一的体系结构也倾向于经过外部服务层来传输流量以解决交叉问题,可是采用单一体系结构,能够延迟这项工做的成本,直到项目更加成熟为止。
微服务常常部署在他们本身的虚拟机或容器上,致使VM争用工做激增。这些任务常常经过容器队列管理工具自动完成。
红牌警告:
同步编程意味着,除了条件和函数调用以外,代码从上到下依次执行,阻止长时间运行的任务,如网络请求和磁盘I / O.
异步编程意味着引擎在事件循环中运行。当须要阻塞操做时,将启动请求,代码将继续运行而不会阻塞结果。当响应准备就绪时,将触发中断,从而致使运行事件处理程序,控制流继续执行。经过这种方式,单个程序线程能够处理许多并发操做。
用户界面本质上是异步的,而且花费大部分时间等待用户输入来中断事件循环并触发事件处理程序。
默认状况下,节点是异步的,这意味着服务器的工做方式大体相同,在循环中等待网络请求,并在处理第一个请求时接受更多的传入请求。
这在JavaScript中很重要,由于它很是适合用户界面代码,而且很是有利于服务器上的性能。
红牌警告:
坚持高级主题。若是他们可以回答这些问题,那一般意味着他们有足够的编程经验能够在几周内得到语言怪癖和语法,即便他们没有不少JavaScript经验。
不要基于易于学习的东西(包括经典的CS-101算法或任何类型的拼图问题)取消候选人资格。
你真正须要知道的是,“这位候选人是否理解如何将应用程序放在一块儿?”
这就是口语采访。
在真实的采访中,我更增强调编码挑战和观察候选人代码。这些主题在个人“掌握JavaScript面试”系列中有详细介绍。