更改一个变量的值会影响先前分配给它的变量的值

时间:2015-08-10 10:47:10

标签: javascript node.js

我从以下代码

中的文档中获取mongodb返回的值
collection.find({"Stories._id":ObjectID(storyId)}, {"Stories.$":1}, function (e, docs) {

        var results = docs;
        results[0].Stories = [];
}

我将docs的值分配给结果。然后我将结果中的一个数组更改为空数组。我面临的问题是,如果我改变结果的价值,文档的价值也会受到影响!! 我怎样才能单独更改results[0]的值?

一个简单的JSFIDDLE链接

2 个答案:

答案 0 :(得分:0)

这是因为在java-script数组中,对象本质上是可变的。 如果y是对象,则以下语句不会创建y的副本:

var x = y;  // This will not create a copy of y.

对象x不是y的副本。是的。 x和y都指向同一个对象。

对y的任何更改也会更改x,因为x和y是同一个对象。

您可以使用以下解决方案:

Jquery

    results = $.extend(true,{},docs);//For deep copy
    results = $.extend({},docs);//For shallow copy
    results = JSON.parse(JSON.stringify(docs))

Javascript

function clone(obj) {
       var target = {};
       for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
         target[i] = obj[i];
        }
       }
       return target;
      }

results = clone(docs);

答案 1 :(得分:0)

您可以更改'结果[0]'的值单独而不影响' docs'通过使用范围概念。尝试在函数中进行更改,而不是在直接行或同一层次结构中进行更改。 我写了一个样本here at Fiddle 几个月前,我正在试验如何通过引用传递的概念在JS中的对象方面起作用。我们必须注意到ds.find()的返回类型是一个json。 You can read my article here 感谢。

var docs = [1,2,3];
var results = docs;
console.log(results[0]);


var documents =[ {
'stories':'eshwar',
'place':'Hyd'
},
            {
'stories':'Prasad',
'place':'Del'
},
            {
'stories':'Hari',
'place':'Chennai'
}]

console.log(documents[2]); //prints {stories: "Hari", place: "Chennai"}

function ChangeAlone(documents){
var refDoc = documents;
refDoc[2] =[];    
}
// the value of stories remains same in the parent object without change
console.log(documents[2].stories); //prints Hari