JavaScript 进阶面试题
- 说 说说 说 ECMAScript6 怎么写 class?
这个语法糖可以让有 OOP 基础的人更快上手 js ,至少是一个官方的实现了。
对熟悉 js 的人来说,这个东西没啥大影响;一个 Object.creat() 搞定继承,比 class 简洁
清晰的多。 - 说 说 说 什么是面向对象编程及面向过程编程,它们的异同和优缺点?
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的
时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是
为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象是以功能来划分问题,而不是步骤。 - 说 说 说 异步编程的实现方式?
回调函数
优点:简单、容易理解
缺点:不利于维护,代码耦合高
事件监听(采用时间驱动模式,取决于某个事件是否发生):
优点:容易理解,可以绑定多个事件,每个事件可以指定多个回调函数
缺点:事件驱动型,流程不够清晰
发布/订阅(观察者模式)
类似于事件监听,但是可以通过‘消息中心’,了解现在有多少发布者,多少订阅者
Promise 对象
优点:可以利用 then 方法,进行链式写法;可以书写错误时的回调函数
缺点:编写和理解,相对比较难
Generator 函数
优点:函数体内外的数据交换、错误处理机制
缺点:流程管理不方便
async 函数
优点:内置执行器、更好的语义、更广的适用性、返回的是 Promise、结构清晰
缺点:错误处理机制 - 说 说 说 面向对象编程思想?
基本思想是使用对象,类,继承,封装等基本概念来进行程序设计
优点
易维护
易扩展
开发工作的重用性、继承性高,降低重复工作量。
缩短了开发周期 - 说 说说 说 Gulp 是什么 是什么?
gulp 是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能
对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成
Gulp 的核心概念:流
流:就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了
一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而
不用关心流的另一头数据的真正流向
gulp 正是通过流和代码优于配置的策略来尽量简化任务编写的工作 - 想实现一个对页面某个节点的拖曳?如何做? 想实现一个对页面某个节点的拖曳?如何做?
给需要拖拽的节点绑定 mousedown , mousemove , mouseup 事件
mousedown 事件触发后,开始拖拽
mousemove 时,需要通过 event.clientX 和 clientY 获取拖拽位置,并实时更新位置
mouseup 时,拖拽结束
需要注意浏览器边界的情况 - 封装一个函数,参数是定时器的时间,then 执行回调函数 执行回调函数? ?
function sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time));
} - 怎么判 怎么判 断两个对象相等?
obj = {a: 1,b: 2}
obj2 = {a: 1,b: 2}
obj3 = {a: 1,b: ‘2’}
JSON.stringify(obj)==JSON.stringify(obj2);//true
JSON.stringify(obj)==JSON.stringify(obj3);//false
- Javascript 全局函数和全局变量 全局函数和全局变量? ?
全局变量
Infinity 变量代表正的无穷大的数值
NaN 指示某个值是不是数字值
undefined 指示未定义的值
全局函数
decodeURI() 解码某个编码的 URI 。
decodeURIComponent() 解码一个编码的 URI 组件。
encodeURI() 把字符串编码为 URI。
encodeURIComponent() 把字符串编码为 URI 组件。
escape() 对字符串进行编码。
eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。
isFinite() 检查某个值是否为有穷大的数。
isNaN() 检查某个值是否是数字。