ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Javascript」数组和对象的地址引用问题

2022-04-13 21:31:06  阅读:150  来源: 互联网

标签:log 对象 Javascript 地址 数组 var concat


d1f83ad66064c902821cac7c669ae978.png

前言:大家在使用js数组的时候,特别是进行二次复制,然后把临时变量做修改的时候,发现原数组值也被修改了,这时候其实就是一个地址引用的问题。本次就是为大家解释一下发生的几种情况和解决方案

第一种

var a = [1,2,3,4]var b = ab[0] = 5console.log(a)[5,2,3,4]

解释:

JS中是没有指针概念,只有传值、传址(引用)的两种情况所以可以分析var a = [1,2,3,4] #a 代表的不只是一个数组,也是一个数组对象,那么a其实就是[1,2,3,4]的地址那么同样var b = avar c = bvar ...#都是对 [1,2,3,4]的地址使用,并非开一个新的空间#所以就会产生如下情况b[0] = 5#实际修改的是 [1,2,3,4] 的第一个值

解决:

var a = [1,2,3,4]var b = [].concat(a)b[0] = 5console.log(a)[1, 2, 3, 4]解释:concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。所以再使用的时候就不是a的地址了主要针对是一维数组的情况

第二种,使用值的情况

var b = a[0]b = 8console.log(a)[5,2,3,4]

解释:

从上面代码分析,把a索引为0的值,给了b,这时候的b其实用的就是真实的值,并非是一个整体对象,所以在修改b的值时候,不会影响到a所有的数据

第三种,数组内容是对象的时候

var a = [{1:1},{2:2}]var b = [].concat(a)b[0][1] = 3#再打印a0: {1: 3}1: {2: 2}#这时候发现,concat并未启到作用,

解释:

其实这本质还是改变了地址,因为{1:1}本身就是对象,只是放到了数组中,那么connat复制的是第一层,没有针对内容的对象进行重新生成新的值。

解决:

var b = JSON.parse(JSON.stringify(a))b[0][1] = 3#再打印a0: {1: 1}1: {2: 2}#JSON.stringify 是将内容转成了字符串,那么就消除了对象地址那一个层级。这时候再解析成对象,那么就是新的空间了
  相关资源:javascript引用赋值(地址传值)用法实例-其它代码类资源-CSDN文库

标签:log,对象,Javascript,地址,数组,var,concat
来源: https://www.cnblogs.com/tianmakeng/p/16142157.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有