之前对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;
是对象下面的数据,则为值引用,传递的是实际的数据,相当于一个备份。改变时互不影响。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------以前写的一个克隆数组的方
///为数组添加克隆自身的方法,使用递归可用于多级数组
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;
}