美文网首页
前端面试题

前端面试题

作者: crazyz | 来源:发表于2017-10-29 21:52 被阅读0次

感谢markyun在github提供的 前端开发面试题
搬这个的目的是希望每天能回答5-10题(尽量写Demo),一方面对已知的知识加深理解,另一方面找到自己缺乏的知识进而补充完善自己对前端的知识面.
(搬到简书的目的是为了熟悉markdown..)

HTML

1. Doctype的作用,标准模式与兼容模式各有什么区别?
  1. <!DOCTYPE> 声明位于HTML文档的第一行,处于 <html>标签之前.告知浏览器的解析器用什么文档标准解析这个文档.DOCTYPE不存在或者格式不正确会导致文档以兼容模式呈现;
  2. 标准模式的排版 JS 运作模式都是以该浏览器能支持的最高标准运行.在兼容模式下,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作;
2.HTML5为什么只需要写<!DOCTYPE HTML> ?

HTML5不基于SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运行);
而HTML4.01基于SGML,所以需要对DTD进行引用,才能告诉浏览器文档所使用的文档类型;

3.行内元素有哪些?块级元素有哪些?空(void)元素有哪些?

首先:CSS官方规定,每个元素都有 display 属性,以确定该元素的类型,每个元素都有默认的display值,如 divdisplay 值为 block ,是一个块级元素, span 标签的默认 display 属性的默认值为 inline行内元素;

  • 行内元素:
    <a> <b> <span> <img> <input> <select> <strong>
  • 块级元素:
    <div> <ul> <ol> <li> <dl> <dt> <dd> <h1>-<h6> <p>
  • 常见空元素:
    <br> <hr> <img> <input> <link> <meta>
    <area> <base> <col> <command> <embed> <param> <source> <track> <wbr>
    不同浏览器(版本)实际略有差异
4.页面导入样式时使用 link 和 @import 有什么区别?
  1. link 是 XHTML标签,除了加载CSS样式外,还能定义RSS,定义rel连接属性等作用;而@import 是CSS提供的,只能用于加载CSS;
  2. 页面被加载时 link 会同时被加载,而@import 引用只能等到页面被加载完成后再加载;
  3. import时CSS2.1提出的,只在IE5以上才能被识别,而link时XHTML标签,无兼容问题;
5.介绍你对浏览器内核的了解.

主要有两个部分组成:

  1. 渲染引擎:主要负责取得网页的内容(HTML/XML/图像等),整理信息(如加入CSS等),以及计算网页的显示方式,然后输出至显示器或打印机.浏览器的内核的不同对于网页语法解释会有不同,所以渲染效果也不相同.
  2. JavaScript引擎: 解析和执行JavaScript脚本.

最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎。

6.常见的浏览器内核有哪些?

浏览器最重要或者说核心部分是"Rendering Engine",可大概意为:"渲染引擎",不过我们一般习惯将之称为"浏览器内核".负责读i网页语法解释,(如标准通用标记语言HTML,JavaScript)并渲染(显示)网页.所以通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎确定了浏览器如何显示网页的内容以及页面的格式信息.不同的浏览器内核对网页编写语法的解释不同,因此同一网页在不同的内核浏览器的渲染效果不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果的原因.

  • Triden IE浏览器内核
  • Gecko Firefox浏览器内核
  • Webkit safar内核 chrome 内核原型
  • Blink Google和Opera 开发的排版引擎
  • Presto 前Opera内核,已废弃
7.html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

新特性:

  • 拖拽释放API
  • 画布(Canvas) API
  • 地理(Geolocation) API
  • 本地离线存储(localStorage) 长期存储,浏览器关闭数据不丢失
  • sessionStorage 浏览器关闭自动删除
  • 支持 webworker/websocket/geolocation
    新元素
    语义化标签<header> <nav> <footer> <aside> <article> <section>
    画布<canvas> 音视频 <audio> <video>表单控件 calendar date time email url search
    移除的元素
    纯表现的元素:<basefont> <big> <center> <font> <s> <tt> <u>
    对可用性产生负面影响的元素: <frame> <frameset> <noframes>
    处理HTML5新标签的浏览器兼容问题:
    可以通过 document.createElement方法产生新的标签,然后给标签添加默认样式.
    或者使用成熟的框架 如: html5shim
    区分HTML和HTML5 可以通过DOCTYPE 声明
