浅拷贝深拷贝,原型,类型校验,递归深拷贝
浅拷贝:
let top = {
name: "赵云",
};
let bom = "云中君";
function shallowCopy(src) {
var newobj = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
newobj[prop] = src[prop];
}
}
return newobj;
}
简单来浅拷贝就是一个指针,指向值,当现在值改变两个值都会改变。
深拷贝:
// 示例
let ttp = [{ name: "123" }, { name1: "1233" }];
let aa = ttp;
aa[0].name = "0";
console.log(ttp);
//我们可以借助这个实例来看,如果你直接赋值,当你的aa中发生改变,ttp中也会跟着改变
//我们可以使用JSON.parse(JSON.stringify(ttp));
let ttp = [{ name: "123" }, { name1: "1233" }];
let aa = JSON.parse(JSON.stringify(ttp));
aa[0].name = "0";
console.log(ttp);
这样就 不会改变
深拷贝就是将你复杂的引用类型一点一点的拿出来赋值,放在一个新开辟的空间中,与原来的数据不干扰。
原型:
在JavaScript中的每个对象中都有一个–proto–属性,这个属性对应的就是自身的原型,
JavaScript 中每个函数都有一个proto属性,这个属性有一个prototype属性这个属性就是原型。
类型校检
基本数据类型:String Number boolean null undefined symbor
引用数据类型:Object array function data
.类型判断:
1.typeof:可以判断一些基本数据类型,遇到引用数据类型不起作用
2.instanceof 判断new创建的引用 数据类型不考虑null、undefined创建的基本数据类型
3.constructor 可以解决一般的基本数据类型和引用类型。单是如果创建了一个构造函数,并且把它指向了array的情况下,他也不行
4.object.prototype.toString.call()判断属于那个对象是,不可以判断自定义
递归深拷贝
function cloneDeep(obj) {
3 // 3.根据obj为对象或者数组,产生一个空的对象或数组,存放数据
4 var newobj = obj instanceof Array ? [] : {},
5 // 1.for...in进入循环
6 for (var k in obj) {
7 // 2.判断对象的第一个属性是否为数组或者对象,如果是,则进入递归
8 // if (obj[k] instanceof Array) {
9 // newobj[k] = cloneDeep(obj[k])
10 // } else if (obj[k] instanceof Object) {
11 // newobj[k] = cloneDeep(obj[k])
12 // }
13 // 4.上面两个执行逻辑一样,进行合并
14 if (typeof obj[k] === ‘object‘) {
15 newobj[k] = cloneDeep(obj[k])
16 } else {
17 // 5.如果数据为基本类型,则直接赋值
18 newobj[k] = obj[k]
19 }
20 }
21 // 6.把存放了数据的新对象返回出去
22 return newobj
23 }
使用递归或者递归函数实现深拷贝:
使用递归的方法在对象嵌套或者数组嵌套中层层拿值,把拿来的值放在一个新的空间中完成深拷贝。