日期:2014-05-16  浏览次数:20336 次

之前对javascript数组赋值的错误理解。
var tArray=new Array(1,2,3,4,5,6) 
var copy=tArray;

writeLine('tArray.length='+tArray.length)
writeLine('tArray='+tArray.join(','))
writeLine('')

writeLine('copy.length='+copy.length)
writeLine('copy='+copy.join(','))
writeLine('---------------------------------')

copy.length=0;
//原以为copy.length=0;只是改变了copy的值,没想到tArray也变了。
//tArray.length=0

writeLine('tArray.length='+tArray.length)
writeLine('tArray='+tArray.join(','))
writeLine('')

writeLine('copy.length='+copy.length)
writeLine('copy='+copy.join(','))

function writeLine(str){
  document.write(str+'<br>');
}
===============================================
结果输出

tArray.length=6
tArray=1,2,3,4,5,6

copy.length=6
copy=1,2,3,4,5,6
---------------------------------
tArray.length=0
tArray=

copy.length=0
copy=

============================================
从上面的输入结果来看,
在copy.length=0; 的时候,不仅改变了copy的值,tArray的值也改变了,
如果此处换成 tArray.length=0 ,输出结果是一样的。

由此得出 var copy=tArray;tArray赋值给新的变量后,copy与tArray指向是同一个内存地址。
改变length的话,copy和tArray,2个变量的值都会改变。

谢谢各位路过的不吝赐教


------解决方案--------------------
英雄 你不是已经分析完了吗?
------解决方案--------------------
copy数组用 arr.slice()
------解决方案--------------------
你这样给数组赋值 其实就相当于创建了一个指针 指向同一个内存
想copy一份的话 就用循环依次给数组的每一个元素赋值
------解决方案--------------------
var copy=tArray;
这是对象赋值,按地址引用,传递的是地址。相当于对原对象起个别名。所以改变新名就等于改变原对象。

如果是var copy=tArray.length;
是对象下面的数据,则为值引用,传递的是实际的数据,相当于一个备份。改变时互不影响。
------解决方案--------------------
探讨

js除了 字符串和 数字,其他全是引用,包括当参数传给数组

------解决方案--------------------
探讨

js除了 字符串和 数字,其他全是引用,包括当参数传给数组

------解决方案--------------------
探讨
引用:
那怎样做一份tArray的Copy,然后修改Copy的那份而不影响tArray呢?

<script type="text/javascript">
var tArray=new Array(1,2,3,4,5,6)
var copy=tArray.slice();
copy[0]="theforever0";
copy[1]="thefor……

------解决方案--------------------
以前写的一个克隆数组的方
///为数组添加克隆自身的方法,使用递归可用于多级数组
Array.prototype.clone=function(){
var newArr=new Array();
for(var i=0;i<=this.length-1;i++)
{
var itemi=this[i];
if(itemi.length && itemi.push) itemi= itemi.clone();
//else if(typeof(itemi)=="object") itemi=objClone(itemi);
newArr.push(itemi);
}
return newArr;
}