为什么这个函数总是返回“true1”

时间:2015-04-14 13:14:16

标签: javascript

这是一本关于Eloquent JavaScript'中的一个例子的修改版本。需要理解为什么它总是返回" true1"。我的想法是在DOM中找到某个文本,但不知何故,即使我提供了一个html中不存在的文本仍然得到" true1"在控制台上。

请帮助

我的HTML文件:

<!DOCTYPE html>

 <html> 
    <head>      
        <meta charset="UTF-8" />        
        <title> My first JS page</title>
        <script src="script1.js"></script>
    </head> 
    <body>      

        <h1>My first page</h1>
        <p> Hello , I am Mehdi and this is my first page</p>
        <p> And this is the second paragraph on this page and</p>
    </body>
 <script>console.log(talksAbout(document.body, "Tester123"));</script>
</html>

我的Javascript文件

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 "true1";
        }
        return "false1";
    }else if(node.nodeType == document.TEXT_NODE){

        return node.nodeValue.indexOf(string) > -1;
    }


}

2 个答案:

答案 0 :(得分:9)

您的函数使用talksAbout()函数的返回值,就好像它是一个布尔值。但是,该函数可能会返回一个布尔,它可能会返回这两个字符串值"true1""false1"中的一个。当在布尔上下文中使用时,这两个看起来都是true,就像递归调用周围的if语句一样。

答案 1 :(得分:3)

Pointy的回答描述了两个关键问题之一。另一个是你的搜索字符串实际上在文档中!

您将脚本标记与搜索字符串一起包含在文档中。它将被检查以及你走DOM,所以即使你修复了布尔值,只要你在文档中有这样的行,你仍然会返回true

<script>console.log(talksAbout(document.body, "Tester123"));</script>
                                               ^^^^^^^^^  

您可以简单地从Web开发人员那里运行测试。控制台看到这种运行没有这样的问题。