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;
}

 

posted @ 2014-04-09 23:06  三山  阅读(727)  评论(0)    收藏  举报