Array.length偶尔不会重新检查数组长度

时间:2015-06-20 12:32:57

标签: javascript google-apps-script

我在Google脚本中有一个相对简单的功能,偶尔会出现我的预期。

我有一个字符串数组和一个随机数生成器。生成随机数时,它将数组值作为随机数的索引,将其拼接出来并返回。这确保了我只从阵列中获得唯一值。代码如下:

function testFunction() {
      var array = [
     "Test String 1", "Test String 2", "Test String 3", "Test string 4"
      ];

     var randomNum = generateRandomNumber(array.length - 1,0);

     Logger.log(array.length);
     var arrayStringOne = array.splice(randomNum, 1);
     Logger.log(array.length);
     var arrayStringTwo = array.splice(randomNum, 1);
     Logger.log(array.length);
     var arrayStringThree = array.splice(randomNum, 1);
     Logger.log(array.length);
     return [arrayStringOne,arrayStringTwo,arrayStringThree];
     }

function generateRandomNumber(maximum, minimum){
         var randomNumber = Math.round(Math.random() * (maximum - minimum) + minimum);
         return randomNumber;
         }  

虽然我通常会看到阵列长度被正确扣除(例如,当运行时阵列从4到3变为2到1),偶尔它会在中途停止缩短,我不知道为什么(所以我将看到数组长度为4,3,3,3而不是4,3,2,1)。

这是我日志的屏幕截图:

enter image description here

与它应该做什么:

enter image description here

有趣的是,它并不总是在同一个地方打破。有时它会进一步向下突破,我会看到一个像4,3,2,2这样的数组长度返回:

enter image description here

此外,当generateRandomNumber(array.length - 1,0)未被指定为变量,而是直接放入拼接方法时,这似乎不会发生,如下例所示:

function testFunction() {             
    var array = [
        "Test String 1", "Test String 2", "Test String 3", "Test string 4"
    ];

         Logger.log(array.length);
         var arrayStringOne = array.splice(generateRandomNumber(array.length - 1,0), 1);
         Logger.log(array.length);
         var arrayStringTwo = array.splice(generateRandomNumber(array.length - 1,0), 1);
         Logger.log(array.length);
         var arrayStringThree = array.splice(generateRandomNumber(array.length - 1,0), 1);
         Logger.log(array.length);
         return [arrayStringOne,arrayStringTwo,arrayStringThree];
         }

function generateRandomNumber(maximum, minimum) {
         var randomNumber = Math.round(Math.random() * (maximum - minimum) + minimum);
         return randomNumber;
         }    

这对我来说是一个非必要的脚本,而且这个"解决方法"是一个很好的替代品,但我很好奇为什么会这样。最初我想象一下,一旦我分配了变量:

var randomNum = generateRandomNumber(array.length - 1,0);

Javascript(或者应用程序脚本)只会检查一次数组长度,而不会再次检查,但事实上它主要工作且有时会中断(或者在不同的地方中断)这让我很难过。这是Javascript或Apps脚本的怪癖吗?是什么造成的?是否有可能存在某种竞争条件,在前一个splice方法更新数组之前检查数组长度?为什么当它没有被指定为变量时似乎不会发生?

我对这里的任何想法或评论最感兴趣。

1 个答案:

答案 0 :(得分:1)

现在randomNum对于每个splice ()调用都是相同的,因为它只在开头设置一次。正如@Andreas建议的那样,如果它在开始时是3,那么它只会删除一次元素。事实上,如果它是0,你只会得到你想要的输出。试着让randomNum成为一个函数:

var randomNum = function () {
    return generateRandomNumber(array.length - 1,0);
}