8.简述一下你对HTML语义化的理解?
  • 简单的说就是 根据内容结构化(语义化) 选择合适的标签 便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好的解析;
    为什么要语义化?
  • 在没有css的情况下 页面也能呈现出很好的内容结构\代码结构.
    更好的 用户体验;如 title alt 等
  • 有利于 SEO 和搜索引擎建立良好的沟通,有助于爬虫抓取更多的有效信息;爬虫依赖于标签来确定上下文和各个关键字的权重;
  • 便于其他设备解析(如屏幕阅读器 盲人阅读器等)以意义的方式来渲染网页;
  • 便于团队开发和维护 语义化更具可读性 遵循W3C标准 可以有效减少差异化.
9.HTML5的离线储存怎么使用及工作原理?

离线存储通过创建 cache manifest 文件,可以创建web应用的离线版本.即 新建一个 .appcache 文件,通过这个文件上的 解析清单 离线存储资源,这些资源就会被存储下来.

<!DOCTYPE HTML>
<html manifest="demo.appcache">

<body>
The content of the document......
</body>

</html>

Manifest文件

CACHE MANIFEST
# 需要缓存的文件,无论在线与否,均从缓存里读取
CACHE:
chched.js
cached.css

# 不缓存的文件,无论缓存中存在与否,均从新获取
NETWORK:
uncached.js
uncached.css

# 获取不到资源时的备选路径,如index.html访问失败,则返回404页面
FALLBACK:
index.html 404.html
  • 在线的情况下,浏览器发现html头部有manifest属性,会请求manifest文件,如果是第一次访问应用,浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过应用并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。
  • 离线的情况下,浏览器就直接使用离线存储的资源。
10.请描述一下 cookies,sessionStorage 和 localStorage 的区别?
  • cookie 是网站为了标识用户身份而存储在用户本地(浏览器/或其他终端)的数据,cookie数据始终在同源的http请求中携带.(在用户终端和服务器之间来回传递),可以设置cookie失效时间,有效时间内数据持久保存;
  • localStorage 存储在用户本地终端的持久数据 不会自动传递给服务器,仅在本地保存.浏览器关闭数据不丢失
  • sessionStorage 和localStorage 一样区别在于它是非持久数据 浏览器关闭自动删除;
10.iframe有那些缺点?
  • 对网页性能有影响(样式脚本需要额外链入 增加http请求)
  • 不利于SEO
  • 阻塞页面加载
  • 对老式浏览器不友好(老式浏览器连接数限制)
11.Label的作用是什么?是怎么用的?

label元素不会向用户成仙任何特殊效果,不过,他为鼠标用户改进了可用性.如果在label元素内点击文本,就会触发此控件;就是说当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上.

<form>
  <label for="male">Male</label>
  <input type="radio" name="sex" id="male" />
</form>
12.HTML5的form如何关闭自动完成功能?

设置form / inputautocomplete属性为: on /off

13.如何实现浏览器内多个标签页之间的通信?
14.webSocket如何兼容低浏览器?
15.页面可见性(Page Visibility API) 可以有哪些用途?
16.如何在页面上实现一个圆形的可点击区域?
17.实现不使用 border 画出1px高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果.
18.网页验证码是干嘛的,是为了解决什么安全问题.
19.title与h1的区别、b与strong的区别、i与em的区别?
20.如何实现浏览器内多个标签页之间的通信?

CSS

