2013-03-13 69 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]);}