function deepCopy(obj){
if (typeof obj !== 'object' || obj == null) return obj;
let result = Array.isArray(obj) ? [] : {};
for (let key in obj){
if(obj.hasOwnProperty(key)){
result[key] = deepCopy(obj[key]);
}
}
return result;
}
对象是引用类型的值。常见的数字,字符串是值类型的值。存储的堆内存中的地址。
因为引用类型最好是复制他的地址,因为引用类型的值可能很大,考虑性能,存储。值类型占用的空间小。json可能很大,存储大。
简言之,在函数中通过递归的方法把每个值都存储到一个新的对象中,再返回。
实现思路
- 新建函数,以一个对象为参数
- 判断参数是否为对象,typeof 不为对象或等于null的,可以直接返回。
- typeof 为对象不为null的只有数组和对象类型
- 定义变量result,判断是否为数组,是(定义为数组),不是(定义为对象)
- for in 循环。获得对象的key 或 数组字符串的下标
- 判断对象是否有指定属性,是否有指定的键。
- 递归Copy对象对应的值(重复2-7),赋值给变量result
- 返回result。
hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
for...in 语句用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。
for in得到对象的key ,或者数组字符串的下标
for of 和 forEach 一样直接得到值。
for of不能对对象使用。