1.介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?
2.CSS选择符有哪些?哪些属性可以继承?
3.CSS优先级算法如何计算?
4.CSS3新增伪类有那些?
5.如何居中div?
6.display有哪些值?说明他们的作用。
7.position的值relative和absolute定位原点是?
8.CSS3有哪些新特性?
9.请解释一下CSS3的Flexbox(弹性盒布局模型),以及适用场景?
10.用纯CSS创建一个三角形的原理是什么?
11.一个满屏 品 字布局 如何设计?
12.css多列等高如何实现?
13.经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧 ?
14.li与li之间有看不见的空白间隔是什么原因引起的?有什么解决办法?
15.为什么要初始化CSS样式。
16.absolute的containing block(容器块)计算方式跟正常流有什么不同?
17.CSS里的visibility属性有个collapse属性值是干嘛用的?在不同浏览器下以后什么区别?
18.position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?
19.对BFC规范(块级格式化上下文:block formatting context)的理解?
20.css定义的权重
21.请解释一下为什么需要清除浮动?清除浮动的方式
22.什么是外边距合并?
23.zoom:1的清除浮动原理?
24.移动端的布局用过媒体查询吗?
25.使用 CSS 预处理器吗?喜欢那个?
26.CSS优化、提高性能的方法有哪些?
27.浏览器是怎样解析CSS选择器的?
28.在网页中的应该使用奇数还是偶数的字体?为什么呢?
29.margin和padding分别适合什么场景使用?
30.抽离样式模块怎么写,说出思路?
31.元素竖向的百分比设定是相对于容器的高度吗?
32.全屏滚动的原理是什么?用到了CSS的那些属性?
33.什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?
34.视差滚动效果,如何给每页做不同的动画?(回到顶部,向下滑动要再次出现,和只出现一次分别怎么做?)
35.::before 和 :after中双冒号和单冒号 有什么区别?解释一下这2个伪元素的作用。
36.如何修改chrome记住密码后自动填充表单的黄色背景 ?
37.你对line-height是如何理解的?
38.设置元素浮动后,该元素的display值是多少?
39.怎么让Chrome支持小于12px 的文字?
40.让页面里的字体变清晰,变细用CSS怎么做?
41.font-style属性可以让它赋值为“oblique” oblique是什么意思?
42.position:fixed;在android下无效怎么处理?
43.如果需要手动写动画,你认为最小时间间隔是多久,为什么?
44.display:inline-block 什么时候会显示间隙?
45.overflow: scroll时不能平滑滚动的问题怎么处理?
46.有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度。
47.png、jpg、gif 这些图片格式解释一下,分别什么时候用。有没有了解过webp?
48.什么是Cookie 隔离?(或者说:请求资源的时候不要让它带cookie怎么做)
49.style标签写在body后与body前有什么区别?
50.什么是CSS 预处理器 / 后处理器?

JavaScript

1.介绍js的基本数据类型。

最新的ECMAScript标准定义了7种数据类型:

  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • Symbol(ECMAScript 6 新定义)
  • Object
2.介绍js有哪些内置对象?

了解 JavaScript 中的内置对象
内置对象狠多 常用的如 Array.length Date.getDate getDay getHours.. String.charAt indexOf match replace ...
Boolean.toString valueOf

3.说几条写JavaScript的基本规范?
  • 减少全局污染
  • 遍历DOM时 存储为变量,避免重复获取
  • 构造函数首字母大写
  • switch 语句必须有default分支
  • === 取代 ==
  • 常量使用大写字母
  • 私有属性、变量和方法以下划线 _开头。
  • .....
