js基础部分
undefined与null的区别
undefined表示一个变量原始的状态值,而null表示一个变量被人为的设置为了空对象,并不是原始状态。所以为了保证变量代表的语义,不要对变量赋值undefined,如果对一个对象进行释放时,赋值为null即可
undefined出现的几种情况:
1>声明了一个变量但没有进行赋值
2>访问对象上不存在的属性
3>函数定义了形参但没有传递实参
4>使用void对表达式求值
数组与类数组的区别
·数组是一个特殊对象,与常规对象的区别:
1、当新元素添加到列表中时,自动更新length属性
2、设置length属性,可以截断数组
3、从Array.prototype中继承了方法
4、属性为’Array‘
·类数组是一个拥有length属性,并且他属性为非负整数的普通对象,类数组不能直接调用数组的方法
区别
本质:类数组是简单对象,它的原型关系与数组不同
// 原型关系和原始值转换
let arrayLike = {
length: 10,
};
console.log(arrayLike instanceof Array); // false
console.log(arrayLike.__proto__.constructor === Array); // false
console.log(arrayLike.toString()); // [object Object]
console.log(arrayLike.valueOf()); // {length: 10}
let array = [];
console.log(array instanceof Array); // true
console.log(array.__proto__.constructor === Array); // true
console.log(array.toString()); // ''
console.log(array.valueOf()); // []
可以使用Array.from()将类数组转化为数组
注:转换后的数组长度由length决定,索引不连续时,转换结果是连续的,会自动补位,例如:
let al1 = {
length: 4,
0: 0,
1: 1,
3: 3,
4: 4,
5: 5,
};
console.log(Array.from(al1)) // [0, 1, undefined, 3]
Set、Map、WeakSet 和 WeakMap的区别
Set
1、成员不能重复
2、只有键值,没有键名,有点类似数组
3、可以遍历,方法有add,delete,has
WeakSet
1、成员都是对象(引用)
2、成员都是弱引用,随时可以消失;可以用来保存dom节点,不容易造成内存泄漏
3、不能遍历,方法有add,delete,has
Map
1、本质上是键值对的集合,类似集合
2、可以遍历,方法很多,可以和各种数据格式转换
WeakMap
1、直接收对象为键名(null除外),不接受其他类型的值作为键名
2、键名指明的对象不计入垃圾回收机制
3、不能遍历,方法有get、set、has、delete
简单说明js中内存泄露的情况
1、意外的全局变量
2、闭包
3、为被清空的定时器
4、未被销毁的事件监听
5、DOM引用