在 Javascript 程序中无法理解?

cannot understand while in Javascript programme?

<html lang="en">
    <head>
        <title>Chapter 10: Example 1</title>
    </head>
    <body>
        <img src="usa.gif" onclick="changeImg(this)" />
        <img src="mexico.gif" onclick="changeImg(this)" />
        <script>
            var myImages = [
                "usa.gif",
                "canada.gif",
                "jamaica.gif",
                "mexico.gif"
            ];

            function changeImg(that) {
                var newImgNumber = Math.round(Math.random() * 3);
                while (that.src.indexOf(myImages[newImgNumber]) != -1) {
                    newImgNumber = Math.round(Math.random() * 3);
                }
                that.src = myImages[newImgNumber];
            }
        </script>
</body>
</html>

程序作者在代码解释中说: while 循环的目的是确保您不会 select 与当前图像相同。如果 myImages[newImgNumber] 中包含的字符串在当前图像的 src 属性 中找到,你知道它是相同的并且你需要得到另一个随机 number.You 继续循环直到你得到一个新的图像,此时在现有弧中找不到myImages[newImgNumber]indexOf()方法将返回-1,跳出循环。

我根本无法理解 explanation.Can 任何人都可以换句话说给我解释一下吗?代码来自 Beginning Javascript 5e,Jeremy Mcpeak,Chapter Events.

来自 W3Schools 上的 indexOf():

This method returns -1 if the value to search for never occurs.

循环继续,直到找到有效的 newImgNumber(索引)。

你可以这样看数组:

myImages[0] = "usa.gif";
myImages[1] = "canada.gif";
myImages[2] = "jamaica.gif";
myImages[3] = "mexico.gif";

因此,当您获得 0-3 之间的随机数时,您需要确保幻灯片放映中的下一张图片 src 与当前显示的 src 不同。

  • 它生成一个随机数,它将用作 myImages 数组中的索引
  • myImages[newImgNumber] 将检索随机检索图像的相应名称, 因此它采用此名称并检查它是否与 src 属性中的名称不匹配。 它通过调用 indexOf 来做到这一点,其中 return 是找到传入(参数)字符串的上下文字符串中的索引;如果找不到则 indexOf returns -1。例如 strA.indexOf(strB); returns strA 中的索引,其中 strB 存在。
  • 所以如果 indexOf 调用 的结果不是 -1 那么当前随机检索的图像名称匹配* src 属性。只有当结果 -1 时,此函数才认为它们是不同的名称。

while 循环可能有点难以理解,因为它从头到尾处理问题:它说只要 indexOf 方法 does 找到随机检索的名称,然后它应该随机检索另一个名称并尝试直到 indexOf does return -1,这暗示这个随机检索的名字是新的。

如果它是一个新名称,那么它将通过 while 循环,然后将其分配给 src 属性。

[*] 使用 indexOf 来确定它们是否是同一图像是非常薄弱的​​。例如,如果调用了现有的 src 属性,比如 "not-usa.gif",那么上述函数中的条件仍然表明它与 "usa.gif" 同名,这显然是错误的。

Math.random() * 3 给出 0 到 3 之间的数字。myImages[newImgNumber] 给出数组中图像名称之一的名称。例如,如果您调用 changeImg(myImg) 并且 myImg 是 <img src="usa.gif" />,那么函数内部 that.src"usa.gif"that.src.indexOf("usa.gif") ("usa.gif".indexOf("usa.gif")) 将 return 0,所以循环会继续,你会得到一个新的随机数。在下一次迭代中,它将是 that.src.indexOf("canada.gif"),它将是 return -1,因为在 "usa.gif" 中找不到 "canada.gif",它将是 return -1 并且它将退出循环。