4.JavaScript原型,原型链 ? 有什么特点?
5.JavaScript有几种类型的值?,你能画一下他们的内存图吗?
6.如何将字符串转化为数字,例如'12.3b'?
7.如何将浮点数点左边的数每三位添加一个逗号,如12000000.11转化为『12,000,000.11』?
8.如何实现数组的随机排序?
9.Javascript如何实现继承?
10.JavaScript继承的几种实现方式?
11.javascript创建对象的几种方式?
12.Javascript作用链域?
13.谈谈This对象的理解。
14.this总是指向函数的直接调用者(而非间接调用者);
15.如果有new关键字,this指向new出来的那个对象;
16.在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window;
17.eval是做什么的?
18.什么是window对象? 什么是document对象?
19.null,undefined 的区别?
20.写一个通用的事件侦听器函数。
21.["1", "2", "3"].map(parseInt) 答案是多少?
22.事件是?IE与火狐的事件机制有什么区别? 如何阻止冒泡?
23.什么是闭包(closure),为什么要用它?
24.javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?
25.如何判断一个对象是否属于某个类?
26.new操作符具体干了什么呢?
27.用原生JavaScript的实现过什么功能吗?
28.Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
29.JSON 的了解?
30. 解释一下这段代码的意思
[].forEach.call(
  $$("*"),
  function(a){
    a.style.outline="1px solid #"+(~~(Math.random()* (1<<24))).toString(16)
  }
)
31.js延迟加载的方式有哪些?
32.Ajax 是什么? 如何创建一个Ajax?
33.Ajax 解决浏览器缓存问题?
34.同步和异步的区别?
35.如何解决跨域问题?
36.页面编码和被请求的资源编码如果不一致如何处理?
37.模块化开发怎么做?
38.AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?
39.requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何 缓存的?)
40.JS模块加载器的轮子怎么造,也就是如何实现一个模块加载器?
41.谈一谈你对ECMAScript6的了解?
42.ECMAScript6 怎么写class么,为什么会出现class这种东西?
43.异步加载JS的方式有哪些?
44.documen.write和 innerHTML的区别
45.DOM操作——怎样添加、移除、移动、复制、创建和查找节点?
46. .call() 和 .apply() 的区别?
47.数组和对象有哪些原生方法,列举一下?
48.JS 怎么实现一个类。怎么实例化这个类
49.JavaScript中的作用域与变量声明提升?
50.如何编写高性能的Javascript?
51.那些操作会造成内存泄漏?
52.JQuery的源码看过吗?能不能简单概况一下它的实现原理?
53.jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?
54.jquery中如何将数组转化为json字符串,然后再转化回来?
55.jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?
56.jquery.extend 与 jquery.fn.extend的区别?
57.jQuery 的队列是如何实现的?队列可以用在哪些地方?
58.JQuery一个对象可以同时绑定多个事件,这是如何实现的?
59.是否知道自定义事件。jQuery里的fire函数是什么意思,什么时候用?
60.jQuery 是通过哪个方法和 Sizzle 选择器结合的?(jQuery.fn.find()进入Sizzle)
61.针对 jQuery性能的优化方法?
62.Jquery与jQuery UI 有啥区别?
63.JQuery的源码看过吗?能不能简单说一下它的实现原理?
64.jquery 中如何将数组转化为json字符串,然后再转化回来?
65.jQuery和Zepto的区别?各自的使用场景?
66.针对 jQuery 的优化方法?
67.Zepto的点透问题如何解决?
68.jQueryUI如何自定义组件?
69.需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案?
70.如何判断当前脚本运行在浏览器还是node环境中?
71.移动端最小触控区域是多大?
72.jQuery 的 slideUp动画 ,如果目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行,该如何处理呢?
73.把 Script 标签 放在页面的最底部的body封闭之前 和封闭之后有什么区别?浏览器会如何解析它们?
74.移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时?(click 有 300ms 延迟,为了实现safari的双击事件的设计,浏览器要知道你是不是要双击操作。)
75.知道各种JS框架(Angular, Backbone, Ember, React, Meteor, Knockout...)么? 能讲出他们各自的优点和缺点么?
76.Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法?
77.解释JavaScript中的作用域与变量声明提升?
78.那些操作会造成内存泄漏?
79.JQuery一个对象可以同时绑定多个事件,这是如何实现的?
80.Node.js的适用场景?
81.(如果会用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么?
82.解释一下 Backbone 的 MVC 实现方式?
83.什么是“前端路由”?什么时候适合使用“前端路由”? “前端路由”有哪些优点和缺点?
84.知道什么是webkit么? 知道怎么用浏览器的各种工具来调试和debug代码么?
85.如何测试前端代码么? 知道BDD, TDD, Unit Test么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
86.前端templating(Mustache, underscore, handlebars)是干嘛的, 怎么用?
87.简述一下 Handlebars 的基本用法?
88.简述一下 Handlerbars 的对模板的基本处理流程, 如何编译的?如何缓存的?
89.用js实现千位分隔符?(来源:前端农民工,提示:正则+replace)
90.检测浏览器版本版本有哪些方式?
91.What is a Polyfill?
92.做的项目中,有没有用过或自己实现一些 polyfill 方案(兼容性处理方案)?
93.我们给一个dom同时绑定两个点击事件,一个用捕获,一个用冒泡。会执行几次事件,会先执行冒泡还是捕获?
94.使用JS实现获取文件扩展名?

ECMAScript6 相关(待补充)

1.Object.is() 与原来的比较操作符“ ===”、“ ==”的区别?
2.(待补充)
3.(待补充)

React相关

1.react-router 路由系统的实现原理?
2.React中如何解决第三方类库的问题?
3.调用 setState 之后发生了什么?
4.React 中 Element 与 Component 的区别是?
5.在什么情况下你会优先选择使用 Class Component 而不是 Functional Component?
6.React 中 refs 的作用是什么?
7.React 中 keys 的作用是什么?
8.如果你创建了类似于下面的Twitter元素,那么它相关的类定义是啥样子的?
9.Controlled Component 与 Uncontrolled Component 之间的区别是什么?
10.在生命周期中的哪一步你应该发起 AJAX 请求?
11.shouldComponentUpdate 的作用是啥以及为何它这么重要?
12.如何告诉 React 它应该编译生产环境版本?
13.为什么我们需要使用 React 提供的 Children API 而不是 JavaScript 的 map?
14.概述下 React 中的事件处理逻辑
15.createElement 与 cloneElement 的区别是什么?
16.传入 setState 函数的第二个参数的作用是什么?
17.下述代码有错吗?
this.setState((prevState, props) => {
  return {
    streak: prevState.streak + props.count
  }
})
18.React 组件生命周期.

组件的生命周期可以分为三个状态:

  1. Mounting:已插入真实DOM;
  2. Updating:正在被重新渲染;
  3. Unmounting:已移除真实DOM;

生命周期的方法有:

  • componentWillMount 在渲染之前调用(客户端/服务端)
  • componentDidMount 在第一次渲染后调用,只在服务端.之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问.如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout(),setInterval()或者发送Ajax请求等操作(防止异步操作阻塞UI).
  • componentWillReceiveProps 在组件接收到一个新的prop时被调用.这个方法在初始render 时不会被调用.
  • shouldComponentupdate 返回一个布尔值,在组件接收到新的props或者state时被调用.在初始化或者使用forceUpdata时不被调用.
  • componentWillUpdate 在组件接收到新的props或者state但是还没有render时被调用.初始化时不被调用.
  • componentDidUpdate 在组件完成更新后立即被调用.初始化时不被调用;
  • componentWillUnmount 在组件从被DOM中移除时立即被调用;

其他问题

1.原来公司工作流程是怎么样的,如何与其他人协作的?如何跨部门合作的?
2.你遇到过比较难的技术问题是?你是如何解决的?
3.设计模式 知道什么是singleton, factory, strategy, decrator么?
4.常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?
5.页面重构怎么操作?
6.列举IE与其他浏览器不一样的特性?
7.什么叫优雅降级和渐进增强?
8.是否了解公钥加密和私钥加密。
9.WEB应用从服务器主动推送Data到客户端有那些方式?
10.对Node的优点和缺点提出了自己的看法?
11.你有用过哪些前端性能优化的方法?
12.http状态码有那些?分别代表是什么意思?
13.一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)
14.部分地区用户反应网站很卡,请问有哪些可能性的原因,以及解决方法?
15.从打开app到刷新出内容,整个过程中都发生了什么,如果感觉慢,怎么定位问题,怎么解决?
16.除了前端以外还了解什么其它技术么?你最最厉害的技能是什么?
17.你用的得心应手用的熟练地编辑器&开发环境是什么样子?
18.对前端工程师这个职位是怎么样理解的?它的前景会怎么样?
19.你怎么看待Web App 、hybrid App、Native App?
20.你移动端前端开发的理解?(和 Web 前端开发的主要区别是什么?)
21.你对加班的看法?
22.平时如何管理你的项目?
23.如何设计突发大规模并发架构?
24.当团队人手不足,把功能代码写完已经需要加班的情况下,你会做前端代码的测试吗?
25.说说最近最流行的一些东西吧?常去哪些网站?
26.知道什么是SEO并且怎么优化么? 知道各种meta data的含义么?
27.移动端(Android IOS)怎么做好用户体验?
28.你在现在的团队处于什么样的角色,起到了什么明显的作用?
29.简单描述一下你做过的移动APP项目研发流程?
30.你在现在的团队处于什么样的角色,起到了什么明显的作用?
31.你认为怎样才是全端工程师(Full Stack developer)?
32.介绍一个你最得意的作品吧?
33.你有自己的技术博客吗,用了哪些技术?
34.对前端安全有什么看法?
35.是否了解Web注入攻击,说下原理,最常见的两种攻击(XSS 和 CSRF)了解到什么程度?
36.项目中遇到国哪些印象深刻的技术难题,具体是什么问题,怎么解决?
37.最近在学什么东西?能谈谈你未来3,5年给自己的规划吗?
38.你的优点是什么?缺点是什么?
39.如何管理前端团队?

