前言
“我前几天在旧金山参加了Free Code Camp 的见面会(meetup ),(给不熟悉的同学们介绍一下,Free Code Camp是一个供人们聚在一起学习JavaScript一类的web开发的组织),有几位朋友正在应聘前端工程师,他们在准备关于JavaScript的前端面试题。搜索了google之后我并没有找到合适的知识点清单,一个能让她“看懂了就能过面试”的万金油清单。找到了下面这些清单:
有 的 凑 合,有 的 好蠢。
它们中要么不完整,要么只写了一些真实面试中不会问的问题。
所以呢,基于我面试别人和被别人面试的经验,我将整理一份清单。我面别人也好别人面我也好,都有一些总会被提及的问题。要记住,有些公司(比如Google)更加关注你是否可以做出高效的算法设计,所以如果你想去那儿工作,除了我下面列出的问题外,你还需要多加练习past CodeJam problems 。如果你对我下面给出的清单内容有疑问(或者是我某些地方写错了),请邮件联系我。”
前端开发所需掌握知识点概要:
HTML&CSS:
对Web标准的理解(结构、表现、行为)、浏览器内核、渲染原理、依赖管理、兼容性、CSS语法、层次关系,常用属性、布局、选择器、权重、盒模型、
Hack、CSS预处理器、CSS3、Flexbox、CSS Modules、Document flow、BFC、HTML5(离线 & 存储、Histoy,多媒体、WebGL\SVG\Canvas);
JavaScript:
数据类型、运算、对象、Function、继承、闭包、作用域、事件、Prototype、RegExp、JSON、Ajax、DOM、BOM、
内存泄漏、跨域、异步请求、模板引擎、模块化、Flux、同构、算法、ECMAScript6、Nodejs、HTTP、
其他:
主流MVVM框架(React\Vue\Angular)、Hybrid App\React Native\Weex、TypeScript、RESTFul、WEB安全、前端工程化、依赖管理、性能优化、
重构、团队协作、可维护、易用性、SEO、UED、前端技术选型、快速学习能力等;
- 作为一名前端工程师,无论工作年头长短都应该掌握的知识点:
-
此条由 王子墨 发表在 攻城师的实验室
-
1、DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动。 2、DOM操作 —— 如何添加、移除、移动、复制、创建和查找节点等。 3、事件 —— 如何使用事件,以及IE和标准DOM事件模型之间存在的差别。 4、XMLHttpRequest —— 这是什么、怎样完整地执行一次GET请求、怎样检测错误。 5、严格模式与混杂模式 —— 如何触发这两种模式,区分它们有何意义。 6、盒模型 —— 外边距、内边距和边框之间的关系,及IE8以下版本的浏览器中的盒模型 7、块级元素与行内元素 —— 怎么用CSS控制它们、以及如何合理的使用它们 8、浮动元素 —— 怎么使用它们、它们有什么问题以及怎么解决这些问题。 9、HTML与XHTML —— 二者有什么区别,你觉得应该使用哪一个并说出理由。 10、JSON —— 作用、用途、设计结构。
-
我会在这里添加或是更新这些问题的答案(欢迎你提出有建设性的需求!)
-
我将问题分为以下几个大类:
- 概念
- 编码
- 改错
- 系统设计
概念
请用清晰准确的语句解释如下名词(不需要编码):
- 什么是“大O”符号,它被用来表示什么?
- 什么是DOM?
- 什么是时间循环?
- 什么是闭包?
- 原型继承是怎样的,如何工作,它和普通的继承有什么区别?(这个问题没啥意义,但很多面试官都爱问)
this
如何工作,代表什么?- 什么是事件冒泡,它是如何工作的?(这也不是个好问题,同样的很多面试官很喜欢问。)
- 描述几种服务器和客户端之间的通信方式。描述一些网络协议是工作的(IP、TCP、http/S/2、UDP、RTC、DNS等)
- REST是什么, 为什么使用它?
- 网页加载的很慢,诊断原因且修复它。如何进行性能优化,什么时候应该进行性能优化?
- 你用过什么前端框架?它们各有什么优缺点?为什么我们要使用框架?框架能为我们解决什么问题?
-
HTML
-
Doctype作用?标准模式与兼容模式各有什么区别?
1. <!DOCTYPE>声明位于HTML文档中的第一行,处于 <html> 标签之前。告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。 2. 标准模式的排版 和JS运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。
-
-
HTML5 为什么只需要写
<!DOCTYPE HTML>
?HTML5 不基于 SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运行); 而HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型。
-
-
行内元素有哪些?块级元素有哪些? 空(void)元素有那些?
首先:CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,如div的display默认值为“block”,则为“块级”元素;span默认display属性值为“inline”,是“行内”元素。 (1)行内元素有:a b span img input select strong(强调的语气) (2)块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p (3)常见的空元素: <br> <hr> <img> <input> <link> <meta> 鲜为人知的是: <area> <base> <col> <command> <embed> <keygen> <param> <source> <track> <wbr> 不同浏览器(版本)、HTML4(5)、CSS2等实际略有差异 参考: http://stackoverflow.com/questions/6867254/browsers-default-css-for-html-elements
-
页面导入样式时,使用link和@import有什么区别?
(1)link属于XHTML标签,除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS; (2)页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载; (3)import是CSS2.1 提出的,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题; (4)link支持使用js控制DOM去改变样式,而@import不支持;
-
介绍一下你对浏览器内核的理解?
主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。 渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。 JS引擎则:解析和执行javascript来实现网页的动态效果。 最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎。
-
常见的浏览器内核有哪些?
Trident内核:IE,MaxThon,TT,The World,360,搜狗浏览器等。[又称MSHTML] Gecko内核:Netscape6及以上版本,FF,MozillaSuite/SeaMonkey等 Presto内核:Opera7及以上。 [Opera内核原为:Presto,现为:Blink;] Webkit内核:Safari,Chrome等。 [ Chrome的:Blink(WebKit的分支)] 详细文章:[浏览器内核的解析和对比](http://www.cnblogs.com/fullhouse/archive/2011/12/19/2293455.html)
-
html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?
HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。 绘画 canvas; 用于媒介回放的 video 和 audio 元素; 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失; sessionStorage 的数据在浏览器关闭后自动删除; 语意化更好的内容元素,比如 article、footer、header、nav、section; 表单控件,calendar、date、time、email、url、search; 新的技术webworker, websocket, Geolocation; 移除的元素: 纯表现的元素:basefont,big,center,font, s,strike,tt,u; 对可用性产生负面影响的元素:frame,frameset,noframes; * 支持HTML5新标签: IE8/IE7/IE6支持通过document.createElement方法产生的标签, 可以利用这一特性让这些浏览器支持HTML5新标签, 浏览器支持新标签后,还需要添加标签默认的样式。 当然也可以直接使用成熟的框架、比如html5shim; <!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> <![endif]--> * 如何区分HTML5: DOCTYPE声明\新增的结构元素\功能元素
-
简述一下你对HTML语义化的理解?
用正确的标签做正确的事情。 html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析; 即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的; 搜索引擎的爬虫也依赖于HTML标记来确定上下文和各个关键字的权重,利于SEO; 使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。
-
HTML5的离线储存怎么使用,工作原理能不能解释一下?
在用户没有与因特网连接时,可以正常访问站点或应用,在用户与因特网连接时,更新用户机器上的缓存文件。 原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示。 如何使用: 1、页面头部像下面一样加入一个manifest的属性; 2、在cache.manifest文件的编写离线存储的资源; CACHE MANIFEST #v0.11 CACHE: js/app.js css/style.css NETWORK: resourse/logo.png FALLBACK: / /offline.html 3、在离线状态时,操作window.applicationCache进行需求实现。
详细的使用请参考:
-
浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?
在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。 离线的情况下,浏览器就直接使用离线存储的资源。
详细请参考:有趣的HTML5:离线存储
-
请描述一下 cookies,sessionStorage 和 localStorage 的区别?
cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。 cookie数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递。 sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。 存储大小: cookie数据大小不能超过4k。 sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。 有期时间: localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据; sessionStorage 数据在当前浏览器窗口关闭后自动删除。 cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
-
iframe有那些缺点?
*iframe会阻塞主页面的Onload事件; *搜索引擎的检索程序无法解读这种页面,不利于SEO; *iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。 使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript 动态给iframe添加src属性值,这样可以绕开以上两个问题。
-
Label的作用是什么?是怎么用的?
label标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上。 <label for="Name">Number:</label> <input type=“text“name="Name" id="Name"/> <label>Date:<input type="text" name="B"/></label>
-
HTML5的form如何关闭自动完成功能?
给不想要提示的 form 或某个 input 设置为 autocomplete=off。
-
如何实现浏览器内多个标签页之间的通信? (阿里)
WebSocket、SharedWorker; 也可以调用localstorge、cookies等本地存储方式; localstorge另一个浏览上下文里被添加、修改或删除时,它都会触发一个事件, 我们通过监听事件,控制它的值来进行页面信息通信; 注意quirks:Safari 在无痕模式下设置localstorge值时会抛出 QuotaExceededError 的异常;
-
webSocket如何兼容低浏览器?(阿里)
Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基于 multipart 编码发送 XHR 、 基于长轮询的 XHR
-
页面可见性(Page Visibility API) 可以有哪些用途?
通过 visibilityState 的值检测页面当前是否可见,以及打开网页的时间等; 在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放;
-
如何在页面上实现一个圆形的可点击区域?
1、map+area或者svg 2、border-radius 3、纯js实现 需要求一个点在不在圆上简单算法、获取鼠标坐标等等
-
实现不使用 border 画出1px高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果。
<div style="height:1px;overflow:hidden;background:red"></div>
-
网页验证码是干嘛的,是为了解决什么安全问题。
区分用户是计算机还是人的公共全自动程序。可以防止恶意破解密码、刷票、论坛灌水; 有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。
-
title与h1的区别、b与strong的区别、i与em的区别?
title属性没有明确意义只表示是个标题,H1则表示层次明确的标题,对页面信息的抓取也有很大的影响; strong是标明重点内容,有语气加强的含义,使用阅读设备阅读网络时:<strong>会重读,而<B>是展示强调内容。 i内容展示为斜体,em表示强调的文本; Physical Style Elements -- 自然样式标签 b, i, u, s, pre Semantic Style Elements -- 语义样式标签 strong, em, ins, del, code 应该准确使用语义样式标签, 但不能滥用, 如果不能确定时首选使用自然样式标签。
-
CSS
-
介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?
(1)有两种, IE 盒子模型、W3C 盒子模型; (2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border); (3)区 别: IE的content部分把 border 和 padding计算了进去;
-
CSS选择符有哪些?哪些属性可以继承?
* 1.id选择器( # myid) 2.类选择器(.myclassname) 3.标签选择器(div, h1, p) 4.相邻选择器(h1 + p) 5.子选择器(ul > li) 6.后代选择器(li a) 7.通配符选择器( * ) 8.属性选择器(a[rel = "external"]) 9.伪类选择器(a:hover, li:nth-child) * 可继承的样式: font-size font-family color, UL LI DL DD DT; * 不可继承的样式:border padding margin width height ;
-
CSS优先级算法如何计算?
* 优先级就近原则,同权重情况下样式定义最近者为准; * 载入样式以最后载入的定位为准; 优先级为: 同权重: 内联样式表(标签内部)> 嵌入样式表(当前文件中)> 外部样式表(外部文件中)。 !important > id > class > tag important 比 内联优先级高
-
CSS3新增伪类有那些?
举例: p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。 p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。 p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。 p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。 p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。 ::after 在元素之前添加内容,也可以用来做清除浮动。 ::before 在元素之后添加内容 :enabled :disabled 控制表单控件的禁用状态。 :checked 单选框或复选框被选中。
-
如何居中div?
-
水平居中:给div设置一个宽度,然后添加margin:0 auto属性
div{ width:200px; margin:0 auto; }
-
让绝对定位的div居中
div { position: absolute; width: 300px; height: 300px; margin: auto; top: 0; left: 0; bottom: 0; right: 0; background-color: pink; /* 方便看效果 */ }
-
水平垂直居中一
确定容器的宽高 宽500 高 300 的层 设置层的外边距 div { position: relative; /* 相对定位或绝对定位均可 */ width:500px; height:300px; top: 50%; left: 50%; margin: -150px 0 0 -250px; /* 外边距为自身宽高的一半 */ background-color: pink; /* 方便看效果 */ }
-
水平垂直居中二
未知容器的宽高,利用 `transform` 属性 div { position: absolute; /* 相对定位或绝对定位均可 */ width:500px; height:300px; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: pink; /* 方便看效果 */ }
-
水平垂直居中三
利用 flex 布局 实际使用时应考虑兼容性 .container { display: flex; align-items: center; /* 垂直居中 */ justify-content: center; /* 水平居中 */ } .container div { width: 100px; height: 100px; background-color: pink; /* 方便看效果 */ }
-
-
display有哪些值?说明他们的作用。
block 块类型。默认宽度为父元素宽度,可设置宽高,换行显示。 none 元素不显示,并从文档流中移除。 inline 行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。 inline-block 默认宽度为内容宽度,可以设置宽高,同行显示。 list-item 象块类型元素一样显示,并添加样式列表标记。 table 此元素会作为块级表格来显示。 inherit 规定应该从父元素继承 display 属性的值。
-
position的值relative和absolute定位原点是?
absolute 生成绝对定位的元素,相对于值不为 static的第一个父元素进行定位。 fixed (老IE不支持) 生成绝对定位的元素,相对于浏览器窗口进行定位。 relative 生成相对定位的元素,相对于其正常位置进行定位。 static 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right z-index 声明)。 inherit 规定从父元素继承 position 属性的值。
-
CSS3有哪些新特性?
新增各种CSS选择器 (: not(.input):所有 class 不是“input”的节点) 圆角 (border-radius:8px) 多列布局 (multi-column layout) 阴影和反射 (Shadow\Reflect) 文字特效 (text-shadow、) 文字渲染 (Text-decoration) 线性渐变 (gradient) 旋转 (transform) 缩放,定位,倾斜,动画,多背景 例如:transform:\scale(0.85,0.90)\ translate(0px,-30px)\ skew(-9deg,0deg)\Animation:
-
请解释一下CSS3的Flexbox(弹性盒布局模型),以及适用场景?
一个用于页面布局的全新CSS3功能,Flexbox可以把列表放在同一个方向(从上到下排列,从左到右),并让列表能延伸到占用可用的空间。 较为复杂的布局还可以通过嵌套一个伸缩容器(flex container)来实现。 采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。 它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。 常规布局是基于块和内联流方向,而Flex布局是基于flex-flow流可以很方便的用来做局中,能对不同屏幕大小自适应。 在布局上有了比以前更加灵活的空间。 具体:http://www.w3cplus.com/css3/flexbox-basics.html
-
用纯CSS创建一个三角形的原理是什么?
-
一个满屏 品 字布局 如何设计?
-
css多列等高如何实现?
-
经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧 ?
-
li与li之间有看不见的空白间隔是什么原因引起的?有什么解决办法?
-
为什么要初始化CSS样式。
-
absolute的containing block(容器块)计算方式跟正常流有什么不同?
-
CSS里的visibility属性有个collapse属性值是干嘛用的?在不同浏览器下以后什么区别?
对于普通元素visibility:collapse;会将元素完全隐藏,不占据页面布局空间,与display:none;表现相同. 如果目标元素为table,visibility:collapse;将table隐藏,但是会占据页面布局空间. 仅在Firefox下起作用,IE会显示元素,Chrome会将元素隐藏,但是占据空间.
-
position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?
如果元素的display为none,那么元素不被渲染,position,float不起作用,如果元素拥有position:absolute;或者position:fixed;属性那么元素将为绝对定位,float不起作用.如果元素float属性不是none,元素会脱离文档流,根据float属性值来显示.有浮动,绝对定位,inline-block属性的元素,margin不会和垂直方向上的其他元素margin折叠.
-
对BFC规范(块级格式化上下文:block formatting context)的理解?
-
css定义的权重
-
请解释一下为什么需要清除浮动?清除浮动的方式
清除浮动是为了清除使用浮动元素产生的影响。浮动的元素,高度会塌陷,而高度的塌陷使我们页面后面的布局不能正常显示。
-
什么是外边距合并?
-
zoom:1的清除浮动原理?
-
移动端的布局用过媒体查询吗?
假设你现在正用一台显示设备来阅读这篇文章,同时你也想把它投影到屏幕上,或者打印出来, 而显示设备、屏幕投影和打印等这些媒介都有自己的特点,CSS就是为文档提供在不同媒介上展示的适配方法
当媒体查询为真时,相关的样式表或样式规则会按照正常的级联规被应用。 当媒体查询返回假, 标签上带有媒体查询的样式表 仍将被下载 (只不过不会被应用)。
包含了一个媒体类型和至少一个使用 宽度、高度和颜色等媒体属性来限制样式表范围的表达式。 CSS3加入的媒体查询使得无需修改内容便可以使样式应用于某些特定的设备范围。
<style> @media (min-width: 700px) and (orientation: landscape){ .sidebar { display: none; } } </style> -
使用 CSS 预处理器吗?喜欢那个?
-
CSS优化、提高性能的方法有哪些?
-
浏览器是怎样解析CSS选择器的?
-
在网页中的应该使用奇数还是偶数的字体?为什么呢?
-
margin和padding分别适合什么场景使用?
-
抽离样式模块怎么写,说出思路,有无实践经验?[阿里航旅的面试题]
-
元素竖向的百分比设定是相对于容器的高度吗?
-
全屏滚动的原理是什么?用到了CSS的那些属性?
-
什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?
-
视差滚动效果,如何给每页做不同的动画?(回到顶部,向下滑动要再次出现,和只出现一次分别怎么做?)
-
::before 和 :after中双冒号和单冒号 有什么区别?解释一下这2个伪元素的作用。
-
如何修改chrome记住密码后自动填充表单的黄色背景 ?
-
你对line-height是如何理解的?
-
设置元素浮动后,该元素的display值是多少?
-
怎么让Chrome支持小于12px 的文字?
-
让页面里的字体变清晰,变细用CSS怎么做?
-
font-style属性可以让它赋值为“oblique” oblique是什么意思?
-
position:fixed;在android下无效怎么处理?
-
如果需要手动写动画,你认为最小时间间隔是多久,为什么?(阿里)
-
display:inline-block 什么时候会显示间隙?(携程)
-
overflow: scroll时不能平滑滚动的问题怎么处理?
-
有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度。
-
png、jpg、gif 这些图片格式解释一下,分别什么时候用。有没有了解过webp?
-
什么是Cookie 隔离?(或者说:请求资源的时候不要让它带cookie怎么做)
-
style标签写在body后与body前有什么区别?
-
什么是CSS 预处理器 / 后处理器?
-
rem布局的优缺点
-
JavaScript
-
介绍js的基本数据类型。
-
介绍js有哪些内置对象?
-
说几条写JavaScript的基本规范?
-
JavaScript原型,原型链 ? 有什么特点?
-
JavaScript有几种类型的值?,你能画一下他们的内存图吗?
-
如何将字符串转化为数字,例如'12.3b'?
-
如何将浮点数点左边的数每三位添加一个逗号,如12000000.11转化为『12,000,000.11』?
-
如何实现数组的随机排序?
-
Javascript如何实现继承?
-
JavaScript继承的几种实现方式?
-
javascript创建对象的几种方式?
-
Javascript作用链域?
-
谈谈This对象的理解。
-
eval是做什么的?
-
什么是window对象? 什么是document对象?
-
null,undefined 的区别?
参考阅读:undefined与null的区别
-
写一个通用的事件侦听器函数。
-
["1", "2", "3"].map(parseInt) 答案是多少?
-
事件是?IE与火狐的事件机制有什么区别? 如何阻止冒泡?
-
什么是闭包(closure),为什么要用它?
-
javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?
-
如何判断一个对象是否属于某个类?
-
new操作符具体干了什么呢?
-
用原生JavaScript的实现过什么功能吗?
-
Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
-
JSON 的了解?
-
[].forEach.call($$("*"),function(a){a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)})
能解释一下这段代码的意思吗? -
js延迟加载的方式有哪些?
-
Ajax 是什么? 如何创建一个Ajax?
-
Ajax 解决浏览器缓存问题?
-
4、在URL后面加上时间戳:"nowtime=" + new Date().getTime();。
-
同步和异步的区别?
同步的概念应该是来自于OS中关于同步的概念:不同进程为协同完成某项工作而在先后次序上调整(通过阻塞,唤醒等方式).同步强调的是顺序性.谁先谁后.异步则不存在这种顺序性.
同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作。
异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。
(待完善)
-
如何解决跨域问题?
-
页面编码和被请求的资源编码如果不一致如何处理?
-
服务器代理转发时,该如何处理cookie?
-
模块化开发怎么做?
立即执行函数,不暴露私有成员
(待完善)
-
AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?
-
requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何 缓存的?)
-
JS模块加载器的轮子怎么造,也就是如何实现一个模块加载器?
-
谈一谈你对ECMAScript6的了解?
-
ECMAScript6 怎么写class么,为什么会出现class这种东西?
-
异步加载JS的方式有哪些?
-
documen.write和 innerHTML的区别
-
DOM操作——怎样添加、移除、移动、复制、创建和查找节点?
-
.call() 和 .apply() 的区别?
-
数组和对象有哪些原生方法,列举一下?
-
JS 怎么实现一个类。怎么实例化这个类
-
JavaScript中的作用域与变量声明提升?
-
如何编写高性能的Javascript?
-
那些操作会造成内存泄漏?
-
JQuery的源码看过吗?能不能简单概况一下它的实现原理?
-
jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?
-
jquery中如何将数组转化为json字符串,然后再转化回来?
-
jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?
-
jquery.extend 与 jquery.fn.extend的区别?
-
jQuery 的队列是如何实现的?队列可以用在哪些地方?
-
谈一下Jquery中的bind(),live(),delegate(),on()的区别?
-
JQuery一个对象可以同时绑定多个事件,这是如何实现的?
-
是否知道自定义事件。jQuery里的fire函数是什么意思,什么时候用?
-
jQuery 是通过哪个方法和 Sizzle 选择器结合的?(jQuery.fn.find()进入Sizzle)
-
针对 jQuery性能的优化方法?
-
Jquery与jQuery UI 有啥区别?
-
JQuery的源码看过吗?能不能简单说一下它的实现原理?
-
jquery 中如何将数组转化为json字符串,然后再转化回来?
-
jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:
-
jQuery和Zepto的区别?各自的使用场景?
-
针对 jQuery 的优化方法?
-
Zepto的点透问题如何解决?
-
jQueryUI如何自定义组件?
-
需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案?
-
如何判断当前脚本运行在浏览器还是node环境中?(阿里)
-
移动端最小触控区域是多大?
-
jQuery 的 slideUp动画 ,如果目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行,该如何处理呢?
-
把 Script 标签 放在页面的最底部的body封闭之前 和封闭之后有什么区别?浏览器会如何解析它们?
-
移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时?(click 有 300ms 延迟,为了实现safari的双击事件的设计,浏览器要知道你是不是要双击操作。)
-
知道各种JS框架(Angular, Backbone, Ember, React, Meteor, Knockout...)么? 能讲出他们各自的优点和缺点么?
-
Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法?
-
解释JavaScript中的作用域与变量声明提升?
-
那些操作会造成内存泄漏?
-
JQuery一个对象可以同时绑定多个事件,这是如何实现的?
-
Node.js的适用场景?
-
(如果会用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么?
-
解释一下 Backbone 的 MVC 实现方式?
-
什么是“前端路由”?什么时候适合使用“前端路由”? “前端路由”有哪些优点和缺点?
-
知道什么是webkit么? 知道怎么用浏览器的各种工具来调试和debug代码么?
-
如何测试前端代码么? 知道BDD, TDD, Unit Test么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
-
前端templating(Mustache, underscore, handlebars)是干嘛的, 怎么用?
-
简述一下 Handlebars 的基本用法?
-
简述一下 Handlerbars 的对模板的基本处理流程, 如何编译的?如何缓存的?
-
用js实现千位分隔符?(来源:前端农民工,提示:正则+replace)
-
检测浏览器版本版本有哪些方式?
-
What is a Polyfill?
-
做的项目中,有没有用过或自己实现一些 polyfill 方案(兼容性处理方案)?
-
我们给一个dom同时绑定两个点击事件,一个用捕获,一个用冒泡。会执行几次事件,会先执行冒泡还是捕获?
-
使用JS实现获取文件扩展名?
-
Webpack热更新实现原理?
-
请介绍一下JS之事件节流?
-
什么是JS的函数防抖?
-
Object.is() 与原来的比较操作符“ ===”、“ ==”的区别?
-
ES6是如何实现编译成ES5的?
-
css-loader的原理?
-
前端框架
-
React 使用场景?
-
描述一下React 生命周期
-
实现组件有哪些方式?
-
应该在React生命周期的什么阶段发出ajax请求,为什么?
-
shouldComponentUpdate函数有什么作用?
-
当组件的setState函数被调用之后,发生了什么?
-
为什么循环产生的组件中要利用上key这个特殊的prop?
-
React-router 路由的实现原理?
-
说说React Native,Weex框架的实现原理?
-
受控组件(Controlled Component)与非受控组件(Uncontrolled Component)的区别
-
refs 是什么?
-
React为什么自己定义一套事件体系呢,与浏览器原生事件体系有什么关系?
-
什么时候应该选择用class实现一个组件,什么时候用一个函数实现一个组件?
-
什么是HoC(Higher-Order Component)?适用于什么场景?
-
并不是父子关系的组件,如何实现相互的数据通信?
-
用过 React 技术栈中哪些数据流管理库?
-
Redux是如何做到可预测呢?
-
Redux将React组件划分为哪两种?
-
Redux是如何将state注入到React组件上的?
-
请描述一次完整的 Redux 数据流
-
React的批量更新机制 BatchUpdates?
-
React与Vue,各自的组件更新进行对比,它们有哪些区别?
-
其他问题
-
原来公司工作流程是怎么样的,如何与其他人协作的?如何跨部门合作的?
-
你遇到过比较难的技术问题是?你是如何解决的?
-
设计模式 知道什么是singleton, factory, strategy, decrator么?
-
常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?
-
页面重构怎么操作?
-
列举IE与其他浏览器不一样的特性?
-
99%的网站都需要被重构是那本书上写的?
-
什么叫优雅降级和渐进增强?
-
是否了解公钥加密和私钥加密。
-
WEB应用从服务器主动推送Data到客户端有那些方式?
-
对Node的优点和缺点提出了自己的看法?
-
你有用过哪些前端性能优化的方法?
-
http状态码有那些?分别代表是什么意思?
-
一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)
-
部分地区用户反应网站很卡,请问有哪些可能性的原因,以及解决方法?
-
从打开app到刷新出内容,整个过程中都发生了什么,如果感觉慢,怎么定位问题,怎么解决?
-
第一次访问页面中时弹出引导,用户关闭引导,之后再次进入页面时不希望出现引导,如何实现?
-
除了前端以外还了解什么其它技术么?你最最厉害的技能是什么?
-
你用的得心应手用的熟练地编辑器&开发环境是什么样子?
-
对前端工程师这个职位是怎么样理解的?它的前景会怎么样?
-
你怎么看待Web App 、hybrid App、Native App?
-
你移动端前端开发的理解?(和 Web 前端开发的主要区别是什么?)
-
产品进行版本升级时,可能发生不兼容性问题,如何提前预防和解决?
-
你对加班的看法?
-
平时如何管理你的项目?
-
如何设计突发大规模并发架构?
-
当团队人手不足,把功能代码写完已经需要加班的情况下,你会做前端代码的测试吗?
-
说说最近最流行的一些东西吧?常去哪些网站?
-
知道什么是SEO并且怎么优化么? 知道各种meta data的含义么?
-
移动端(Android IOS)怎么做好用户体验?
-
简单描述一下你做过的移动APP项目研发流程?
-
你在现在的团队处于什么样的角色,起到了什么明显的作用?
-
你认为怎样才是全端工程师(Full Stack developer)?
-
介绍一个你最得意的作品吧?
-
你有自己的技术博客吗,用了哪些技术?
-
对前端安全有什么看法?
-
是否了解Web注入攻击,说下原理,最常见的两种攻击(XSS 和 CSRF)了解到什么程度?
-
项目中遇到国哪些印象深刻的技术难题,具体是什么问题,怎么解决?。
-
最近在学什么东西?
-
你的优点是什么?缺点是什么?
-
如何管理前端团队?
-
最近在学什么?能谈谈你未来3,5年给自己的规划吗?
-
编码
实现以下功能:
简单:
isPrime
- 返回true
或false
, 表示输入的数是否为质数:
isPrime(0) // false isPrime(1) // false isPrime(17) // true isPrime(10000000000000) // false
factorial
- 返回给定数的阶乘的值:
factorial(0) // 1 factorial(1) // 1 factorial(6) // 720
fib
-返回斐波那契数列的前n项的和(n为给定) 斐波那契数列.
fib(0) // 0 fib(1) // 1 fib(10) // 55 fib(20) // 6765
isSorted
- 返回true
或false
,表示给定的数组是否被排序过:
isSorted([]) // true isSorted([-Infinity, -5, 0, 3, 9]) // true isSorted([3, 9, -3, 10]) // false
filter
- 实现过滤器功能.
filter([1, 2, 3, 4], n => n < 3) // [1, 2]
reduce
- 实现reduce 函数.
reduce([1, 2, 3, 4], (a, b) => a + b, 0) // 10
reverse
- 反转给定字符串 (用已封装好的 reverse 是一个cheat,要自己实现).
reverse('') // '' reverse('abcdef') // 'fedcba'
indexOf
- 实现数组的 indexOf方法.
indexOf([1, 2, 3], 1) // 0 indexOf([1, 2, 3], 4) // -1
isPalindrome
- 返回true或false判断给定字符串是否是一个回文(palindrome)(大小写不敏感)
isPalindrome('') // true isPalindrome('abcdcba') // true isPalindrome('abcd') // false isPalindrome('A man a plan a canal Panama') // true
missing
- 一个数字1至n不重复且未排序过的数字组成的数组,从数字1至数字n选取出不重复且未排序过的数字组成数组(n为最大的数),调用方法后补全数组里缺失的数字。是否可以设计出时间复杂度为O(n)的算法?提示:有个聪明的方法供你使用。
missing([]) // undefined missing([1, 4, 3]) // 2 missing([2, 3, 4]) // 1 missing([5, 1, 4, 2]) // 3 missing([1, 2, 3, 4]) // undefined
isBalanced
- 用true
或false
表示给定的字符串的花括号是否平衡(一一对应)
isBalanced('}{') // false isBalanced('{{}') // false isBalanced('{}{}') // true isBalanced('foo { bar { baz } boo }') // true isBalanced('foo { bar { baz }') // false isBalanced('foo { bar } }') // false
中级:
fib2
- 实现像上面的fib
函数一样的功能,但是要能够算出数列中前50位以上的数的和。(小提示: 从内存中查询).
fib2(0) // 0 fib2(1) // 1 fib2(10) // 55 fib2(50) // 12586269025
isBalanced2
- 实现同上面的isBalanced
函数相同的功能,但是要支持三种类型的括号{},[],和()。带有交错括号的字符串应该返回false。
isBalanced2('(foo { bar (baz) [boo] })') // true isBalanced2('foo { bar { baz }') // false isBalanced2('foo { (bar [baz] } )') // false
uniq
- 选取一个由数字组成的数组,为其去重,返回去重后的数组。可以实现出时间复杂度为O(n)的算法吗?
uniq([]) // [] uniq([1, 4, 2, 2, 3, 4, 8]) // [1, 4, 2, 3, 8]
intersection
- 算出两个数组的交集(公共部分)。可以实现时间复杂度为O(M+N)(M和N为两个数组的长度)的方法吗?
intersection([1, 5, 4, 2], [8, 91, 4, 1, 3]) // [4, 1] intersection([1, 5, 4, 2], [7, 12]) // []
sort
-实现 sort 方法,用于排序元素为数字的数组, 且时间复杂度为O(N×log(N)).
sort([]) // [] sort([-4, 1, Infinity, 3, 3, 0]) // [-4, 0, 1, 3, 3, Infinity]
includes
- 判断给定的数字是否出现在给定的已排列好的数组中,返回true
或false
。是否能设计出时间复杂度为O(log(N))的算法?
includes([1, 3, 8, 10], 8) // true includes([1, 3, 8, 8, 15], 15) // true includes([1, 3, 8, 10, 15], 9) // false
assignDeep
- 仿照 Object.assign, 但是要深度合并对象。为了简单起见,可以假设对象只包含数字或是什么别的(而不是数组、函数等)。
assignDeep({ a: 1 }, {}) // { a: 1 } assignDeep({ a: 1 }, { a: 2 }) // { a: 2 } assignDeep({ a: 1 }, { a: { b: 2 } }) // { a: { b: 2 } } assignDeep({ a: { b: { c: 1 }}}, { a: { b: { d: 2 }}, e: 3 }) // { a: { b: { c: 1, d: 2 }}, e: 3 }
reduceAsync
- 仿照reduce 你在“简单”部分中完成了,但每个条目都必须在进行下一步之前被解决。
let a = () => Promise.resolve('a') let b = () => Promise.resolve('b') let c = () => new Promise(resolve => setTimeout(() => resolve('c'), 100)) await reduceAsync([a, b, c], (acc, value) => [...acc, value], []) // ['a', 'b', 'c'] await reduceAsync([a, c, b], (acc, value) => [...acc, value], ['d']) // ['d', 'a', 'c', 'b']
- 用
reduceAsync
来实现seq
。seq
使用一个可返回promise
的函数体内使用数组的函数,然后逐一的解决。
let a = () => Promise.resolve('a') let b = () => Promise.resolve('b') let c = () => Promise.resolve('c') await seq([a, b, c]) // ['a', 'b', 'c'] await seq([a, c, b]) // ['a', 'c', 'b']
困难:
注意:下面你要实现的数据结构问题,意不在让你记住它们,而只是希望你去查看给出的API,Google是怎么考虑且实现它们的,然后站在一个较高的角度去思考这些实现和其他数据结构相比如何。
permute
- 返回一个字符串数组,包含给定的字符串的所有的排列。
permute('') // [] permute('abc') // ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
debounce
- 实现 debounce 函数.
let a = () => console.log('foo') let b = debounce(a, 100) b() b() b() // only this call should invoke a()
- 实现一个 LinkedList 类,不用 JavaScript的built-in 数组 ([]). 你的链表需要支持两种方法,
add
和has
。
class LinkedList {...} let list = new LinkedList(1, 2, 3) list.add(4) // undefined list.add(5) // undefined list.has(1) // true list.has(4) // true list.has(6) // false
- 实现一个HashMap 类,不用JavaScript的built-in objects ({}) 方法或者是Maps方法。你需要提供一个
hash()
函数,传入一个字符串,返回一个数字(大多数情况下数字都是唯一的,有时候两个不同的字符串会返回一样的数字):
function hash (string) { return string .split('') .reduce((a, b) => ((a << 5) + a) + b.charCodeAt(0), 5381) }
你有的哈希表需要支持两种方法,
get
和set
:let map = new HashMap map.set('abc', 123) // undefined map.set('foo', 'bar') // undefined map.set('foo', 'baz') // undefined map.get('abc') // 123 map.get('foo') // 'baz' map.get('def') // undefined
- 实现一个BinarySearchTree(二叉搜索树)类,需要支持四种方法:
add
,has
,remove
,size
:
let tree = new BinarySearchTree tree.add(1, 2, 3, 4) tree.add(5) tree.has(2) // true tree.has(5) // true tree.remove(3) // undefined tree.size() // 4
- 实现一个BinaryTree(二叉树)类,广度优先搜索、中序排列、先序排列、后序遍历深度优先搜索功能。
let tree = new BinaryTree let fn = value => console.log(value) tree.add(1, 2, 3, 4) tree.bfs(fn) // undefined tree.inorder(fn) // undefined tree.preorder(fn) // undefined tree.postorder(fn) // undefined
改错
下面的每一个问题,先要弄明白为什么给出的代码块无法正常实现功能,然后想出解决方案,编写代码,正常实现功能:
- 我想要代码打印出:
“hey amy”
,但是它打印的是“hey arnold”
,为什么呢?
function greet(person) { if (person == { name: 'amy' }) { return 'hey amy' } else { return 'hey arnold' } } greet({ name: 'amy' })
2.我希望代码按顺序打印出数字
0,1,2,3
,但是现在并不是这样的输出(这一度被认为是一个小bug,很多人喜欢在面试的时候提问为什么)for (var i = 0; i < 4; i++) { setTimeout(() => console.log(i), 0) }
- 我希望代码打印出
“doggo”
,但是现在打出来是undefined
let dog = { name: 'doggo', sayName() { console.log(this.name) } } let sayName = dog.sayName sayName()
- 我想要我的狗狗
bark()
,但是我得到的确实error
,为什么呢?
function Dog(name) { this.name = name } Dog.bark = function() { console.log(this.name + ' says woof') } let fido = new Dog('fido') fido.bark()
- 为什么这个代码会返回这样结果?
function isBig(thing) { if (thing == 0 || thing == 1 || thing == 2) { return false } return true } isBig(1) // false isBig([2]) // false isBig([3]) // true
系统设计
如果你不是很明白“系统设计”,你可以从这里开始学习。
- 来聊聊看,如果想要做一个完整的自动补全的小程序(widget)。用户可以在其中输入文字,并从服务器得到返回结果。
- 你会如何设计一个支持以下功能的前端页面:
- 从后台API获取数据
- 以树形渲染结果(每个对象可以有父/子,而不是一个平铺的列表)
- 支持
checkbox, radio button, icon
以及普通的列表项-列表项从很多的表单中得到
- 组件API是怎样的?
- 后端API是怎样的?
- 对于补全输入的行为还有什么会影响到性能的事是要额外考虑进去的?是否有一些边缘情况发生(比如如果用户输入速度快,网络速度慢)?
- 若要前端展现更加迅速,你会怎么设计网络部分以及架构后端?你的客户端和服务器是怎样通信的?后端的数据如何存储?当扩展到有大量数据和大量客户时,如何实现这些功能?
- 谈谈如何实现Twitter的全栈构建(从我的朋友Michael Vu那窃来的题目,害羞)。
- 如何获取并渲染每条推特消息?
- 当有新的推文来了你该如何渲染?你如何知道啥时候来了新的推文?
- 你该如何设计搜索推文?如何按作者搜索推文?聊聊你的数据库、后台以及API设计。
更多资料
如果你这些都了解了想要了解更多知识,下面有一些我找到的更高质量的资源也许对你有帮助。
有帮助的项目:
有帮助的书籍:
- The Algorithm Design Manual 算法设计手册
- JavaScript Allonge JavaScript附录
- You Don’t Know JS 你不知道的JavaScript
- Effective JavaScript 高效的JavaScript