2013-03-13 64 views
0
function alertJson(obj){ 
    if (obj === undefined) return 'undefined\n'; 
    if (obj === null) return 'null\n'; 
    for (var k in obj){  
     alert(obj[k]); 
     alertJson(obj[k]); 
    } 

} 

alertJson({ 
    a: { 
     complicatedly: { 
      nested: ['object'] 
     } 
    } 
}); 

我有兩個問題...的Javascript遞歸沒有停止

  1. 爲什麼警報保持在第四警報後走向何方?
  2. 爲什麼它會爲前兩項帶來第一個[object Object],然後爲其他兩個帶來object
+0

當你在'[ 'object'] [0]'你將得到字符串'object',並且你用''o「'作爲參數繼續調用你的函數。 – Amberlamps 2013-03-13 12:51:45

回答

2
  1. 因爲它是一個無限循環,因爲它是一個運行在串"o"相同的操作,你真的需要調用alertJson

  2. 因爲當你toString()對象返回前檢查類型[object Object]並且對象本身就是字符串對象。

代碼

function alertJson(obj) { 
    //if (obj === undefined) return 'undefined\n'; 
    //if (obj === null) return 'null\n'; 
    for (var prop in obj) { 
     if (obj.hasOwnProperty(prop)) { 
      var val = obj[prop]; 
      console.log(val); 
      if (val && typeof val === "object") { 
       alertJson(val); 
      } 
     } 
    } 
} 

Running example

或者您也可以使用JSON.stringify(obj)

1

要回答你的第二個問題:

當變量obj[k]的報警功能調用它.toString()

var a = {}; 
console.log(a.toString()) // "[object Object]" 
var a = []; 
console.log(a.toString()) // "" 
var a = ["1", "2", "3"]; 
console.log(a.toString()) // "1,2,3" 
2

我想你想打電話

alert(k); 

而不是

alert(obj[k]); 

使用警報(K)應該給你: 「一「>」複雜「>」嵌套「> 0

遞歸是在y ou調用alertJson傳入的字符串。當發生這種情況時,你迭代字符串,並用每個字符調用alertJson(作爲1個字符串)。

這撥弄應該更接近你所期望的:http://jsfiddle.net/9ZKvf/

2

爲什麼警報保持在第四警報後走向何方?

因爲您在字符串'object'上致電alertJson。 for循環將遍歷字符串中的每個字符,然後每個字符都調用alertJson。所以它會調用alertJson('o')alertJson('o')(字符串的第一個(也是唯一的)字符)等等,因爲你沒有字符串的退出條件。

爲什麼它會爲前兩項帶來第一個[object Object],然後爲另外兩個項目單獨提供對象。

對象的默認字符串表示形式爲[object Object]。數組之一是它們元素的串聯,並且由於數組只有一個元素,輸出爲object。字符串'object'顯然會導致輸出object

0

我想Felix Kling已經很清楚地回答了你的問題。無論如何,這裏是你的代碼的更新版本。

function alertJson(obj){ 
    for (var k in obj){ 
     if(!obj.hasOwnProperty(k))continue; 
     alert(k+' : '+obj[k].toString()); 
     if(typeof obj[k]=='object'){alertJson(obj[k]);} 
    } 

} 

alertJson({ 
    a: { 
     complicatedly: { 
      nested: ['object'] 
     } 
    } 
}); 

如果對象沒有自己的財產,它不是從原型繼承,那麼我們不希望這個值,所以我們並循環跳到下一個屬性。繼續;告訴循環繼續不讀的其餘語句,在循環

if(!obj.hasOwnProperty(k))continue; 

我們不希望它通過字符串循環對象一個字符時

if(typeof obj[k]=='object'){alertJson(obj[k]);}