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