每个JavaScript开发人员应该知道的10个面试问题
该章节摘抄并翻译自10 Interview Questions Every JavaScript Developer Should Know cr Eric Elliott in medium.com
链接在参考第一个
这是一个笔记,建议阅读原文
1.编程范例
JavaScript是一种多范式语言,支持命令式(imperative)/过程式编程(procedural)以及OOP(面向对象编程)和函数式编程
很高兴听到
- 原型继承(也包括:原型,原型委托OLOO(objects linked to other objects))
Protopal inheritance(alse: prototypes,OLOO) - 函数式编程(也包括:闭包,第一类函数,箭头函数(lambdas))
Functional programming(also:closures,first class functions,lambdas)
红旗
- 不知道范式(paradigm)是什么,没有提到原型oo或函数式编程
学到更多
2.函数式编程
什么是函数式编程(FP)
函数式编程通过组合数学函数来生成程序,并避免共享状态和可变数据。Lisp(1958年指定)是最早支持函数式编程的语言之一,收到lambda演算()的启发。Lisp和许多Lisp系列语言至今仍在使用。
函数式编程是JavaScript中的一个基本概念(JavaScript的两大支柱之一)。ES5中的JavaScript中添加了几个常用的功能实用程序。
很高兴听到
- 纯(Pure)功能/功能纯度
- 避免副作用
- 功能构成简单
- 函数语言的例子:Lisp,ML,Haskell,Erlang,Clojure,Elm,FSharp,OCaml等
- 提到支持FP的功能:第一类函数,高阶函数,函数作为参数/值
红旗
- 没有提到纯粹的功能/避免副作用。
- 无法提供函数式编程语言的示例。
- 无法识别启用FP的JavaScript功能。
学到更多
3.经典继承和原型继承有什么区别
经典继承(Class Inheritance:)实例继承自类(blueprint -- a description of the class
),并创建子类关系:分层类分类。实例通常使用带有new
关键字的构造函数进行实例化。类继承可能使用也可能不使用ES6中的class
关键字。
原型继承(Prototypal Inheritance)实例直接从其他对象继承。实例通常通过工厂函数或Object.create()
实例化。实例可以由许多不同的对象组成,允许容易的选择性继承。
在JavaScript中,原型继承比类继承更简单,更灵活。
很高兴听到
- 类:创建紧密耦合或层次结构/分类。
- 原型:提到连接继承,原型委托,功能继承,对象组合。
红旗
- 没有原型继承和组合优于类继承的偏好。
学到更多
4.函数式编程与面向对象编程的优缺点是什么?
OOP优点:很容易理解对象的基本概念,并且易于理解方法调用的含义。OOP倾向于使用命令式样式而不是声明式样式,它类似于计算机遵循的直接指令集。
OOP缺点: OOP通常取决于共享状态。对象和行为通常在同一实体上加在一起,可以由具有非确定性顺序的任意数量的函数随机访问,这可能导致诸如竞争条件之类的不期望的行为。
FP优点:使用功能范例,程序员可以避免任何共享状态或副作用,从而消除多个函数竞争相同资源所导致的错误。由于具有无点样式(也称为默认编程)的特性,与OOP相比,函数往往会从根本上简化并轻松地重新组合,以获得更普遍的可重用代码。
FP也趋向于支持声明和指称的风格,不拼出来的操作一步一步的指示,而是专注于怎样做,让底层的功能采取的护理如何。这为重构和性能优化留下了巨大的空间,甚至允许您用更有效的代码替换整个算法,只需很少的代码更改。(例如,记忆,或使用惰性评估代替急切的评估。)
利用纯函数的计算也很容易跨多个处理器或跨分布式计算集群进行扩展,而不必担心线程资源冲突,竞争条件等...
FP缺点:过度利用FP功能(如无点样式和大型组合)可能会降低可读性,因为生成的代码通常更抽象地指定,更简洁,更具体。
与函数式编程相比,更多人熟悉OO和命令式编程,因此即使是函数式编程中的常见习惯也会让新团队成员感到困惑。
FP比OOP有更陡峭的学习曲线,因为OOP的广泛流行使得OOP的语言和学习材料变得更具会话性,而FP的语言往往更具学术性和正式性。FP概念经常被写成使用来自lambda演算,代数和类别理论的成语和符号,所有这些都需要在这些领域中的先验知识基础被理解。
很高兴听到
- 提到共享状态的问题,竞争相同资源的不同事物等等......
- 意识到FP能够从根本上简化许多应用程序
- 意识到学习曲线的差异。
- 阐明副作用以及它们如何影响程序可维护性。
- 意识到功能强大的代码库可能具有陡峭的学习曲线。
- 意识到与同等的FP代码库相比,高度OOP代码库可以非常耐受变化并且非常脆弱。
- 意识到不变性导致了一个极易访问和可延展的程序状态历史记录,允许轻松添加诸如无限撤消/重做,倒带/重放,时间旅行调试等功能。可以在任一范例中实现不变性,但共享有状态对象的扩散使OOP中的实现变得复杂。
红旗
- 无法列出一种风格或另一种风格的缺点 - 任何一种风格的人都应该遇到一些限制。
学到更多
5.什么时候经典继承是一个合适的选择?
很高兴听到
不存在这种情况
- 从框架基类开始,单个级别有时是可以的React.Component。
- 赞成对象组合而不是类继承。
学到更多
6.什么时候原型继承是一个合适的选择?
很高兴听到
红旗
- 不知道何时使用原型。
- 没有意识到mixins或
Object.assign()
。
7. 暂停
8.什么是双向数据绑定和单向数据流,它们有何不同?
很高兴听到
- React是单向数据流的新规范示例,因此提及React是一个很好的信号。Cycle.js是单向数据流的另一种流行实现。
- Angular是一种使用双向绑定的流行框架。
红旗
- 不了解任何一个意味着什么。无法阐明差异。
9.暂停
10.什么是异步编程,为什么它在JavaScript中很重要?
很高兴听到
红旗
参考
- [1]
- [2]
- [3] 函数式编程之根-拉姆达运算/演算(λ-calculus)