这是第一个:
(function() {
return ['10','10','10','10'].map(parseInt);
})();
输出: [10, NaN, 2, 3]
第二个:
(function() {
return 9999999999999999;
})();
输出: 10000000000000000
我想问下是什么原因造成的?求教
这是第一个:
(function() {
return ['10','10','10','10'].map(parseInt);
})();
输出: [10, NaN, 2, 3]
第二个:
(function() {
return 9999999999999999;
})();
输出: 10000000000000000
我想问下是什么原因造成的?求教
第一个问题:
就是 使用parseInt传入了thisArg有很多个参数,正好parseInt需要很多参数你可以
function fuzzyPlural(single) {
return parseInt(single);
}
(function() {
return ['10','10','10','10'].map(fuzzyPlural);
})();
[10, 10, 10, 10]
第二个问题应该是数字精度转换问题
就像0.1+0.2在JS中不等于0.3一样
parseInt(string, radix)
array.map
的callback
是 function (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。
第一个的map用法我不是很清楚,但是第二个是由于JavaScript的整型数据范围造成的错误,当javascript的整型数据超过9007199254740992了之后,不管是对于数据在内存的存储方式还是运算,都会造成溢出或其他的错误异常。
说下第一个,Array
的map
方法是返回三个参数的(详情见 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
方法的前两个参数,所以结果不是我们预期想的那样。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
给你两个链接,你看看 Array.prototype.map 的文档和 parseInt 的文档。
然后你会发现
map(callback)
的callback
参数是3个:callback(currentValue, index, array)
;而
parseInt
的参数是2个parseInt(string, radix)
。所以你直接传入
parseInt
结果每次调用的就是这样radix 为 0 被当作 10 进制
radix 为 1 时只有一个数,所以
10
非法其它依次类推
第2个问题是精度的问题,参考:http://www.w3school.com.cn/js/js_obj_number.asp