以下:
原文:https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95
译者:@lizheming

1. 你能列举出两个 JS 应用开发的编程范式吗?

JS 是一种多范式的语言,通过 OOP (面向对象编程)和 函数式编程 其支持 命令式/过程式 编程。JS 通过 原型链继承 方式支持 OOP.

加分点:
原型链继承(或:属性,对象链接对象即 OLOO)。
函数式编程(或:闭包,头等函数,lambdas)。

扣分点:
不知道编程范式是什么,回答中没有提及到原型链面向对象对象或函数式编程。

2. 什么是函数式编程?

函数式编程通过构造各种运算函数来组织程序,尽量避免在代码间共享状态和变量数据。Lisp(1958年指定)深受 lambda 运算表达式的启发,是最早支持函数式编程的语言。直到如今 Lisp 和它的衍生语言仍在普遍使用。
函数式编程是JavaScript的一个基本概念(JavaScript的两大支柱之一)。ES5 中增加了一些常用的函数功能组件。

加分点:
纯函数。
避免除了输出之外的副作用。

简单的函数组合。
函数式编程语言列举:Lisp, ML, Haskell, Erlang, Clojure, Elm, F#, OCaml 等。
函数式编程的特征:头等函数,高阶函数,函数可做为参数和变量值。

扣分点:
没有提及纯函数或避免函数副作用。
无法列举出函数式编程的语言。
无法列举出函数式编程的特点。

