3.6 更新数组
如图3-4所示,这个Bingo卡片脚本还无法确保给定的列中不出现重复的数字。这个示例要纠正这个问题,同时说明数组不必进行初始化并读取,而是可以在运行时声明和设置它们。这会提供很大的灵活性,因为可以在脚本运行时通过计算或函数修改数组中的值。脚本3-8演示了具体的做法,其中只有几行新代码。
脚本3-8 在脚本运行期间修改数组的内容是一种非常强大的技术
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 = colBasis + getNewNum() + 1;
if (!usedNums[newNum]) {
usedNums[newNum] = true;
document.getElementById(currSquare).innerHTML = newNum;
}
}
function getNewNum() {
return Math.floor(Math.random() * 15);
}
在运行时更新数组的步骤如下:
(1) var usedNums = new Array(76);
这是一种声明数组的新方法。我们将usedNums变量声明为一个包含76个对象的新数组。正如前面提到的,这些对象可以是任何东西。在这个示例中,它们是布尔值,即true/false值。
(2) if (!usedNums[newNum]) {
usedNums[newNum] = true;
如果usedNums数组中的newNum位置上是false(表达式前面的!表示“非”),那么就将它设置为true,并将newNum写到卡片上。如果newNum位置上是true,就什么也不做。这样就不会有重复的数字,但是卡片上可能会留下空的格子(图3-5)。在下一节中我们要解决这个缺陷。

图3-5 我们消除了重复的数字,但是现在留下了一些空格子,还需要重新来过
ü提示
q 为什么这个数组要包含76个元素?因为我们希望使用1~75的值。如果将它声明为包含75个元素,那么编号是从0~74。76个元素允许我们使用1~75的值,只需忽略第0号元素即可。
q 如果不对布尔值进行初始化,那么它们会自动地设置为false。







