javascript对象引用小记
在js中使用forEach等构成循环类的语句时,引用外层的对象,在循环体中不断的赋值给这个对象的一个属性,到最终操作的都是循环之后这个属性最后的值。
eg:
var
testObj = {"a":1,"b":2}, testArr = [1,2,3,4,5], newArr = [];
testArr.forEach(function(index){ testObj.c = index; newArr.push(testObj); }); console.log(newArr);
这里主要的问题是对象的引用,初学者容易以为可以得到的C每个都是不同的,其实newArr里面push进来的都是testObj这个对象,这个对象始终定义在外面,最后在newArr里面的testObj都将是同一个值,并且c将是循环最后的值。
具体分析可以参看《js高级程序设计》
解决方案有对象的克隆方案,还有相关的深浅拷贝方案,主要是思路便是克隆该对象得到一个新的可以修改引用的对象
第一种方法克隆前后的对象引用不再一样:
var cloneObj = function(obj){ if(obj){ return JSON.parse(JSON.stringify(obj)); } return obj; }
第二种方法是对象的浅拷贝,拷贝的对象与被拷贝的对象的属性的引用是一样的,新加的属性则是不同的引用:
var copyObj = function (obj) { var newObj = {}; for (var i in obj) { if (obj.hasOwnProperty(i)) { newObj[i] = obj[i]; } } return newObj; }

浙公网安备 33010602011771号