js系列-持续更新版
-
-
- 1.如何获取一个安全的undefined值
- 2.闭包是什么,有什么作用
- [3. 原型和原型链](#3. 原型和原型链)
- [4. 深拷贝和浅拷贝的区别,如何实现一个深拷贝](#4. 深拷贝和浅拷贝的区别,如何实现一个深拷贝)
-
1.如何获取一个安全的undefined值
因为undefined是一个标识符,所以可以用来当作变量名,但是是非常危险的,因为会影响 undefined 的正常判断,因此可以使用void 0来实现:
javascript
let a = void 0
console.log(a == undefined);//true
2.闭包是什么,有什么作用
闭包是在一个内层函数中可以访问外层函数的作用域。每当创建一个函数,闭包就会在函数创建时被创建出来。
作用:
- 创建私有变量
- 延长了变量的生命周期。
优点:能够实现封装和缓存等
缺点:消耗内存,不正当使用会造成内存溢出的问题。
闭包形成的条件:
1.参数嵌套;
2.将内部函数作为返回值使用;
3.内部函数必须使用外部变量。
3. 原型和原型链
每一个函数都有一个protoType属性,它是一个指针,指向原型对象,每一个实例对象都有一个__proto__属性,也指向原型对象,原型对象上有一个construct属性,指向protoType所在的函数.
原型链是利用一个引用类型继承另一个引用类型的属性和方法。(沿着__proto__查找属性和方法的链称为原型链。)
4. 深拷贝和浅拷贝的区别,如何实现一个深拷贝
浅拷贝和浅拷贝的区别主要在于他们如何处理数据和对象的引用,浅拷贝只复制对象的指针,多个对象共享一个对象数据,而深拷贝是创建一个全新的对象,与拷贝对象不共享数据,新对象改变数据对原对象没有影响。
实现一个深拷贝:
javascript
function deepClone(res) {
//判断res类型
const newRes = res.constructor === Array ? [] : {};
//遍历res
for(let key in res) {
//判断是否有值:有-->判断当前属性
if(res.hasOwnProperty(key)){
//key有三种情况:object,array,基本数据类型
if(res[key] && typeOf res[key] === 'object') {
newRes[key] = deepClone(res[key]);
}else {
newRes[key] = res[key];
}
}
}
return newRes;
}