首页 > 系统相关 >js 把一个对象赋值给另一个对象会指向同一个内存地址

js 把一个对象赋值给另一个对象会指向同一个内存地址

时间:2022-12-14 19:34:49浏览次数:69  
标签:obj 对象 js JSON arr2 arr1 var 内存地址

原文地址:http://t.zoukankan.com/huzhuhua-p-10215708.html

  var arr1 = [1,2,3];
  var arr2 = arr1;
  arr2.push(4);
  console.log(arr1)//[1,2,3,4]

为什么会输出 的是[1,2,3,4]而不是[1,2,3]。

因为实际上并不是新建一个和原对象(数组也是对象)完全一样的对象,而是把原对象的内存地址直接复制给了另一个对象,也就是说两个对象都是指向同一个内存地址,所以实际上它们就是同一个对象。arr2更改的同时就是更改了arr1。好似你的钥匙(arr1)复制了一把(arr2)给别人,你可以把房门打开,别人那把也可以。你更改了房子(内存)里面的东西,别人打开也是看到你更改了的那个样子。

所以上面想分开只想操作arr2又不影响arr1,可以写为

var arr1 = [1,2,3];
var arr2 = [].concat(arr1);
arr2.push(4);
console.log(arr1)//[1,2,3]

 同样的也有JSON等。

json里面有浅复制功能。比如:

 let person1 = {
                name: "hhh",
                age: 14,
                phone: 145645645
            }
            let person2 = {};
            for (const key in person1) {
                person2[key] = person1[key]
            }

这种只能 是JSON key值 是字符串或者数字,布尔值这些。

如果JSON 里面有数组或者 再嵌套有obj类的也还是会共用内存。所以要深度克隆。

  function cloneObj(obj) {
                var str,
                    newobj = obj.constructor === Array ? [] : {};
                if (typeof obj !== "object") {
                    return;
                } else if (window.JSON) {
                    str = JSON.stringify(obj);//序列化对象
                    newobj = JSON.parse(str); //还原
                } else {
                    //如果不支持以上方法
                    for (var i in obj) {
                        newobj[i] =
                            typeof obj[i] === "object" ? cloneObj(obj[i]) : obj[i];
                    }
                }
                return newobj;
            }

 

标签:obj,对象,js,JSON,arr2,arr1,var,内存地址
From: https://www.cnblogs.com/zhu4c4/p/16983005.html

相关文章

  • #yyds干货盘点#node.js链接MongoDB数据库
    在这之前确保当前环境下安装了mongodb的模块,且mongodb数据库已经启动,安装mongodb模块到当前目录可以通过yarnaddmongodb我此时安装的是v4.1.4版本的mongodb常见的连接方法......
  • js 判断变量是否为对象
    使用toString()letobj={}varres1=Object.prototype.toString.call(obj)==='[objectObject]'console.log(res1);//truevarres2=Object.prototype.toS......
  • Qt平台下使用QJson 使用
    前言在Qt开发环境下使用Json的解析和输出当然要使用QJson来完成。QJson解析JSON主要使用的类如下#include<QJsonDocument>#include<QJsonObject>#include<QJsonArray>......
  • js60秒倒计时防刷新
    JavaScript倒计时,实现起来不难,但是一刷新往往就重新计算了,如果要实现刷新不重计该如何做呢?有这么几种思路,    1:cookie    2:本地缓存    3:window.name……......
  • leaflet 使用kriging-contour.js 与 turf.js生成等值面
    效果如下:leaflet生成等值面网上搜索了好多资料但测试感觉都有点瑕疵,kriging.js 生成的canvas图片每个都是小方格影响美感,turf.js会有非法Polygon且有白色缝隙。就想着可......
  • 第一百一十三篇: JS数组Array(二)数组方法 栈、队列、排序
    好家伙,  在上一篇中,我们知道了,JS的数组中每个槽位可以存储任意类型的数据那么,我们能通过数组去模仿某些数据结构吗?答案是肯定的 1.栈方法ECMAScript给数组......
  • JS使用递归将原始数据转换为树形结构数据
    因为数据库中存放的数据终究全是扁平化的,因此获取后要手动将其改成树形结构,方便el-tree进行渲染。假设数据如下(至少是要有节点ID和父节点ID)   最终要达到如下效果(e......
  • webgl(three.js)3D光伏,3D太阳能能源,3D智慧光伏、光伏发电、清洁能源三维可视化解决
    3D太阳能、三维光伏、三维储能、使用three.js(webgl)搭建智慧楼宇、3D园区、3D厂房、3D仓库、设备检测、数字孪生、物联网3D、物业3D监控、物业基础设施......
  • vscode运行js文件
    一、首先你需要下载安装​​nodejs​​​​​下载地址​​二、在VSCode中有一个插件​​coderunner​​​,安装后可以直接运行在​​node​​环境中,然后就可以在vsc......
  • omitjs简单使用
    欢迎关注前端早茶,与广东靓仔携手共同进阶​前端早茶专注前端,一起结伴同行,紧跟业界发展步伐~1、omitjs干什么用的返回一个没有列入排除key属性的对象。其中,参数object为JSON......