我在Google腳本中有一個相對簡單的函數,它偶爾不會像我期望的那樣工作。Array.length偶爾不會重新檢查數組長度
我有一個字符串和一個隨機數發生器的數組。當生成一個隨機數時,它將該數組的值作爲隨機數的索引,將其拼接並返回。這確保我只能從數組中獲得唯一的值。的代碼如下:
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)。
這裏是我的日誌截圖它這樣做時:
對戰它應該做的:
有趣的是,它也不會總是在打破一樣的地方。有時它會進一步分解線,我將看到4,3,2,2陣列長度返回:
此外,當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或應用腳本的怪癖嗎?這是什麼造成的?有沒有可能在這裏存在某種競爭條件,在之前的splice
方法完成更新數組之前,數組長度正在被檢查?爲什麼當它沒有被指定爲變量時,這似乎不會發生?
我最感興趣的任何想法或評論在這裏。
讓'randomNum'是'3 // ==(array.length - 1)'所以你會用第一個'.splice()'去掉最後一個元素。在下一個'.splice()''randomNum'仍然是'3',但'array'現在只有3個元素。因此'.splice()'不會從數組中移除一個元素。 – Andreas