3. 类继承和原型链继承的区别是什么?

类继承:通过类进行实例化继承,类的实例化一般是通过对构造函数使用 new
关键字来生成的,在 ES6 中也可以使用 Class
关键词来声明类。
原型链继承:通过其他对象直接进行实例化继承,实例化一般通过工厂函数或者是 Object.create()
函数。实例可以由多个不同的对象组成,也可以非常方便的选择继承对象。

在 JavaScript 中,原型链的继承要比类继承更简单易用。

加分点:
Classes: create tight coupling or hierarchies/taxonomies.
Prototypes: mentions of concatenative inheritance, prototype delegation, functional inheritance, object composition.

扣分点:

没有提及原型链相对于类继承和示例化的好处。

4. 函数式编程和面对对象编程之间的优缺点是什么?

OOP 优点:非常容易理解对象的基本概念,也非常容易解释各成员函数,OOP相比非常容易阅读的声明式编程而言,更倾向于命令式编程。
OOP 缺点:###### 1. 你能列举出两个 JS 应用开发的编程范式吗?
JS 是一种多范式的语言,通过 OOP (面向对象编程)和 函数式编程 其支持 命令式/过程式 编程。JS 通过 原型链继承 方式支持 OOP。
加分点:
原型链继承(或:属性,对象链接对象即 OLOO)。

