代码和注释逻辑如下
<script>
//
var obj1 = {
a: 1,
b: 2,
c: [
33,
44,
{
m: 55,
n: 66,
p: [77, 88],
},
],
};
var obj2 = deepClone(obj1);
//原来对象里面有数组,对象, 因为最后输出的时候,数组就按数组的方式输出,对象就按照对象的方式输出,
// 所以定义函数的时候,要有两个参数,要克隆的对象,第二个先默认一个对象类型
// 后面每一次用到递归函数,都要写两个参数
function deepClone(obj1, type = "object") {
// 首先obj2默认为空对象和空数组,用来接收obj里面的对象和数组
if (type == "object") {
var obj2 = {};
}
if (type == "array") {
var obj2 = [];
}
// 遍历obj1中的所有元素
for (var k in obj1) {
// obj1中有数组,有对象,有字符串,
// 继续判断是不是数组 ,是的话,继续执行递归函数,再传给obj2
if (Array.isArray(obj1)) {
obj2[k] = deepClone(obj1[k], "array");
} else if (typeof obj1[k] === "object") {
// 判断完是不是数组,接着判断是不是对象
// 是对象的话,继续执行递归函数
obj2[k] = deepClone(obj1[k]);
} else {
// 如果遍历出来的,不是对象,也不是数组,那么直接用obj2接收
obj2[k] = obj1[k];
}
}
// for循环结束,return出去
return obj2;
}
console.log(obj2);
// typeof
// 用于判断数据类型,返回值有number、string、boolean、function、undefined、object 六个。
// 总结
// 总之,typeof 和 instanceof 都是用来判断变量类型的,区别在于:
// 1、typeof判断所有变量的类型,返回值有number、string、boolean、function、object、undefined。
// 2、typeof对于丰富的对象实例,只能返回object,导致有时候得不到真实的数据类型。
// 3、instanceof用来判断对象,代码形式(obj1 instanceof obj2)(判断obj1是否为obj2的实例),obj2必须为对象,否则会报错。返回的是布尔值。
// 4、instanceof可以对不同的实例对象进行判断,判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在于obj1的原型链上,(obj1 instanceof obj2)值为true。
</script>