1.什么是闭包?有什么特点?
闭包是能够有权访问其他函数内部的私有变量的函数
是指有权访问另一个函数的作用域中的变量的函数,可以提升变量
优点:在页面加载时在内存中存在,调用速度快,并闭包的变量也会始终保存在内存中
缺点:造成内存消耗过大,页面性能降低,需要手动清空才能释放内存
闭包的表现形式:函数的嵌套,递归,匿名函数等。
特点:访问私有变量,变量不被销毁,用于封装
2.new关键字都做了什么
(1)创建一个新对象
(2)将构造器的作用域赋给新对象
(3)用this关键字指向这个对象
(4)通过proto寻找父类对象
(5)返回新对象给调用者
3.js的数据类型有哪些
基本类型:数字(number),字符串(string),布尔(boolean),空(null undefined)
引用类型:对象/引用(object)
4.0.1+0.2为什么不等于0.3
丢失精度问题
在小数执行运算时,也需要转化成二进制数,被转化的0.1和0.2为32位循环二进制
在做运算则返回的也是循环32位的0.3,就丢失了精度
5.深拷贝和浅拷贝的区别
深拷贝:两个变量复制,引用的是不同的堆内存机制
浅拷贝:两个变量复制,引用的是一个堆内存机制
深拷贝和浅拷贝的使用场景是在复杂对象里,即对象的属性还是对象,
浅拷贝是指只复制一层对象,当对象的属性是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化
浅拷贝的方法
// 只复制第一层的浅拷贝
function simpleCopy(obj1) {
var obj2 = Array.isArray(obj1) ? [] : {};
for (let i in obj1) {
obj2[i] = obj1[i];
}
return obj2;
}
var obj1 = {
a: 1,
b: 2,
c: {
d: 3
}
}
var obj2 = simpleCopy(obj1);
obj2.a = 3;
obj2.c.d = 4;
深拷贝的方法
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);
6.谈谈你理解的this关键字
全局下this指向window
对象操作下,点前面是谁,this就指向谁,没有指向window
匿名函数指向window
Dom元素绑定事件,指向当前dom对象
7.什么是变量提升
变量提升也叫域解释,在js代码没有执行之前,在内存中,var会先声明,而function声明和定义都完成了
8.js内存回收机制是什么
引用计数:每次变量被引用则数值加1,赋值给其他变量,或不引用数值-1,则到0为止进行回收
标记清除:当变量被引用,则标注进入环境,变量不使用标注离开环境,js回收机制,检测到离开环境就回收
9.什么情况下js内存不会回收呢?
全局变量不会回收
闭包引用的变量不会回收
有栈内存引用堆内存的地址不被回收