闭包
闭包正确的定义是:假如一个函数能访问外部的变量,那么就形成了一个闭包,而不是一定要返回一个函数。
let a = 1
// 产生闭包
function fn() {
console.log(a);
}
function fn1() {
let a = 1
// 产生闭包
return () => {
console.log(a);
}
}
const fn2 = fn1()
fn2()
常见考点
闭包能考的很多,概念和笔试题都会考。
概念题就是考考闭包是什么了。
笔试题的话基本都会结合上异步,比如最常见的:
for (var i = 0; i < 6; i++) {
setTimeout(() => {
console.log(i)
})
}
深浅拷贝
浅拷贝
首先可以通过 Object.assign 来解决这个问题,这个函数会拷贝所有的属性值到新的对象中。如果属性值是对象的话,拷贝的是地址。
let a = {
age: 1
}
let b = Object.assign({}, a)
a.age = 2
console.log(b.age) // 1
另外我们还可以通过展开运算符 ... 来实现浅拷贝:
let a = {
age: 1
}
let b = { ...a }
a.age = 2
console.log(b.age) // 1
深拷贝
深拷贝通常可以通过 JSON.parse(JSON.stringify(object)) 来解决,这个方式基本能解决大部分情况。
递归
通过遍历的方式来改写递归。也就是如何写层序遍历(BFS)的问题
常见面试题
- 浅拷贝和深拷贝的区别是什么
- JSON.parse(JSON.stringify(a)) 存在什么问题
- 手写深拷贝函数
常见面试题
- 如何理解原型及原型链
- 如何重写原型,这个在下一章节的继承小节中有解释
- 原型链指向
陆续更新中...