RangeError: invalid array length
ç¶ä½ æå®ä¸åè² æ¸ãæµ®é»æ¸ï¼æè¶
é平尿¯æ´æå¤§å¼çé£åé·åº¦æï¼æç¼ç JavaScript çãInvalid array lengthãä¾å¤ï¼ä¾å¦ï¼å¨å»ºç« Array æ ArrayBuffer æï¼æå¨è¨å® length å±¬æ§æï¼ã
å
許çæå¤§é£åé·åº¦å決æ¼å¹³å°ãç覽å¨åç覽å¨çæ¬ãå°æ¼ Arrayï¼æå¤§é·åº¦çº 232-1ãå°æ¼ ArrayBufferï¼å¨ 32 ä½å
系統ä¸ï¼æå¤§é·åº¦çº 231-1ï¼2GiB-1ï¼ãå¾ Firefox 89 çéå§ï¼å¨ 64 ä½å
系統ä¸ï¼ArrayBuffer çæå¤§å¼çº 233ï¼8GiBï¼ã
å註ï¼Array å ArrayBuffer æ¯ç¨ç«çè³æçµæ§ï¼å
¶ä¸ä¸åç實ä½ä¸æå½±é¿å¦ä¸åï¼ã
è¨æ¯
RangeError: invalid array length (V8-based & Firefox) RangeError: Array size is not a small enough positive integer. (Safari) RangeError: Invalid array buffer length (V8-based) RangeError: length too large (Safari)
é¯èª¤é¡å
RangeError
åªè£¡åºé¯äºï¼
ç¶è©¦å使ç¨ç¡æçé·åº¦ä¾ç¢ç Array æ ArrayBuffer æï¼å¯è½æåºç¾æ¤é¯èª¤ï¼ç¡æé·åº¦å
å«ï¼
- éé建æ§åæè¨å®
length屬æ§ä¾æå®è² æ¸é·åº¦ã - éé建æ§åæè¨å®
length屬æ§ä¾æå®éæ´æ¸é·åº¦ãï¼ArrayBuffer建æ§åæå°é·åº¦å¼·å¶è½æçºæ´æ¸ï¼ä½Array建æ§å䏿ãï¼ - è¶
é平尿¯æ´çæå¤§é·åº¦ãå°æ¼é£åï¼æå¤§é·åº¦çº 232-1ãå°æ¼
ArrayBufferï¼å¨ 32 ä½å 系統ä¸ï¼æå¤§é·åº¦çº 231-1ï¼2GiB-1ï¼ï¼æå¨ 64 ä½å 系統ä¸çº 233ï¼8GiBï¼ãéå¯è½éé建æ§åãè¨å®length屬æ§ï¼æé±å«è¨å® length 屬æ§çé£åæ¹æ³ï¼ä¾å¦pushåconcatï¼ç¼çã
å¦æä½ æ£å¨ä½¿ç¨å»ºæ§åå»ºç« Arrayï¼ä½ å¯è½æ³æ¹ç¨åé¢å¼è¡¨ç¤ºæ³ï¼å çºç¬¬ä¸å弿¸æè¢«è§£éçº Array çé·åº¦ãå¦åï¼ä½ å¯è½ææ³å¨è¨å® length å±¬æ§æå°å
¶ä½çºå»ºæ§åç弿¸ä¹åï¼å
éå¶é·åº¦çç¯åã
ç¯ä¾
>ç¡æçæ¡ä¾
new Array(2 ** 40);
new Array(-1);
new ArrayBuffer(2 ** 32); // 32 ä½å
系統
new ArrayBuffer(-1);
const a = [];
a.length -= 1; // å° length 屬æ§è¨çº -1
const b = new Array(2 ** 32 - 1);
b.length += 1; // å° length 屬æ§è¨çº 2^32
b.length = 2.5; // å° length 屬æ§è¨çºæµ®é»æ¸
const c = new Array(2.5); // å³å
¥ä¸åæµ®é»æ¸
// æå¤å°ç¡éå¢é·é£åç並è¡ä¿®æ¹
const arr = [1, 2, 3];
for (const e of arr) {
arr.push(e * 10);
}
ææçæ¡ä¾
[2 ** 40]; // [ 1099511627776 ]
[-1]; // [ -1 ]
new ArrayBuffer(2 ** 31 - 1);
new ArrayBuffer(2 ** 33); // Firefox 89 ä¹å¾ç 64 ä½å
系統
new ArrayBuffer(0);
const a = [];
a.length = Math.max(0, a.length - 1);
const b = new Array(2 ** 32 - 1);
b.length = Math.min(0xffffffff, b.length + 1);
// 0xffffffff æ¯ 2^32 - 1 çåå
é²ä½è¡¨ç¤ºæ³
// ä¹å¯ä»¥å¯«æ (-1 >>> 0)
b.length = 3;
const c = new Array(3);
// å çºé£åæ¹æ³å¨è¿ä»£åæå²åé·åº¦ï¼æä»¥å¨è¿ä»£æéå¢é·é£åæ¯å®å
¨ç
const arr = [1, 2, 3];
arr.forEach((e) => arr.push(e * 10));