前端面试题-深拷贝浅拷贝-浏览器存储-原型链-闭包-call,bind,apply的区别
- 什么是深拷贝什么是浅拷贝
- cookie,sessionStorage和localStrorage的区别是什么
- 什么是原型链prototype原型 作用域
- 什么是闭包,闭包的作用场景是什么
- call bind和apply的区别
什么是深拷贝什么是浅拷贝
浅拷贝只是拷贝一层,更深层及的对象级别只是拷贝出来引用,不拷贝地址,两者属性值指向同一内存空间。简单来讲,就是改变其中一个对象,另一个对象也会跟着改变。
深拷贝,拷贝对象各个层级的属性。简单来讲,就是复制出来的每个对象都有属于自己的内存空间,不会互相干扰。
实现深拷贝 (这个一般VUE里面有个内置的模块loadsh 很好用和这个深拷贝 用的都是这个 但是下面也会沾一个深拷贝的代码)
function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
cookie,sessionStorage和localStrorage的区别是什么
1.都可以用来存储数据
2.cookie一条数据大小不能超过4KB,最多不能存储超过20条,如果没有设置过期时间,那么在浏览器关闭后消失。
3.sessionStorage是会话存储,一条大小不能超过5M,数量没有限制,关掉页面数据消失
4.localStorage本地存储,一条大小不超过5M,数量没有限制,除非主动删除,否则数据不会消失
什么是原型链prototype原型 作用域
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的proto隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会在再在构造函数的prototype的proto中查找,这样一层一层的向上查找就会形成一个链式结构,我们称为原型链。
作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链来保证对执行环境有权访问的变量和函数的有序访问。作用域第一个对象始终是当前执行代码锁着环境的变量对象。
什么是闭包,闭包的作用场景是什么
闭包指的是一个函数可以访问另一个函数作用域中变量
闭包就是能够读取到其他函数内部变量的函数,由于在js语言中,只有函数内部的子函数才能读取局部变量。因此可以把闭包简单理解成“定义在一个函数内部的函数”,所以在本职上,闭包就是将函数内部和函数外部链接起来的一座桥梁
1.采用函数引用的方式的setTimeOut调用
2.小范围的代替全局变量
3.访问私有变量的特权方法
4.模块化
使用作用域的形式说明闭包是什么。当外层函数执行时,内层函数进行定义,此时内存函数生成作用域链,作用域链中包含外层函数的AO对象,导致AO无法是否,这就形成了闭包。
闭包缺点:会导致函数的变量一直保存在内存中,过多的闭包可能会导致内存泄漏
call bind和apply的区别
1.都可以更改this指向
2.call,bind 后面的第一个参数是指向的对象,第二个参数是往对象传的值
3.apply 后面的第一个参数是指向的对象,第二个参数是数组,数组里面是对象传的值(argumets 全部参数)
4.call和apply更改this执行会自动调用,bind需要手动调用返回一个函数