微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【JS学习笔记】ECMAScript中一些最值的考虑

数值最值

Number.MIN_VALUE是5e-324
Number.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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