数值最值
Number.MIN_VALUE
是5e-324Number.MAX_VALUE
是1.7976931348623157e+308
ECMAScript遵循IEEE-754 64位格式存储,但位操作符并不直接操作64位数,而是先转换成32位整数,然后执行操作,最后再将结果转换回64位。这个过程对开发人员是透明的。《JavaScript高级程序设计第3版》P40
字符串字符个数最大值
既然Number类型的值有最值,那一个字符串有没有字符数量限制呢
函数传入参数的个数限制
函数的传入参数实际上是以一个类似数组的arguments对象存储而后再将这个对象(的引用/指针?)传入函数的。由于数值有最大值的限制Number.MIN_VALUE
,所以arguments.length不可能超过这个数,而传入参数的个数限制应该就在这里了。(这个考虑方法是一个前端群里的朋友提出的,感谢他)
数组项最大值
数组最多可以包含4294967295个项(《JavaScript高级程序设计第3版》P88。
Date()构造函数创建的日期的最大最小值
var value = 1499999999999;//如今时间的毫秒数常见13位数,实际上并没有这么多
for (var i = 1,overflow = false; overflow === false; i++) {
value = value * 10 + 9;
console.log(i);
if (new Date(value) == 'Invalid Date') {
overflow = true;
break;
}
}
最后返回值的i等于4,说明直到17位数之前都还是有效的。那么可以算一算准确一点的。
补上精确计算的方法:
function testMaxDateTime() {
var initTime = 1499999999999999; //目前时间常见16位数,开始计数
var powLmt = 0; //指数最小退位
function test(init,pow,mtimeMax) {
var lpcount = 0;//循环计数器
if (pow < powLmt) {//当递增器的指数小于0,递归最大值
return mtimeMax;
} else {
mtimeMax = init;//当前递归的最大值赋初值
while (lpcount < 100) {//限制循环最大<a href="https://www.jb51.cc/tag/cishu/" target="_blank" class="keywords">次数</a>,防止死循环
lpcount++;
mtimeMax += Math.pow(10,pow);//累加递增器
if ((new Date(mtimeMax)).toString() === "Invalid Date") {
return test(mtimeMax - Math.pow(10,pow),pow - 1,mtimeMax);
}
}
throw (new Error('i<a href="https://www.jb51.cc/tag/tera/" target="_blank" class="keywords">tera</a>tion overflow.'));//如果死循环被强制中断,抛错
}
}
//由于<a href="https://www.jb51.cc/tag/test/" target="_blank" class="keywords">test()</a>得到的是刚好超过毫秒数有效值的最大临界值,需要减一得到最大有效值
return test(initTime,15) - 1;
}
This gives a range of 8,640,000,000 milliseconds to either side of 01 January,1970 UTC.