这是由语言定义的吗?有确定的最大值吗?在不同的浏览器中是否有所不同?
当前回答
简短的回答是“视情况而定。”
如果你在任何地方使用位操作符(或者如果你引用数组的长度),范围是:
无符号:0…(1 > > > 0)
签名:(-(1 > > > 1)1)……(1 > > > 1)
(恰巧按位操作符和数组的最大长度被限制为32位整数。)
如果你不使用位操作符或使用数组长度:
签名:(-Math pow (2.53)) ... + Math . pow (2.53))
这些限制是由“Number”类型的内部表示施加的,通常对应于IEEE 754双精度浮点表示。(请注意,与典型的有符号整数不同,由于内部表示的特征,负极限的大小与正极限的大小相同,它实际上包括一个负0!)
其他回答
其他人可能已经给出了一般的答案,但我认为给出一个快速确定它的方法会是一个好主意:
for (var x = 2; x + 1 !== x; x *= 2);
console.log(x);
这给了我9007199254740992在Chrome 30不到一毫秒。
它将测试2的幂,以找出当“加”1时,哪一个等于他自己。
Node.js和谷歌Chrome似乎都使用1024位浮点值,因此:
Number.MAX_VALUE = 1.7976931348623157e+308
>= ES6:
Number.MIN_SAFE_INTEGER;
Number.MAX_SAFE_INTEGER;
< = ES5
参考文献:
Number.MAX_VALUE;
Number.MIN_VALUE;
console.log (MIN_VALUE, Number.MIN_VALUE); console.log (MAX_VALUE, Number.MAX_VALUE); console.log (MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER);/ / ES6 console.log (MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);/ / ES6
要用于位操作的任何值必须在0x80000000(-2147483648或-2^31)和0x7fffffff(2147483647或2^31 - 1)之间。
控制台会告诉您0x80000000等于+2147483648,但是0x80000000 & 0x80000000等于-2147483648。
JavaScript在ECMAScript 2020中收到了一个新的数据类型:BigInt。它引入了带有“n”后缀的数值字面量,并允许任意精度:
var a = 123456789012345678901012345678901n;
当然,当这样大的整数(可能是无意的)被强制转换为数字数据类型时,精度仍然会丢失。
而且,很明显,由于有限的内存,总是会有精度限制,为了分配必要的内存和对如此大的数字执行算术,在时间方面会有成本。
例如,生成一个具有10万个十进制数字的数字,在完成之前会有明显的延迟:
console.log(BigInt("1".padEnd(100000,"0")) + 1n)
...但它确实有效。