這一點,而(不幸)在技術上有效的JavaScript,不會做你想要的:
dice[[dieOne][dieTwo]]
表達式foo[bar]
是對foo
的屬性bar
的引用。屬性鍵總是字符串或數字(技術上只是字符串,但如果我們談論數組,則將鍵看作數字更有意義)。因此,當JavaScript看到表達式dice[[dieOne][dieTwo]]
時,它會嘗試將[dieOne][dieTwo]
強制轉換爲有效的屬性鍵。隨之而來的古怪如下:
[dieOne]
的計算結果爲包含一個元素在索引0處,其值是dieOne
陣列;讓這個中間結果在下文中被稱爲foo
。
foo[dieTwo]
評估爲到其索引爲dieTwo
- 由於,在循環的每一次迭代,
dieTwo
是總是> 0的foo
屬性的引用,並且foo
是一個數組,其僅有效的索引是0
,dieTwo
是出的界限。不幸的是,該數組返回undefined
而不是拋出錯誤。
- 值
undefined
被強制爲一個字符串,因此它可以用作屬性鍵。從技術上講,只有字符串是屬性鍵;根據標準,陣列是僞造的。值爲"undefined"
。
- 由於您的代碼尚未將值賦予
dice["undefined"]
,所以第一次嘗試++
時,它將其初始值再次視爲undefined
。再次,不是拋出異常,它不幸地將undefined
強制轉換爲看起來像你想要的,數字0
,增量爲1
,並將其分配給新定義的dice["undefined"]
。
- 如果您的瀏覽器遵循ES5標準,
undefined++
將是NaN
。
- 由於按照上述步驟,
[dieOne][dieTwo]
是ALWAYS強制爲"undefined"
,所述dice
屬性是基於循環的每次迭代遞增一次,給它的一個30000
最終值。
- 如果您的瀏覽器遵循ES5標準,則無論您增加多少次,
NaN++
都應爲NaN
。
- 因爲任何
[foo][bar]
其中bar
不0
,當強制轉換爲屬性鍵,將"undefined"
根據上述步驟,dice[[n][m]]
總是相當於dice["undefined"]
。只是爲了好玩,試試dice[[n][0]]
其中n
是除"undefined"
以外的任何東西,以驗證它不是30000
,因此我是對的,並且應該有複選標記= D。
所以這就是爲什麼你會得到這樣的結果。
在JS中沒有真正的多維數組,如果您將它想象爲一個數組數組,可能會更少地混淆語法。然後,你可以把它分解爲若干步驟:
dice
是一個數字數組的數組,
- 所以
dice[n]
是數字數組,
- 所以
dice[n][m]
是我想要的號碼。
因此,這裏是你的大致正確的程序將是什麼樣子:
/* We don't like undefined anymore, so make an array of 7 arrays of 7 zeroes */
/* (we need 7 because JS array indexes start at 0 and you're using values 1-6) */
var dice = [
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0]
];
/* Now I'm tired of repeating myself, so let's DRY things up */
function roll() {
return Math.floor(Math.random()*6) + 1;
}
var dieOne, dieTwo;
for (var i = 0 ; i < 30000 ; i++) {
dieOne = roll();
dieTwo = roll();
dice[dieOne][dieTwo]++;
}
看是最後一行的最重要的部分。
dice
是數字的陣列的陣列,
- 所以
dice[dieOne]
是數字數組,
- 所以
dice[dieOne][dieTwo]
是一個數字,我們可以有意義地遞增。
你想幹什麼? – Popnoodles
你如何期望成爲你的輸出數組? –
我期待陣列在1和6之間隨機點增加一個。 例如,如果dieOne = 5且dieTwo = 3,我希望dice [5] [3]增加1。 –