which has a length which is either negative or larger or equal to 2
, or when setting the
property to a value which is either negative or larger or equal to 2
RangeError: Array length must be a finite positive integer (Edge) RangeError: invalid array length (Firefox) RangeError: Invalid array length (Chrome) RangeError: Invalid array buffer length (Chrome)
An invalid array length might appear in these situations:
ArrayBufferwhich has a length which is either negative or larger or equal to 2 32 ，或
Array.lengthproperty to a value which is either negative or larger or equal to 2 32 .
length limited? The
property of an
is represented with an unsigned 32-bit integer, that can only store values which are in the range from 0 to 2
If you are creating an
, using the constructor, you probably want to use the literal notation instead, as the first argument is interpreted as the length of the
Otherwise, you might want to clamp the length before setting the length property, or using it as argument of the constructor.
new Array(Math.pow(2, 40)) new Array(-1) new ArrayBuffer(Math.pow(2, 32)) new ArrayBuffer(-1) let a = ; a.length = a.length - 1; // set -1 to the length property let b = new Array(Math.pow(2, 32) - 1); b.length = b.length + 1; // set 2^32 to the length property
[ Math.pow(2, 40) ] // [ 1099511627776 ] [ -1 ] // [ -1 ] new ArrayBuffer(Math.pow(2, 32) - 1) new ArrayBuffer(0) let a = ; a.length = Math.max(0, a.length - 1); let b = new Array(Math.pow(2, 32) - 1); b.length = Math.min(0xffffffff, b.length + 1); // 0xffffffff is the hexadecimal notation for 2^32 - 1 // which can also be written as (-1 >>> 0)