[关闭]
@gpzjyw 2016-08-17T08:43:12.000000Z 字数 8802 阅读 415

JavaScript Makeup

Interview Front-End JavaScript


基础

表达式和语句

表达式(expression) 语句(statement)
JavaScript中的短语 JavaScript中的整句或命令
计算出一个值 执行以使某件事发生
逗号分隔 分号分隔

运算符的优先级

MDN文档

JavaScript是一门什么样的语言,它有哪些特点

JavaScript的数据类型都有什么

基本数据类型:String, Boolean, Number, Undefined, Null;
引用数据类型:Object(Array, Date, RegExp, Function);

如何判断这些数据类型?

基本类型:typeof
引用类型:Object.prototype.toString.call( ) = "[object NativeConstructorName]"

严格模式的作用

"use strict";

闭包的原理及应用

闭包是什么

闭包是指有权访问另一个函数作用域中的变量的函数。

闭包的原理,什么情况下会发生闭包

作用域链。

函数的返回值保持着对外部环境变量的引用时。

闭包的应用场景

闭包的优缺点

优点:

缺点:

什么是Ajax和JSON,它们的优缺点

Ajax是异步JavaScript和XML,用于在Web页面中实现异步数据交互。

优点:

缺点:

JSON是一种轻量级的数据交换格式,ECMA的一个子集。

优点:轻量级、易于人的阅读和编写,便于机器(JavaScript)解析,支持复合数据类型(数组、对象、字符串、数字)。

XML(Extentsible Markup Language),可扩展标记语言。XML可以视作对HTML的补充,XML的设计目标是描述数据并集中于数据的内容,HTML的设计目标是显示数据并集中于数据的外观。

XMLHttpRequest对象

Ajax技术的核心,简称XHR。

属性:responseText responseXML status statusText readyState

方法:open setRequestHeader send getRequestHeader

Ajax实现

  1. 创建XMLHttpRequest对象;xhr = new XMLHttpRequest()
  2. 为新建的XMLHttpRequest对象添加回调函数(事件处理程序);xhr.onreadystatechange = function () {...}
  3. 开启异步请求;xhr.open("get/post", "URL", true)
  4. 设置HTTP头部:xhr.setRequestHeader("MyHeader", "MyValue")
  5. 发送请求。xhr.send(null)

Ajax的原理

在用户和服务器之间加了一个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做,只有确定需要从服务器读取新数据时再由 Ajax引擎代为向服务器提交请求。

参考资料

如何检测浏览器对一些js函数的支持情况

定义一个方法,先判断是否存在同名方法:Object.XXXX = Object.XXXX || function(){ ... }

运用能力检测,不用使用window.XXXX或document.XXXX。例如:

if(obj.XXXX) {
  ...
} else {
  ...
}

直接在对象的原型上添加方法是否安全?尤其是在Object对象上

不安全。要尽量避免修改原生对象的原型。当在另一支持该方法的实现中运行代码时,可能会导致命名冲突,也可能会意外的重写原生方法。

函数声明和函数表达式的区别

函数声明:js解析时会首先读取函数声明,使其在执行任何代码之前可用(可以访问);

函数表达式:在js解析到其所在行的时候,该函数才真正被解析执行,在后续代码中才可以被调用。

IIFE的有哪些写法

+function () {...}();:性能最差;

!function () {...}();

(function () {...})();
(function () {...}());

void function () {...}()

具名函数表达式(Named Function Expression)
匿名函数(Anonymous Function)

with关键字的弊端

性能问题:使用了with关键字后,js引擎无法对这段代码进行优化。
语义不明,调试困难。

在web页面做动画有哪几种方法

原生对象(native object)和宿主对象(host object)的区别

原生对象:由ECMAScript定义且不依赖执行环境定义的对象

宿主对象:JavaScript的宿主环境定义的对象,例如浏览器端的windowhistory

特征检测(feature detection)、特征推断(feature inference)、UA(user agent)字符串的区别

特征检测:直接检测某对象或方法是否被定义;

特征推断:根据一对象或方法是否被定义,推测另一对象或方法的是否被定义;

UA字符串:用户端浏览器的详细信息;

JavaScript的错误类型有哪些

JavaScript是怎样定义私有成员的

JavaScript隐式类型转换

参考文章

JavaScript Source Map

参考博客

Source map就是一个信息文件,里面储存着位置信息。

代码发生错误之后,JavaScript的解释器只会告诉我们第几行第几列出错。但压缩后的js只有几行,报错信息无意义。Source map就是用于解决此类问题,方便压缩后代码的调试。

什么是JST

JavaScript前端模板,用于客户端渲染,例如异步加载页面。

模拟)类式继承和原型继承

属性继承:

  1. Child = function (arg1,...,argN) {
  2. Parent.call(this, arg1,...,argN)
  3. }

接口(方法)继承:

  1. Object.create(Parent.prototype)

DOM的attribute和property的区别

参考博客

attribute:

property:

怎么解决IE 6、7、8不支持placeholder的问题

为输入框添加焦点事件

函数参数的可修改性

参考博客

JavaScript的遍历(枚举)操作有哪些

对象属性名:

  1. for (var item in obj) {
  2. // todo...
  3. }
  4. // 会遍历原型链上的键

对象属性值:

  1. // ES6
  2. for (var item of obj) {
  3. // todo...
  4. }

所有可枚举自身属性的属性名组成的数组:Object.keys(obj)

所有自身属性的属性名组成的数组:Object.getOwnPropertyNames(obj)

数组:

  1. // Array.prototype.forEach
  2. [].forEach(function(item, index, array){
  3. // todo...
  4. })

类数组对象

arguments

NodeList

HTMLCollection

进阶

JavaScript模板引擎

