JavaScript对象标识

时间:2016-07-29 09:23:03

标签: javascript object identity

我目前正在开发我的第一个更复杂的JavaScript项目。到目前为止一切正常,但现在我有点卡住了。

我有一个中心对象数组。这些对象是由构造函数生成的,如果重要的话。

让我在继续之前向您展示有问题的代码:

this.VariableChanged = function (variable) {
    for (var i = 0; i < ruleSets.length; i++) {
        var triggers = ruleSets[i].GetTriggers();
        for (var j = 0; j < triggers.length; j++) {
            projectManager.VariableManager.GetVariable("MyVariableName").value = "SomeOtherValue";
            if (triggers[i] == variable) {
                ruleSets[i].Trigger();
            }
        }
    }
}

我在最内部的for循环中添加了第一行代码,以检查对象triggers[i]variable是否相同。仅用于调试目的。事实上它们似乎是这两个对象在这行代码之后的value属性中保存SomeOtherValue

但是triggers[i] == variable返回false。这怎么可能?

我可以使用属于每个Variable对象的ID,因此这不是showstopper。但是我想知道这里发生了什么。

3 个答案:

答案 0 :(得分:0)

我的猜测是两个对象的.value属性是相同的,但是包含的对象不是。想象一下:

person = { name: 'Bob' };
a = { guy: person };
b = { guy: person };

// The containing objects are not the same
a === b; // false

// But their property 'guy' is!
a.guy === b.guy; // true

// so changing it, changes it in both objects
person.name = 'John';
a.guy; // { name: 'John' };
b.guy; // { name: 'John' };

两个对象在其中包含相同对象的事实并不意味着包含的对象是相同的。

答案 1 :(得分:0)

如果您比较两个对象,它将始终返回false。例如:

b = {};
a = {};
a == b
// Output : false

为了根据它们的值比较两个对象,可以在一个对象中运行'for in'循环,并比较另一个对象中该属性的值。希望你明白。

答案 2 :(得分:0)

好的,这是:

在我的代码的一部分中,我没有在上面发布,我将一个数组推入另一个。不是每个项目都是单独的,而是整个阵列。 出于某种原因,在将数组推入另一个数组后,两个数组中的对象不再相同。

如果我一个接一个地推它们,它就可以了。 这是一个简单的例子:

var array1 = [{}];
var array2 = [];

array2.push(array1);

//Alerts false
alert(array2[0] == array1[0]);

array2 = [];
array2.push(array1[0]);

//Alerts true
alert(array2[0] == array1[0]);