函数式编程(或:闭包,头等函数,lambdas)。

扣分点:
不知道编程范式是什么,回答中没有提及到原型链面向对象对象或函数式编程。

5. 什么合适的时机去使用类继承?

这是一个欺骗性的问题,答案是永远不要用。我花了很多年去得到这个答案,但是我听到的答案总是一些常见的误解,更多的是没有答案。
“ 如果一个功能有时有用,有时危险,如果有更好的选项,那就一直*用这个更好的选项。—— Douglas Crockford

扣分点:
其他回答
“React 组件” ——不,类继承的陷阱不会因为一个新框架而改变,哪怕有 class
的关键字,和普通的看法不同,你不需要在 React 中使用 class
,这个回答表示了对 class
和 React 的误解

6. 什么合适的时机去使用原型基础

有好几种原型继承:
委托(比如原型链)
拼接(比如 mixing、Object.assign()

函数化(不要和函数式混淆,一个使用闭包的函数可以保护私有状态或者封装)

每一种原型继承都有自己的一套用例,但是都能够使用各自的能力去实现诸如 has-a 、uses-a 或者 can-do 关系,相对类继承的 is-a 关系。

加分点:
模块和函数式编程无法提供一个明显的解决方案的情况
当你需要从多个资源组合对象
任何你需要继承的时机

扣分点:
对合适使用原型继承没有认知
对 mixins 或者 Object.assign()
有任何了解

7. “优先使用对象组合而不是类继承” 是什么意思?

这是从 “Design Patterns: Elements of Reusable Object-Oriented Software” 的引用,这意味着应该使用更小的函数型单元来复用新的对象,而不是从类里面继承来创建新的分类。 也就是说,用 can-do, has-a, uses-a 关系来代替 is-a 关系。

加分点:
避免类层次结构
避免脆弱的基类的问题
避免紧密解耦
避免严格分类(强制 is-a 关系最终会在新用里中报错)
避免大猩猩香蕉问题(你只想要一只香蕉,但是你得到一个拿着香蕉的大猩猩和整片丛林
让代码更加灵活

扣分点:
没有提到上面的任何问题
没有明确指出组合和类继承之间的区别,或者组合的优点

8. 什么是双向绑定和单项数据流,他们之间有什么区别?

双向绑定是说 UI 模型和数据模型绑定,当界面发生变化的时候,数据模型也会跟着变化,反之亦然。 单向数据流是数据模型是唯一资源,改变界面只会触发消息通知把用户意图发送给数据模型(类似 React 中的 “store”),只有数据模型才能去改变应用的状态,这样就保证数据永远朝一个方向流动,能够让代码非常容易理解。
单向数据流是确定的,然而双向数据绑定会有副作用让数据流难以琢磨和跟踪。

加分点:
React 是一个在单向数据流方向的新权威例子,所以提到 React 也是一个好的信号,Cycle.js 是另一个比较流行的单向数据流的实现。
Angular 是一个使用双向数据流的流行框架

扣分点:
不知道这两者的意思,不能很好解释两者的区别。OOP通常依赖于同享的状态,很多对象和行为通常会争夺同一个类似可能不确定顺序的随机被一些函数存储的资源,竞争可能会造成不可预计的后果。

9. 整体架构和微服务架构的优缺点

整体架构是指你的应用里的代码是使用一个精密结合的单元,所有组件使用同一个内存空间和资源来共同工作。微服务架构是指你的应用由很多小而独立的应用块组成,他们跑在各自的内存空间里,彼此之间能够各自扩展甚至能够跨机器。
整体架构优点:整体架构的主要优势在于大多数的应用需要关注很多点,比如日志,速度限制,甚至一些诸如审查跟踪和 DOS 保护之类的安全功能。
当一切通过同一个应用运行起来的时候,这样能够轻松把所有组件连接起来。
这样同时也有性能优势,因为共享内存要比跨内存通信快。
整体架构缺点:整体架构的代码一般是紧耦合,在版本迭代的时候非常困难,如果想让服务独立扩展或者提高代码可维护性会变得非常困难。整体架构会变得越来越难理解,当你关注服务细节或者控制器细节的时候,会有一些看不到的依赖、副作用及不可思议的问题。
微服务架构优点:微服务架构通常更容易组织,而且每个部分有各自的功能,不会去关心其他组件的功能。解耦服务也非常容易重构和重新配置来为不同的应用提供服务。(比如同时提供网页客户端和开放 API 的服务)
只要组织的合理,也会有比较好的性能,因为能够支持服务热插拔来支持应用剩余的部分。
微服务架构缺点:当你在构建一个新的微服务架构的时候,可能会在设计阶段发现很多组件之间的通讯需要关心,但是在整体架构中可以一些共享的函数或者中间件非常轻松去处理跨组件通讯。
在微服务架构中,你需要去承担隔离组件之间通讯的开销,或者封装起来到另一个服务层中来让所有的组件能够使用。
最终,虽然整体架构能够通过外层服务层来保证所有组件的通讯,但是整体架构可能会把这个工作的开销拖延到哪怕项目变得越来越成熟。
微服务架构通常会部署在各自的虚拟机或者容器中,能够通过快速管理工具自动化完成任务。

加分点:
对微服务抱有倾向态度,尽管相比整体架构刚开始有比较大的开销。认识到微服务架构能够越来越容易扩展。
实际关于微服务架构 vs 整体架构的应用,组成的应用中的服务在代码层对彼此之间独立,但是在开始的时候整体架构能够把他们都捆绑起来,微服务架构能够把过高的开销延后到直到项目越发成熟。

扣分点:
两者架构没有认知
对微服务的开销没有认知或者不切实际的想法
对于跨进程通讯和跨网络通讯的开销没有认知
对微服务的缺点太过消极,不能明确表达如何如何解耦整体架构来轻松分割进微服务架构的时候。
低估了微服务架构的扩展优势。

10. 什么是异步编程?为什么在 JavaScript 中这么重要?

同步编程是指,除了条件语句和函数回调,代码会从上至下依次执行,会被类似网络请求或者磁盘读写这样长时间运行的任务堵塞。
异步编程意味着引擎运行在一个事件循环中,当需要做一些会堵塞的操作,就发一个请求,代码会继续运行而不堵塞,当响应准备好的时候,中断就会被触发,然后调起一个控制流的事件回调去运行,这样一来,一段简单的程序能够并发执行很多操作。
用户界面天生异步,需要等待用户输入来中断事件循环然后触发事件回调。Node 是默认异步的,意味着服务也是同一种方式,循环等待网络请求,当第一个请求在处理的同时还要接受更多请求。
这在 JavaScript 中非常重要,因为他非常适合编写用户界面代码,在服务端也非常高效。

加分点:
知道什么是阻塞,以及性能的意义
知道事件回调,以及为什么对界面代码的重要性

扣分点:
对同步和异步的概念不熟悉
不能表达性能影响以及异步代码和界面代码和异步的关系

前端学习网站推荐

  1. 极客标签:http://www.gbtags.com/
  2. 码农周刊:http://weekly.manong.io/issues/
  3. 前端周刊:http://www.feweekly.com/issues
  4. 慕课网:http://www.imooc.com/
  5. div io:http://div.io
  6. Hacker News:https://news.ycombinator.com/news
  7. InfoQ:http://www.infoq.com/
  8. w3cplus: http://www.w3cplus.com/
  9. Stack Overflow:http://stackoverflow.com/
  10. w3school:http://www.w3school.com.cn/
  11. mozilla:https://developer.mozilla.org/zhCN/docs/Web/JavaScript

文档推荐

1.jQuery 基本原理
2.JavaScript 秘密花园
3.CSS参考手册
4.JavaScript 标准参考教程
5.ECMAScript 6入门

相关文章

网友评论

      本文标题:前端面试题

      本文链接:https://www.haomeiwen.com/subject/ttlupxtx.html