@gpzjyw
2016-08-17T08:43:12.000000Z
字数 8802
阅读 415
Interview Front-End JavaScript
| 表达式(expression) | 语句(statement) |
|---|---|
| JavaScript中的短语 | JavaScript中的整句或命令 |
| 计算出一个值 | 执行以使某件事发生 |
| 逗号分隔 | 分号分隔 |
基本数据类型:String, Boolean, Number, Undefined, Null;
引用数据类型:Object(Array, Date, RegExp, Function);
如何判断这些数据类型?
基本类型:typeof
引用类型:Object.prototype.toString.call( ) = "[object NativeConstructorName]"
"use strict";
闭包是什么
闭包是指有权访问另一个函数作用域中的变量的函数。
闭包的原理,什么情况下会发生闭包
作用域链。
函数的返回值保持着对外部环境变量的引用时。
闭包的应用场景
闭包的优缺点
优点:
缺点:
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实现
xhr = new XMLHttpRequest()xhr.onreadystatechange = function () {...}xhr.open("get/post", "URL", true)xhr.setRequestHeader("MyHeader", "MyValue")xhr.send(null)在用户和服务器之间加了一个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做,只有确定需要从服务器读取新数据时再由 Ajax引擎代为向服务器提交请求。
定义一个方法,先判断是否存在同名方法:Object.XXXX = Object.XXXX || function(){ ... }。
运用能力检测,不用使用window.XXXX或document.XXXX。例如:
if(obj.XXXX) {
...
} else {
...
}
不安全。要尽量避免修改原生对象的原型。当在另一支持该方法的实现中运行代码时,可能会导致命名冲突,也可能会意外的重写原生方法。
函数声明:js解析时会首先读取函数声明,使其在执行任何代码之前可用(可以访问);
函数表达式:在js解析到其所在行的时候,该函数才真正被解析执行,在后续代码中才可以被调用。
+function () {...}();:性能最差;
!function () {...}();
(function () {...})();
(function () {...}());
void function () {...}()
具名函数表达式(Named Function Expression)
匿名函数(Anonymous Function)
性能问题:使用了with关键字后,js引擎无法对这段代码进行优化。
语义不明,调试困难。
animation+keyframes或transition;setTimeout()或window.requestAnimationFrame();原生对象:由ECMAScript定义且不依赖执行环境定义的对象
宿主对象:JavaScript的宿主环境定义的对象,例如浏览器端的window、history等
特征检测:直接检测某对象或方法是否被定义;
特征推断:根据一对象或方法是否被定义,推测另一对象或方法的是否被定义;
UA字符串:用户端浏览器的详细信息;
typeof undefined === undefined;Source map就是一个信息文件,里面储存着位置信息。
代码发生错误之后,JavaScript的解释器只会告诉我们第几行第几列出错。但压缩后的js只有几行,报错信息无意义。Source map就是用于解决此类问题,方便压缩后代码的调试。
JavaScript前端模板,用于客户端渲染,例如异步加载页面。
属性继承:
Child = function (arg1,...,argN) {Parent.call(this, arg1,...,argN)}
接口(方法)继承:
Object.create(Parent.prototype)
attribute:
property:
为输入框添加焦点事件
对象属性名:
for (var item in obj) {// todo...}// 会遍历原型链上的键
对象属性值:
// ES6for (var item of obj) {// todo...}
所有可枚举自身属性的属性名组成的数组:Object.keys(obj)
所有自身属性的属性名组成的数组:Object.getOwnPropertyNames(obj)
数组:
// Array.prototype.forEach[].forEach(function(item, index, array){// todo...})
arguments
NodeList
HTMLCollection
根据模板文件,结合数据,运用JavaScript引擎输出HTML界面。
基于事件冒泡原理和事件对象event实现。
优点:
IE下:
添加事件:attachEvent,其中回调函数的this指向window;
触发事件:按事件处理程序添加顺序的相反顺序执行;
event对象:srcElement,cancelBubble(取消冒泡,可读/写),returnValue(默认行为,可读/写);
函数柯里化:是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。即固定函数的可预期参数,并返回一个接收余下参数的函数。
var curry = function (func, parameter) {var slice = Array.prototype.slice,args = slice.call(arguments, 1);return function () {return func.apply(null, args.concat(slice.apply(arguments)));}}
Cross-Origin Resource Sharing,跨域资源共享
Ajax的限制:跨域安全策略,XHR 对象只能访问与包含它的页面位于同一域的资源;
JSONP:利用
<script>标签的 src 属性;
Web Sockets:首先发起一个 HTTP 请求,之后从 HTTP 协议升级为 Web Sockets。故 Web Sockets 需要服务器支持
基于原型链实现继承。
Object.create()
使用Promises而非回调(callbacks)优缺点是什么
代码更少,更优雅,更容易维护。
Promises:提供了一种管理异步操作回调的规范;
Promises/A+规范,译文
Promise机制,参考博客.
对象:for ... in ...,用hasOwnProperty过滤非自身属性;
数组:for 循环,Array.length;
可变对象可以修改属性、删除属性和添加属性,而不可对象均不能。
防篡改对象。
主线程从任务队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。
调用栈:同步任务在主线程上执行,形成一个调用栈
任务队列:主线程之外,存在一个任务队列,异步任务有了运行结果,就在任务队里中放置一个事件。主线程从任务队列中读取事件。
调用栈中的代码(同步任务),总是在读取任务队列(异步任务)之前执行。
CSRF(Cross-Site Request Forgery,跨站请求伪造):未被授权系统伪装自己,让处理请求的服务器认为它是合法的;
起因:源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!
常见类型:
防御:
XSS(Cross Site Scripting,跨站脚本攻击):
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。
回调函数
setTimeout(callback, time);
事件监听
采用事件驱动模式。任务的执行不取决于代码的顺序,而取决于某个事件是否发生;
利用jQuery的on方法注册事件,trigger方法触发事件。
发布/订阅
存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe pattern),又称"观察者模式"(observer pattern)。
jQuery.subscribe为函数订阅事件信号,jQuery.publish发布事件信号
Promises对象
Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。
应用jQuery的延迟对象统一管理异步回调函数。
单例模式
简单工厂模式
观察者模式
一个对象维持一系列依赖于它(观察者)的对象,将有关状态的任何变更自动通知给它们。
发布-订阅者模式
发布者向订阅的对象发布信号。
添加:
删除:
查询:
修改:
DOM 遍历是基于给定节点为根节点执行深度优先的 DOM 结构遍历。
树的遍历:深度优先,广度优先
window.onload():是必须等到页面内包括图片的所有元素加载完毕后才能执行。
$(document).ready():是DOM结构绘制完毕后就执行,不必等到加载完毕。
load事件与DOMContentLoaded事件
对于不兼容DOMContentLoaded事件,可以设置0ms的超时调用兼容实现:
setTimeout(function () { /*事件处理程序*/ }, 0);
短路表达式
&& ||,真值/假值的区分,使用!!更为严谨;
预定义常用方法入口
在代码开头提前声明变量,保存一些常用对象方法的引用;
钩子机制(Hook)
定义一个字典对象(表),根据字典对象中是否有某个属性执行相应操作;
连贯结构
链式调用,函数调用后返回该jQuery对象,return this;;
参数映射及处理,兼容多种传入参数类型,键值对、JSON对象等;
无new构造
新建jQuery对象实例时,本质即new jQuery.fn.init(selector, context, rootjQuery);
jQuery.fn.init.prototype = jQuery.fn;
方法的重载
一个方法实现多种功能,即能get又能set;
jQuery.fn.extend与jQuery.extend
jQuery.fn.extend:把对象挂载到 jQuery 的 prototype 属性,来扩展一个新的 jQuery 实例方法,通过jQuery实例进行调用;
jQuery.extend:扩展静态工具方法,可直接使用 $.XXX 进行调用;
正则表达式
jQuery中使用了大量正则表达式
变量冲突处理
执行var query = jQuery.noConflict(true);,query即指向jQuery;
jQuery.extend:扩展jQuery类本身,为类添加新的方法。作用于每一个实例化的jQuery对象;
jQuery.fn.extend:给jQuery这个对象添加方法;
遍历方法中最大的种类是树遍历(tree-traversal)。
| 方法 | 是否修改原对象 | 返回值 | 作用 |
|---|---|---|---|
| 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.assign(target, ...sources):将 sources 自身的可枚举属性拷贝给 target,并返回 target;
Object.create(proto):以 proto 为原型创建对象;
Object.keys(obj):由 obj 所有可枚举自身属性的属性名组成的数组;