值类型 引用类型 深拷贝
PS:整理下之前的学习笔记分享下,欢迎指正,不喜勿喷_
-
值类型变量:字符串 number 布尔变量 symbol undefined
-
引用类型变量 :函数 对象 数组 null
typeof 方法可以判断值类型变量得到具体它类型,判断引用类型的到 object 不可细分得到具体是对象还是数组,typeof 判断函数为function;
- 值类型和引用类型变量存储特征:
值类型变量保存到栈中,用完就销毁,是直接存储变量的名和值, 赋值时,深复制直接将变量值复制给另外一个变量,修改时互相不影响;
引用类型变量名保存在栈,值保存在堆中, 复制时实际上是赋值值的存储地址,传递引用,浅复制,修改变量的值会相互影响,同一个地址访问的值一样。
关于存储位置的大胆猜测存储位置不一样:性能问题,值类型简单,占空间小,直接赋值,引用类型变量复杂,空间占用大,直接赋值慢,所以赋值引用地址。
- 引用类型的变量实现像值类型变量一样赋值 深度拷贝实现思路
- 判断传入的参数是否为引用数据类型,若是简单数据类型则直接返回传入的参数;
- 判断传入的参数是数组还是对象,分别初始化对应的结构;
- 使用 for in 遍历对象,判断该属性是否为对象的自有属性obj.hasOwnProperty(key);
- 判断对应的属性值是否为引用数据类型,若是引用数据类型,则需要递归调用该函数,若不是则直接添加到初始化的结构上。
function deepClone(obj) {
// 判断传入的参数是否为引用数据类型,若是简单数据类型则直接返回传入的参数;
function isObject(para) {
return (typeof para === "object" || typeof para === "function") && para !== null;
}
if (!isObject(obj)) {
return obj;
}
// 判断传入的参数是数组还是对象,分别初始化对应的结构;
let cloneObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
// 使用 for in 遍历对象,判断该属性是否为对象的自有属性obj.hasOwnProperty(key);
if (obj.hasOwnProperty(key)) {
// 判断对应的属性值是否为引用数据类型,若是引用数据类型,则需要递归调用该函数,若不是则直接添加到初始化的结
cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key];
}
}
return cloneObj;
}