【问题标题】:What does this do in JavaScript: array[n] = true;这在 JavaScript 中做了什么:array[n] = true;
【发布时间】:2014-09-22 04:19:55
【问题描述】:

我有下面的代码为宾果卡生成不重复的随机数。 为了您理解,我也放了相同的HTML代码:

window.onload = newCard;
var usedNums = new Array(76);


function newCard() {
    if (document.getElementById) {
        for (var i=0; i<24; i++) {
            setSquare(i);
        }
    }
    else {
        alert("Sorry, your browser doesn't support this script");
    }
}

function setSquare(thisSquare) {
    var currSquare = "square" + thisSquare;
    var colPlace = new Array(0,1,2,3,4,0,1,2,3,4,0,1,3,4,0,1,2,3,4,0,1,2,3,4);
    var colBasis = colPlace[thisSquare] * 15;
    var newNum;

    do {
        newNum = colBasis + getNewNum() + 1;
    }
    while (usedNums[newNum]);

    usedNums[newNum] = true;
    document.getElementById(currSquare).innerHTML = newNum;
}

function getNewNum() {
    return Math.floor(Math.random() * 15);
}

================================================ ====================================

    <html>
<head>
    <title>Make Your Own Bingo Card</title>
    <link rel="stylesheet" rev="stylesheet" href="script.css" />
    <script type="text/javascript" src="script.js">
    </script>
</head>
<body>
<h1>Create A Bingo Card</h1>
<table>
    <tr>
        <th width="20%">B</th>
        <th width="20%">I</th>
        <th width="20%">N</th>
        <th width="20%">G</th>
        <th width="20%">O</th>
    </tr>
    <tr>
        <td id="square0">&nbsp;</td>
        <td id="square1">&nbsp;</td>
        <td id="square2">&nbsp;</td>
        <td id="square3">&nbsp;</td>
        <td id="square4">&nbsp;</td>
    </tr>
    <tr>
        <td id="square5">&nbsp;</td>
        <td id="square6">&nbsp;</td>
        <td id="square7">&nbsp;</td>
        <td id="square8">&nbsp;</td>
        <td id="square9">&nbsp;</td>
    </tr>
    <tr>
        <td id="square10">&nbsp;</td>
        <td id="square11">&nbsp;</td>
        <td id="free">Free</td>
        <td id="square12">&nbsp;</td>
        <td id="square13">&nbsp;</td>
    </tr>
    <tr>
        <td id="square14">&nbsp;</td>
        <td id="square15">&nbsp;</td>
        <td id="square16">&nbsp;</td>
        <td id="square17">&nbsp;</td>
        <td id="square18">&nbsp;</td>
    </tr>
    <tr>
        <td id="square19">&nbsp;</td>
        <td id="square20">&nbsp;</td>
        <td id="square21">&nbsp;</td>
        <td id="square22">&nbsp;</td>
        <td id="square23">&nbsp;</td>
    </tr>
</table>
<p><a href="script.html" id="reload">Click here</a> to create a new card</p>
</body>
</html>

“while (usedNums[newNum]);”是否正确?正在检查数组中是否存在数字? 正确吗,“usedNums[newNum] = true;”是否将数组中的项目设置为非零值?

如果以上两个问题都正确,那我想知道,它是如何产生不重复的随机数的?

如果我将“usedNums[newNum]”设置为false,它会产生重复的数字,你能解释一下这个语句的后端功能吗?

如果方便的话,也贴一下参考链接,这个我想详细研究一下。

【问题讨论】:

标签: javascript arrays random numbers generator


【解决方案1】:

我将尝试分块解释发生的情况。

首先声明变量newNum

var newNum; //The value is undefined

然后使用do-while-循环。为了简短起见,do-while-loop 的主要好处是它总是至少执行一个。你可以阅读do-while-loop here

do {
    //This will run at least ones.
    newNum = colBasis + getNewNum() + 1;
} while (usedNums[newNum]); //Here we check if the new number is all ready used.

usedNums[newNum] = true;

为了解释上面的 sn-p 我将使用一个例子:

  1. 循环第一次运行并生成数字 3 所以newNum = 3
  2. 检查循环条件,这意味着我们检查usedNums[3] 处的值是否为true
  3. 因为这是我们第一次生成一个数字 usedNums[3]undefined ,其计算结果为 false - 这意味着循环退出。
  4. 我们现在将usedNums[3]的值设置为true,表示该号码已被使用。
  5. 我们尝试生成一个新号码。
  6. 循环第一次运行并再次生成 3 作为新数字。
  7. 检查循环条件,因为usedNums[3] 现在为真,循环再次运行。
  8. 这次循环生成 56 并使用数字 56 而不是 3 重复步骤 2-4。

我希望这可以澄清代码中发生的事情。

【讨论】:

    【解决方案2】:

    第一个说法是正确的。 因为 Javascript 是一种弱类型语言,所以可以进行跨类型比较。 如果一个对象 not 未定义,并且您对其进行布尔比较,它将返回 true。 (反之亦然)

    由于true不是undefined,所以第二个说法也是正确的。

    如果你将usedNums[newNum] 设置为false,你得到重复数字的原因也与此有关。 以下 while 循环(分配随机数)仅在 usedNums[newNum] 等于 falseundefined

    时执行一次
     do {
            newNum = colBasis + getNewNum() + 1;
        }
        while (usedNums[newNum]);
    

    剩下的,这不完全是火箭科学。 如果您想知道它是如何生成随机数的,请查看function getNewNum(因为它正是使用 Javascript 的 Math.random() 函数来实现的)

    为了更好地理解“弱类型”的含义,我建议this wikipedia article on weakly typed vs strong typed

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 2012-02-12
      • 2011-07-24
      • 2013-01-16
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多