javascript一些奇怪的特性
伊谢尔伦
伊谢尔伦 2017-04-10 16:54:00
[JavaScript讨论组]

这是第一个:

(function() {
    return ['10','10','10','10'].map(parseInt);
})();
输出: [10, NaN, 2, 3]

第二个:

(function() {
    return 9999999999999999;
})();
输出: 10000000000000000

我想问下是什么原因造成的?求教

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
迷茫

parseInt(string, radix)

array.mapcallbackfunction (element, index)

你相当于依次调用了

parseInt('10', 0);
parseInt('10', 1);
parseInt('10', 2);
parseInt('10', 3);

真的要用的话,bind一下,或者['10','10','10','10'].map(str => parseInt(str))

天蓬老师

第一个问题大家都已经回答的很好了,我来试着回答一下第二个问题。

在 MDN 上有很好的解释,我搬来说下。在 JS 的 Number 中有一个 MAX_SAFE_INTEGER 的静态属性,用来表示可以进行正常数学运算的数值的上限。该值是 253 - 1,即:9007199254740991

当超过这个这个值时就会出现不符合正常数学运算的错误,如:Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2。你也可以把这种情况理解为溢出了。

其本质原因是由于 JS 使用了 IEEE754 中的双精度浮点数来表示数字,所有使用这种表示方法的语言都会出现上面的问题,不只是 JS。

PHPz

第一个的map用法我不是很清楚,但是第二个是由于JavaScript的整型数据范围造成的错误,当javascript的整型数据超过9007199254740992了之后,不管是对于数据在内存的存储方式还是运算,都会造成溢出或其他的错误异常。

阿神

说下第一个,Arraymap方法是返回三个参数的(详情见 Array.prototype.map()):

Array.map(function(currentValue, index, array) {...});

然后再来看看parseInt这个方法,这个方法是可以接受两个参数的,第一个就是要你要解析成整数的字符串,第二个参数则是指定转换中采用的基数(可忽略)。

Number.parseInt(string[, radix]);

然后这段代码:

['10','10','10','10'].map(parseInt);

虽然只是把字符串转为整数,由于传入了第二个参数(index)而变成这样:

parseInt(10, 0) // 10
parseInt(10, 1) // NaN
parseInt(10, 2) // 2
parseInt(10, 3) // 3

因为parseInt方法可以接受两个参数,就用map方法的前两个参数,所以结果不是我们预期想的那样。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号