首页 > javascript一些奇怪的特性

javascript一些奇怪的特性

这是第一个:

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

第二个:

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

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


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。


第一个问题:


就是 使用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一样


第一个的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方法的前两个参数,所以结果不是我们预期想的那样。


给你两个链接,你看看 Array.prototype.map 的文档和 parseInt 的文档。

然后你会发现 map(callback)callback 参数是3个:callback(currentValue, index, array)
parseInt 的参数是2个 parseInt(string, radix)

所以你直接传入 parseInt 结果每次调用的就是这样

parseInt("10", 0, ["10", "10", "10", "10"]);
parseInt("10", 1, ["10", "10", "10", "10"]);
parseInt("10", 2, ["10", "10", "10", "10"]);
parseInt("10", 3, ["10", "10", "10", "10"]);

radix 为 0 被当作 10 进制
radix 为 1 时只有一个数,所以 10 非法
其它依次类推


第2个问题是精度的问题,参考:http://www.w3school.com.cn/js/js_obj_number.asp

【热门文章】
【热门文章】