我有以下示例文档
<!doctype html>
<html>
<head>
<title>My home page</title>
</head>
<body>
<h1>My home page</h1>
<p>Hello, I am Marijn and this is my home page.</p>
<p>I also wrote a book! Read it
<a href="http://eloquentjavascript.net">here</a>.</p>
</body>
</html>
我写了一个递归函数来找出字符串是否在文档中
function talksAbout(node, string) {
if(node.nodeType == document.ELEMENT_NODE){
for(var i=0;i<node.childNodes.length;i++){
if(talksAbout(node.childNodes[i],string))
return true;
}
return false;
}
else if(node.nodeType == document.TEXT_NODE){
return (node.nodeValue.indexOf(string) > -1);
}
}
console.log(talksAbout(document.body,"wrote"));
但是当我从
改变第3行中的if语句时if(talksAbout(node.childNodes[i],string))
return true;
简单
return taksAbout(node.childNodes[i],string)
它显示错误的答案。有人发现两者之间存在差异。
答案 0 :(得分:1)
代码
if(talksAbout(node.childNodes[i],string))
return true;
检查调用的返回值,如果结果为true,则返回true。这样做:
return taksAbout(node.childNodes[i],string)
返回迭代的第一项,而不检查其余项。 ;)
答案 1 :(得分:1)
您有一个简单的流逻辑错误:
以下两个伪代码块存在差异:
foreach item in list
if (f(item))
return true;
和
foreach item in list
return f(item)
如果任何项目创建了真实结果,则第一个块将返回true
。
第二个块只会返回true
或false
,具体取决于第一个项目的结果。
您的更改实际上将您的代码块从第一个示例转换为第二个示例。
答案 2 :(得分:0)
函数talksAbout
在所有情况下都不会返回布尔值:
...
else if(node.nodeType == document.TEXT_NODE){
return (node.nodeValue.indexOf(string) > -1);
}
...
如果满足此条件将返回正整数或-1:
如果满足此条件,则返回null。当你检查并返回true
时,如果你的返回值(function())返回函数的返回值,你确保返回值为boolean
,正如我上面所解释的那样,它可能是boolean
integer
或您的函数中的null。
如果你想确保在你的职能部门的所有情况下都返回boolean
只是返回。
希望它有所帮助!