2016-07-29 87 views
0

我目前正在研究我的第一個更復雜的JavaScript項目。到目前爲止,這很順利,但現在我有點卡住了。我有一個對象的中央數組。這些對象由構造函數生成,以防重要。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是相同的。僅用於調試目的。事實上,他們似乎是這兩行對象在代碼行後面的值屬性中保存SomeOtherValue

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

我可以使用屬於每個Variable對象的ID,所以這不是一個showstopper。但我想知道這裏發生了什麼。

+1

我需要你的具體情況更有點背景,而是:「而事實上,他們似乎是,這兩個對象在這行代碼後的值屬性持有SomeOtherValue。」聽起來怪怪的。兩個對象具有相同屬性的事實並不意味着它們是同一個對象。 '''a = {value:1}; b = {value:1}; a == b'''將會是'''false'''。平等與等同不一樣。 – alemangui

+0

在該行代碼之前,兩個對象都保持另一個值。在該行之後,兩個對象都將「SomeOtherValue」作爲新值。 – Mazen

+0

什麼是varialbe值?你是否用projectManager.VariableManager.GetVariable(「MyVariableName」)檢查trigger [i]。value? – Thennarasan

回答

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]); 
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' }; 

兩個對象他們裏面含有相同的對象並不意味着包含的對象是相同的事實。

+0

這是一個很好的觀點。有沒有辦法(例如使用Chrome調試器)檢查兩個引用是否指向同一個對象? – Mazen

+0

當然,只要檢查'''觸發器[i] .value === variable.value'''或兩個內部對象都是:) – alemangui

0

那麼如果你比較兩個對象,它將始終返回false。例如:

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

爲了比較根據它們的值的兩個對象,你可以運行「爲」循環在一個對象和其他對象進行比較的是屬性的值。希望你得到它。