深拷贝浅拷贝,原型,类型校验,递归深拷贝

浅拷贝深拷贝,原型,类型校验,递归深拷贝

浅拷贝:

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       }  

使用递归或者递归函数实现深拷贝:
使用递归的方法在对象嵌套或者数组嵌套中层层拿值,把拿来的值放在一个新的空间中完成深拷贝。

猜你喜欢

转载自blog.csdn.net/weixin_54163765/article/details/112589510