首页 > 其他分享 >JS对象赋值会影响原对象解决办法

JS对象赋值会影响原对象解决办法

时间:2023-03-18 12:24:08浏览次数:38  
标签:obj2 console target 对象 JS result anotherSum 赋值

JS常见坑:对象赋值会影响原对象

  • 现象:直接用=的方式把一个对象赋值给另一个对象,会导致修改新对象时,原对象也发生变化

    var obj1 = {'name': '1111'};
    var obj2 = obj1;
    obj2.name = '2222';
    console.log(obj1.name); //'2222'
    
  • 原因:JavaScript 中对象的赋值是默认引用赋值的(两个对象指向相同的内存地址)

一、Object.assign()拷贝对象

代码演示

// 使用 Object.assign() 方法复制对象
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}

obj2.a = 2;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}

obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}

不足之处

  • 可以看到当修改obj2.b.c的值时,原对象obj1.b.c也跟着发生了变化,Object.assign()只是让对象里第一层的数据没有了关联性,但是对象内的对象则跟被复制的对象有着关联性的。
  • Object.assign(obj) --浅拷贝
    Object.assign({},obj) --只有第一层深拷贝 (ES6中扩展运算符...也是如此)

二、JSON.parse(JSON.stringify(obj))

代码演示

var function cloneObjectFn (obj){
    return JSON.parse(JSON.stringify(obj))
}

var obj1={a:2,b{c:0}}
var obj2=cloneObjectFn(obj1)
console.log(obj2)    // {a:2,b{c:0}}

不足之处

使用场景限制:obj属性不能是function、RegExp等,JSON序列化时会造成属性丢失:
image

三、原生JS实现深拷贝

// 定义一个深拷贝函数  接收目标target参数
function deepClone(target) {
    // 定义一个变量
    let result;
    // 如果当前需要深拷贝的是一个对象的话
    if (typeof target === 'object') {
        // 如果是一个数组的话
        if (Array.isArray(target)) {
            result = []; // 将result赋值为一个数组,并且执行遍历
            for (let i in target) {
                // 递归克隆数组中的每一项
                result.push(deepClone(target[i]))
            }
         // 判断如果当前的值是null的话;直接赋值为null
        } else if (target === null) {
            result = null;
         // 判断如果当前的值是一个RegExp对象的话,直接赋值 
        } else if (target.constructor === RegExp) {
            result = target;
        } else {
            // 否则是普通对象,直接for in循环,递归赋值对象的所有值
            result = {};
            for (let i in target) {
                result[i] = deepClone(target[i]);
            }
        }
    } else {
        // 如果不是对象的话,就是基本数据类型,那么直接赋值
        result = target;
    }
    // 返回最终结果
    return result;
}

PS. JS中function也是引用类型,但是函数名仅仅是指向该函数的指针,换句话说,一个函数可能会有多个名字

function sum(num1, num2){
  return num1 + num2;
}
console.log(sum(10, 10));// 20
 
var anotherSum = sum; // 此时有两个变量sum和anotherSum同时指向该函数(该函数此时有俩名字)
console.log(anotherSum(10, 10));// 20
 
sum = null; // sum置为空后,此时只有anotherSum指向该函数(该函数只有一个名字anotherSum)
console.log(anotherSum(10, 10));// 20

如上:代码中首先定义了一个名为sum的函数,用于求两个数的和。然后,又声明了变量anotherSum,赋值为sum,此时anotherSumsum就指向了同一个函数,因此anotherSum()也正常返回了结果。即使切断sum与函数对象的引用关系,也不会影响anotherSum

标签:obj2,console,target,对象,JS,result,anotherSum,赋值
From: https://www.cnblogs.com/zzx-blogs/p/17229698.html

相关文章

  • jvm jstat -gcutil 参数详解
    jstat-gcutil854410008544进程ID,用jps命令查出1000单位毫秒,每秒读取一次S0survivor0使用百分比S1survivor1使用百分比EEden区使用百分比O老年代使用百分比M......
  • 【开发环境】IntelliJ IDEA 中的 Gradle 工程处理 JSON 字符串
    文章目录​​一、创建Gradle工程​​​​二、导入org.json:json依赖​​​​三、处理JSON字符串​​一、创建Gradle工程在IntelliJIDEA中,选择"菜单栏|Fi......
  • Eggjs 学习笔记 02
    Service层如果把Controller层看作是与客户端交互并接收请求数据然后返回数据的作用,那么Service层则是处理数据、查询数据(包括数据库的查询,第三方服务的调用)、或者......
  • JSON详解转载
    JSON详解阅读目录JSON的两种结构认识JSON字符串在JS中如何使用JSON在.NET中如何使用JSON总结JSON的全称是”JavaScriptObjectNotation”,意思是JavaScript对象表示......
  • AES 简介 以及 C# 和 js 实现【加密知多少系列】
    〇、AES简介AES的全称是AdvancedEncryptionStandard,意思是高级加密标准。它的出现主要是为了取代DES(DataEncryptionStandardDataEncryptionStandard)加密算法的,......
  • 15、K8S资源对象&资源清单
    1、资源对象基本属性介绍1.1、资源对象学习完成Kubernetes集群中的基本架构角色,那么不能不提的集群实现的核心:资源对象。那么在Kubernetes集群中,这些资源对象是如何产......
  • json-diff详细设计
    一、简介json-diff是一款强大的,由java编写的json差异发现工具。他可以发现任何结构的json差异,并且将差异信息反馈给用户。gitee:https://gitee.com/codeleep/json-diff......
  • json-diff简单使用
    一、摘要今天推荐的是一款java中,对比两个json-diff对象是否一致的工具包json-diff`。他可以对比任何结构的两个json数据,并且将其中的不一致信息反馈给用户。工具还内置......
  • js之正则对象
    正则表达式也是js的内置对象,全称是regularexpress(正则表达式)创建正则表达式对象的两种方式构造函数方式=>letreg=newRegExp('正则表达式','匹配模式')字面量创......
  • 跟艾文学编程《零基础入门学Python》(4)Python 面向对象
    作者:艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂。 内容:跟艾文学编程《零基础入门学Python》学习目标面向对象概念类的创建......