Javascript 变量被意外覆盖

Javascript 变量被意外覆盖,javascript,variables,module,appcelerator,commonjs,Javascript,Variables,Module,Appcelerator,Commonjs,我在我的应用程序中观察到一种(对我来说)无法解释的行为。 我通过require()有几个include。在其中一个名为“addUserFunction.js”的函数中,我有两个函数和一个包含对象的数组。 这是对象数组的定义: 这是两个功能的定义: 原因是我不复制元素,我只链接到它,因为它是我想要复制的对象=不复制对象,只复制简单的变量类型,如数组、整数、布尔值等 我创建了一个新函数,该函数了解此对象的结构,并按属性复制属性: exports.copyListItem = function(i

我在我的应用程序中观察到一种(对我来说)无法解释的行为。 我通过require()有几个include。在其中一个名为“addUserFunction.js”的函数中,我有两个函数和一个包含对象的数组。
这是对象数组的定义:

这是两个功能的定义:


原因是我不复制元素,我只链接到它,因为它是我想要复制的对象
=
不复制对象,只复制简单的变量类型,如数组、整数、布尔值等

我创建了一个新函数,该函数了解此对象的结构,并按属性复制属性:

exports.copyListItem = function(item) {
    var newItem = {};
    newItem.itemType = item.itemType;
    newItem.itemName = item.itemName;
    // and so on
    return newItem;
}
这不是最优雅的方式,但它很有效。要了解更一般的方法,请查看以下内容:


我在回答我自己的问题,因为原始答案只是一个注释,并且(到目前为止)对我的反注释没有反应。

原因是我不复制元素,我只链接到它,因为它是我要复制的对象
=
不复制对象,只复制简单的变量类型,如数组、整数、布尔值等

我创建了一个新函数,该函数了解此对象的结构,并按属性复制属性:

exports.copyListItem = function(item) {
    var newItem = {};
    newItem.itemType = item.itemType;
    newItem.itemName = item.itemName;
    // and so on
    return newItem;
}
这不是最优雅的方式,但它很有效。要了解更一般的方法,请查看以下内容:


我在回答我自己的问题,因为原始答案只是一个注释,并且(到目前为止)对我的反注释没有反应。

无论何时为对象(包括所有类型的对象,甚至数组)分配变量或属性,都会分配对象实例引用的值。也就是说,如果我有

a = {};
b = a;
然后是
a.foo=1
,然后也是
b.foo==1
。但是如果你做了
a=null,b仍然指向它以前指向的同一个对象。您在代码中所做的一切就是在数组中挖掘,找到一个合适的条目,返回对该条目的引用。您要做的是将该引用用作创建新对象的模板。有几种方法可以创建这样的对象。最常见的方法是使用公共库的
extend
方法之一。但是,如果对象的深度超过一级,或者对象由非平凡对象组成,那么事情可能会变得棘手,并且可能无法使用这些通用方法创建对象的深度副本,而只能创建较浅的副本


最简单的方法是修改
getItem
以克隆模板,特别是将所需的属性复制到新对象中。如果模板中的任何属性引用了您可能需要其副本的某个对象,请确保也复制了该对象。

无论何时将变量或属性指定给对象(这包括所有类型的对象,甚至数组),所分配的都是对对象实例的引用值。也就是说,如果我有

a = {};
b = a;
然后是
a.foo=1
,然后也是
b.foo==1
。但是如果你做了
a=null,b仍然指向它以前指向的同一个对象。您在代码中所做的一切就是在数组中挖掘,找到一个合适的条目,返回对该条目的引用。您要做的是将该引用用作创建新对象的模板。有几种方法可以创建这样的对象。最常见的方法是使用公共库的
extend
方法之一。但是,如果对象的深度超过一级,或者对象由非平凡对象组成,那么事情可能会变得棘手,并且可能无法使用这些通用方法创建对象的深度副本,而只能创建较浅的副本


最简单的方法是修改
getItem
以克隆模板,特别是将所需的属性复制到新对象中。如果模板中的任何属性引用了您可能需要复制的某个对象,请确保也复制了该对象。

“似乎”要链接吗?它没有链接。您希望复制对象,而不是获取其引用。我不确定你需要多浅/多深的副本。可能是深度复制。有几种方法可以做到这一点。哦,好吧,多愚蠢的错误啊。非常感谢!如果您将您的评论转换为答案,您将获得一张赞成票和一张接受票。:)“似乎”链接?它没有链接。您希望复制对象,而不是获取其引用。我不确定你需要多浅/多深的副本。可能是深度复制。有几种方法可以做到这一点。哦,好吧,多愚蠢的错误啊。非常感谢!如果您将您的评论转换为答案,您将获得一张赞成票和一张接受票。:)顺便说一句,数组和其他对象一样<代码>a={stuff:[]};b=a;b、 东西。推(“第一!”)
表示数组
a.stuff
指向的(即同一数组)现在有一个元素“first!”。更好的例子是:
a=[];b=a;b、 推(“某物”)
a
b
仍然指向同一个数组,该数组现在只有一个元素。顺便说一句,数组与其他对象一样<代码>a={stuff:[]};b=a;b、 东西。推(“第一!”)
表示数组
a.stuff
指向的(即同一数组)现在有一个元素“first!”。更好的例子是:
a=[];b=a;b、 推(“某物”)
a
b
仍然指向同一个数组,该数组现在只有一个元素。
a = {};
b = a;