js 数组引用 发现的问题
最近做项目时,要对返回的数据[保存在json数组中]做一次修改,但原数据要保留一次做备用。首先想到,原数据不动,用一个临时的变量来修改,大致模型就是这样:
// 原始: a=[1,2,3,4,5,.........]; // 临时: var b = a ; // 操作: b[b.length] = 1 ;
本来觉得是一个很简单的问题。但测试时候发现,并没得到想要的结果。测了很久才找到问题:a数据居然也跟着b的操作一起发生了改变,怎么都想不通。问了同事,貌似他没遇到过,也搞不清楚怎么回事。只好求助网络查询。查到了一个跟我相似的问题。
其中有这样一个例子:
<script> var a=[1,2,3,4]; //例子1 var b=a; alert(a); //1234 alert(b); //1234 //例子2 var c=a; c[3]=5; alert(c); //1235 alert(a); //1235 //例子3 var d=a[1]; d=10; alert(a); //1234 </script> //结论:数组对数组是引用类型,数组对变量是值类型
其中一个仁兄给出了解释:
JS中没有指针,只有传值(value)与传址(reference引用)的区别
var a = [1,2,3,4] //a不仅是数组,还是个对象,实际上a就是对[1,2,3,4]的引用
var b=a
var c=a
//以上两条赋值语句建立了b与c 对a即[1,2,3,4]的引用,无论改变a 还是b抑或c 都是对[1,2,3,4]的操作,这就是传址(堆中操作)
var d=a[1] //则是把a[1]的值"1"传递给d,对d的改变则不会影响a[1],即所谓的传值(栈中操作)
这才有点明白。还是用原文的结论:
js数组是引用类型,它只允许通过索引来获取或改变数组的值 引用类型的东西都是不能通过(它赋值过的外部变量)所改变的 也就是(它赋值过的外部变量)这个值改变了原数组不会有任何变化
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。