[英]Array.length occasionally does not recheck the array length
我在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)。
這是執行此操作時我的日志的屏幕截圖:
與它應該做什么:
有趣的是,它也不總是在同一個地方破裂。 有時它會進一步中斷,我會看到返回的數組長度為4,3,2,2:
另外,當generateRandomNumber(array.length - 1,0)
沒有分配為變量,而是直接放置在splice方法中時,這似乎從未發生過,如以下示例代碼所示:
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(或Apps腳本)只會檢查一次數組長度,而不會再檢查一次,但是事實證明它大部分有效,而且有時會中斷(或在不同位置中斷)。 這是Javascript還是Apps腳本的怪癖? 是什么原因造成的? 是否可能存在某種競爭條件,即在前一個splice
方法完成更新數組之前檢查數組長度? 如果未將其分配為變量,為什么這似乎沒有發生?
我對這里的任何想法或評論最感興趣。
現在,對於每個splice ()
調用, randomNum
都是相同的,因為在開始時只設置了一次。 正如@Andreas所建議的,如果開頭是3
,那么它將只刪除一次元素。 實際上,只有將其輸出為0時,您才會獲得所需的輸出。嘗試使randomNum
為函數:
var randomNum = function () {
return generateRandomNumber(array.length - 1,0);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.