2016-09-18 38 views
1

我無法讓我的循環繼續工作後,我的對象的第一個屬性。這是從雄辯的JavaScript在第4章的一個問題:對於循環遞歸函數沒有完成

寫一個函數,deepEqual,取兩個值,並返回true 僅當它們是相同的值或具有相同 屬性,其值也是對象與遞歸調用deepEqual的 相比相當。

要找出是否通過身份比較兩件事(使用=== 運算符)或通過查看它們的屬性,可以使用 typeof運算符。如果它爲兩個值生成「對象」,則應該進行深入比較。但是,你必須考慮一個愚蠢的例外: 帳戶:由於歷史事故,typeof null也產生「對象」。

這裏是我的代碼:

function deepEqual(obj1, obj2) { 
    if ((typeof obj1 === 'object' && obj1 != null) && (typeof obj2 === 'object' && obj2 != null)) { 
    for (var property in obj1) { 
     if (property in obj2) { 
     return deepEqual(obj1[property], obj2[property]) 
     } else { 
     return false; 
     } 
    } 
    } else if (obj1 !== obj2) { 
    return false; 
    } else { 
    return true; 
    } 
} 

var obj = {object: 3, here: 1}; 
var obj2 = {object: 3, here: 2}; 

console.log(deepEqual(obj, obj2)); 

控制檯返回true,當它應該說是假的,因爲「這裏的屬性是不相等的。查看輸出時,這是因爲函數中的「for in循環」在第一個屬性之後退出。請幫助我爲什麼它不會繼續循環。

回答

0

您的循環,因爲您返回該功能的,當你調用deepEqual

for (var property in obj1) { 
     if (property in obj2) { 
     // returning means no more looping.... 
     return deepEqual(obj1[property], obj2[property]) 
     } 

要進行循環,如果deepEqual返回其相等,或者如果返回不能超越第一屬性的假。

+0

感謝您的評論!你的回答是有道理的,我通過用'if(!deepEqual(obj1 [property],obj2 [property]))來代替返回值來工作「) return false;'。 – runandrew