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=0writeLine('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,6copy.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个变量的值都会改变。谢谢各位路过的不吝赐教
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=0writeLine('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,6copy.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一份的话 就用循环依次给数组的每一个元素赋值
这是对象赋值,按地址引用,传递的是地址。相当于对原对象起个别名。所以改变新名就等于改变原对象。如果是var copy=tArray.length;
是对象下面的数据,则为值引用,传递的是实际的数据,相当于一个备份。改变时互不影响。
var tArray=new Array(1,2,3,4,5,6)
var copy=tArray.slice();
copy[0]="theforever0";
copy[1]="theforever1";
copy[2]="theforever2";
alert('原数组:'+tArray.join()+' 新数组:'+copy.join());
</script>
http://www.cftea.com/c/2010/07/TKE282SFVCKL2RLS.asp
var v1 = []
var v2 = {};
var v3 = {};
function foo(_v1, _v2, _v3)
{
_v1[1] = 1;
_v2.a = [2];
_v3.b = {a:3}
}foo(v1, v2, v3);
console.info(v1);
console.info(v2);
console.info(v3);
slice方法对类似int值类型和字符串可以实现拷贝,但是如果数组内存放的是一个引用类型的对象则还是指向原数组的,所以此时必须使用深度拷贝对Array.prototype扩展clone方法
///为数组添加克隆自身的方法,使用递归可用于多级数组
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;
}