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

深拷贝,浅拷贝

深拷贝

概念:深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响, 对一个对象的修改并不会影响另一个对象。
如何实现
可以使用:
1.object.assign()
2.扩展运算符:…
3.Array.prototype.slice()
4.Array.prototype.concat()
5.JSON.stringify()来转换,JSON.parse()来解析

浅拷贝

概念:浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。

如何实现
可以使用:直接赋值就好了

原型,原型链

原型
每个函数都有prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含特定类型的所有实例共享的属性和方法,即这个原型对象是用来给实例共享属性和方法的。
而每个实例内部都有一个指向原型对象的指针。

原型链
当一个对象调用自身不存在的属性/方法时,就会去自己 [proto] 关联的前辈 prototype 对象上去找,如果没找到,就会去该 prototype 原型 [proto] 关联的前辈 prototype 去找。依次类推,直到找到属性/方法或 undefined 为止。从而形成了所谓的“原型链”。

类型校验

基本数据类型

number,string,boolean,null、undefined sy bol

引用数据类型**(对象类型)**

Object、array、function等

1、typeof(函数,返回基本数据类型) 对于基本数据类型判断是没有问题的,但是遇到引用数据类型(如:Array)是不起作用的
2、instanceof 判断new关键字创建的引用数据类型
用法: //log(数据 instanceof {array或者object})
不考虑null和undefined以对象字面量创建的基本数据类型
3、constructor constructor似乎完全可以应对基本数据类型和引用数据类型但如果声明了一个构造函数,并且把他的原型指向了Array的原型,这种情况下,constructor也显得力不从心
4、object.prototype.toString.call() 属于完美解决方案

递归深拷贝

例子

let arr = [1, 2, 3, 4, { name: 123 }]

        Object.prototype.deepClone = function (data) {
            if (typeof (data) == "object") {
                let deepData = data instanceof Array ? [] : {}

                for (let key in data) {
                    // console.log(data[key]);
                    deepClone[key]=typeof(data[key])=="object"?deepClone(data[key]):data[key]
                }
                return deepData
            }else{
                return data
            }
        }

        let newArr = deepClone(arr)
        newArr[4].name="张飞"
        console.log(arr,newArr)
  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值