根据模板文件,结合数据,运用JavaScript引擎输出HTML界面。

JavaScript事件委托(代理)如何实现

基于事件冒泡原理和事件对象event实现。

优点:

IE下:
添加事件:attachEvent,其中回调函数的this指向window;
触发事件:按事件处理程序添加顺序的相反顺序执行;
event对象:srcElement,cancelBubble(取消冒泡,可读/写),returnValue(默认行为,可读/写);

函数柯里化(Currying)是什么?如何实现

函数柯里化:是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。即固定函数的可预期参数,并返回一个接收余下参数的函数。

  1. var curry = function (func, parameter) {
  2. var slice = Array.prototype.slice,
  3. args = slice.call(arguments, 1);
  4. return function () {
  5. return func.apply(null, args.concat(slice.apply(arguments)));
  6. }
  7. }

CORS

Cross-Origin Resource Sharing,跨域资源共享
Ajax的限制:跨域安全策略,XHR 对象只能访问与包含它的页面位于同一域的资源;

JSONP:利用<script>标签的 src 属性;
Web Sockets:首先发起一个 HTTP 请求,之后从 HTTP 协议升级为 Web Sockets。故 Web Sockets 需要服务器支持

实现一个拖曳功能(思路)

  1. 给需要拖拽的节点绑定mousedown, mousemove, mouseup事件
  2. mousedown事件触发后,开始拖拽
  3. mousemove时,需要通过event.clientX和clientY获取拖拽位置,并实时更新位置
  4. mouseup时,拖拽结束
  5. 需要注意浏览器边界的情况

JavaScript的继承实现

基于原型链实现继承。

继承一个类并添加新的属性(方法)

Object.create()

Promises/Promise

使用Promises而非回调(callbacks)优缺点是什么

代码更少,更优雅,更容易维护。

Promises:提供了一种管理异步操作回调的规范;
Promises/A+规范译文

Promise机制,参考博客.

如何遍历一个对象和数组

对象:for ... in ...,用hasOwnProperty过滤非自身属性;

数组:for 循环,Array.length;

可变(mutable)和不变(immutable)对象的区别

可变对象可以修改属性、删除属性和添加属性,而不可对象均不能。

防篡改对象。

什么是事件循环(event loop)

参考博客

主线程从任务队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。

调用栈(call stack)和任务队列(task queue)的区别

调用栈:同步任务在主线程上执行,形成一个调用栈

任务队列:主线程之外,存在一个任务队列,异步任务有了运行结果,就在任务队里中放置一个事件。主线程从任务队列中读取事件。

调用栈中的代码(同步任务),总是在读取任务队列(异步任务)之前执行。

前端安全

  1. CSRF(Cross-Site Request Forgery,跨站请求伪造):未被授权系统伪装自己,让处理请求的服务器认为它是合法的;

    起因:源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

    常见类型:

    • 使用get请求资源,危险站点通过使用img标签造成攻击;
    • 修改成post请求后,危险站点通过inframe等手段实现攻击;

    防御:

    • 验证码:用户每次提交都需要在表单中填写图片上一个随机的字符串;
    • 添加一个隐藏的输入框:包含token,服务端验证是否匹配;
    • 使用HTTP Referer头部进行判断:如果不是业务域名发起的HTTP请求,直接过滤:
  2. XSS(Cross Site Scripting,跨站脚本攻击)

    恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

Javascript异步编程实现方法

参考博客

Javascript设计模式

参考博客

DOM的增删查改

添加:

删除:

查询:

修改:

DOM遍历

DOM 遍历是基于给定节点为根节点执行深度优先的 DOM 结构遍历。

树的遍历:深度优先,广度优先

函数节流的实现

参考博客

jQuery

jQuery设计思想

jQuery最佳实践

原生JS的window.onload与jQuery的$(document).ready(function(){})有什么不同

window.onload():是必须等到页面内包括图片的所有元素加载完毕后才能执行。

$(document).ready():是DOM结构绘制完毕后就执行,不必等到加载完毕。

load事件与DOMContentLoaded事件
对于不兼容DOMContentLoaded事件,可以设置0ms的超时调用兼容实现:
setTimeout(function () { /*事件处理程序*/ }, 0);

从jQuery中学到了什么

参考博客

jQuery扩展

jQuery.extend:扩展jQuery类本身,为类添加新的方法。作用于每一个实例化的jQuery对象;

jQuery.fn.extend:给jQuery这个对象添加方法;

jQuery如何遍历DOM

遍历方法中最大的种类是树遍历(tree-traversal)。

原生对象

Array.prototype

方法 是否修改原对象 返回值 作用
concat 新数组 连接两个数组
join 字符串 数组中的各个项之间用连接符连接成一个字符串
slice 新数组 取得数组中的某几项
pop 被删除项 删除数组的最后一项
push 数组的长度 往数组的末尾添加一项
reverse 修改后的数组 反转数组
shift 被删除项 删除数组的第一项
unshift 数组的长度 往数组的开头添加若干项
sort 修改后的数组 根据某一规则排序
splice 被删除项组成的数组 删除、插入、替换
every true/false 每项执行给定函数,若都返回true,则返回true,否则flase
some true/false 每项执行给定函数,若任一项返回true,则返回true,否则flase
filter 满足条件项组成的数组 每项执行给定函数,由返回true的项组成新数组
map 调用结果组成的数组 每项执行给定函数,由返回结果项组成新数组
forEach 每项执行给定函数
ruduce 归并结果 归并方法
reduceRight 归并结果 归并方法

Object

MDN

Object.assign(target, ...sources):将 sources 自身的可枚举属性拷贝给 target,并返回 target;

Object.create(proto):以 proto 为原型创建对象;

Object.keys(obj):由 obj 所有可枚举自身属性的属性名组成的数组;

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注