es5面试题
wǎng luò shí huāng 2021-06-24
面试题
es5
收集的es5面试题
# 最基本的
- 搜索“学习es5”,这里面有珠峰架构课程专门讲js
# 数据的深拷贝和浅拷贝
- https://gitee.com/wangluoshihuang/everest-series/blob/master/2021-02-jiagouke1-vue3/2.es6-lesson/4.spread.js
- 为了防止循环引用引起的爆栈问题,我们使用WeakMap记录每次的拷贝;每次拷贝前判断当前数据是否被拷贝过,有的话就直接返回当前数据不再拷贝。
# 在GitHub前面面试手册上找到的一些基本面试题:
- js面试参考这里 (opens new window)
- 项目地址在:https://github.com/yangshun/front-end-interview-handbook (opens new window)
# 探究JS常见的6种继承方式
# 作用域
- mdn上官方答案 (opens new window)
- 自注:每块代码执行时都会创建自己的执行上下文,这就是作用域。作用域分 全局 / 函数 / 块级作用域 。作用域也可以根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用。
# 作用域链
- 参考:https://coffe1891.gitbook.io/frontend-hard-mode-interview/1/1.2.2#yi-.2.2.4-zuo-yong-yu-lian-scope-chain
- 上面作用域里已经提到了作用域分层。子作用域里的vo里引用了这父作用域里的vo,这样一层一层串联起来的链表就是作用域链。
# this
- mdn解释:当前执行上下文(global、function 或 eval)的一个属性,在非严格模式下,总是指向一个对象,在严格模式下可以是任意值 (opens new window)。
- 自注:this存在于函数中。箭头函数没有this,而是指向父作用域的this,和其他函数里的this不一样而且是在定义的时候决定的。
# 闭包
- 闭包专业的概念是:我们把函数执行,形成私有上下文,来保存和保护私有变量的机制,称之为“闭包”=>它是一种机制。
- 闭包的本质是:只要上下文(引用类型)被上下文以外的东西占用了,那么此上下文就不会被释放。和使用不使用上下文里的东西无关。哪怕返回一个空函数,不使用任何变量什么的,闭包依然存在。即使是空函数,但是访问此函数时,其作用域链上有父级作用域(那么父级上下文也不会被释放),那么此闭包依然存在。
- 事实上,每个函数都可以被认为是一个闭包,因为每个函数都在其所在域(即该函数的作用域)中维护了某种私有联系。但在大多数时候,该作用域在函数体执行之后就自行销毁了,除非发生一些有趣的事(比如像上述示例代码中那样),使作用域保持。 根据目前的讨论,我们可以说,如果一个函数会在其父级函数返回之后留住对父级作用域的链接的话,相关闭包就会被创建。但其实每个函数本身就是一个闭包,因为每个函数至少都有访问全局作用域的权限,而全局作用域是不会被破坏的。【来自 JavaScript面向对象编程指南 第3版 第97页】
- 闭包示例:https://mp.weixin.qq.com/s/vMj0PLt1lvuIZ9rtE0e1xQ
# 原型
- 是什么?就是一个对象。对象的prototype属性值就是原型。下面原型链的概念来自于MDN已经解释了原型干什么。
- 原型理解:https://zhuanlan.zhihu.com/p/38189949 (opens new window)
- 这里有完整的原型图。
# 原型链
- JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。
- 自己对原型以及原型链的理解,部分如下:
在javascript中,函数可以有属性。 每个函数都有一个特殊的属性叫作原型(prototype)【也就是每个函数默认就有一个原型属性prototype】,分以下两种:
普通函数(非js内部已有构造函数).__proto__.__proto__ == Object.prototype ; 普通构造函数实例化生成的对象,这个对象的构造函数就是这个普通函数。
普通函数.__proto__是一个新建的内存地址与(Object.prototype/Function.prototype)无关;
一切函数.prototype.constructor==函数自己;
js内部已有的构造函数.__proto__ == Function.prototype;换句话说Function是所有内部构造函数的构造函数(包括自己是自己的构造函数)。所以Object.__proto__===Array.__proto__===Function.__proto__
为什么?怎么理解?Function.prototype == Function.__proto__: Function.__proto__里把Function当做一个构函数,根据原型的定义(一个对象的原型等于他构造函数.prototype)
每个原型自身也是对象,也都有自己的__proto__属性
var a1 = {b:function(){}}
var c1 = new a1.b()
c1.__proto__.__proto__ == Object.prototype
c1.__proto__.constructor == a1.b // 普通构造函数也是新的构造函数,只不过没有在js内部默认没有,是开发自己的
function d1(){}
d1.__proto__ == Function.prototype // 普通函数的构造函数时Function
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 对于js数据存放位置、垃圾回收、内存泄漏查找方法
- 浅谈JS内存机制:https://mp.weixin.qq.com/s/vMj0PLt1lvuIZ9rtE0e1xQ
- 截图 (opens new window)
- 一般就是不停操作之后查看堆里数据的变化前后对比就可以知道哪个数据存在泄露
- 例如我们可以对比堆栈里的某种数据个数:

- 例如我们可以对比堆栈里的某种数据个数:
# 页面卸载后任然能发送数据
- 参考:https://blog.csdn.net/xiaomogg/article/details/131883935
- navigator.sendBeacon
- 传递少量数据
- 不考虑响应结果
- 只要求post请求方式
- 浏览器窗口关闭依旧发送数据
- 不会阻塞页面卸载,也就不会影响下一导航的载入
- 支持跨域(不关心数据响应,也没有跨域的顾虑,跨域是可以发送数据的,只是没法读取响应数据)
- 不支持自定义请求头
- fetch使用keepalive
- 不考虑传递数据体积大小
- 大多数时候需要响应数据结果
- 任意请求方式
- 浏览器窗口关闭依旧发送数据&&不考虑响应结果