Javascript递归没有停止

Javascript递归没有停止,javascript,recursion,Javascript,Recursion,我有两个问题 为什么警报在第四次警报后仍在继续? 为什么它会为前两项带来第一个[object object],然后为其他两项带来单独的object。 因为它是一个无限循环,因为它在字符串o上运行相同的操作,所以在调用alertJson之前确实需要检查类型 因为当你串一个对象时,它返回[object object],而对象本身就是字符串对象 代码 或者您可以使用回答第二个问题: 当变量obj[k]被alert函数调用时,该函数调用.toString: 我想你想打电话 var a = {}; con

我有两个问题

为什么警报在第四次警报后仍在继续? 为什么它会为前两项带来第一个[object object],然后为其他两项带来单独的object。 因为它是一个无限循环,因为它在字符串o上运行相同的操作,所以在调用alertJson之前确实需要检查类型

因为当你串一个对象时,它返回[object object],而对象本身就是字符串对象

代码


或者您可以使用

回答第二个问题:

当变量obj[k]被alert函数调用时,该函数调用.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"
而不是

alert(k);
使用alertk应该会让您: a>复杂>嵌套>0

当调用传入字符串的alertJson时会导致递归。当这种情况发生时,您迭代字符串,并将每个字符作为1个字符的字符串调用alertJson

这把小提琴应该更接近你的预期:

为什么警报在第四次警报后仍在继续

因为您在字符串“object”上调用了alertJson。for循环随后将迭代字符串的每个字符,然后对每个字符调用alertJson。所以它将调用alertJson'o',然后再次调用alertJson'o',这是字符串的第一个也是唯一的字符,依此类推,因为字符串没有退出条件

为什么它会为前两项带来第一个[object object],然后为其他两项带来单独的object


对象的默认字符串表示形式为[object]。数组的元素是它们元素的串联,由于数组只有一个元素,所以输出是object。字符串“object”显然会导致输出对象。

我认为Felix Kling已经非常清楚地回答了您的问题。无论如何,这里是你的代码的更新版本

alert(obj[k]);
如果对象没有自己的属性,也不是从原型继承的,那么我们不需要该值,所以我们跳过它并循环到下一个属性。持续告诉循环继续,而不读取循环中的其余语句

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;
当您位于['object'][0]时,您将拥有string对象,并且您将继续使用o作为参数调用函数。
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]);}