我偶然发现了以下代码片段:
> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?
geo*_*car 13
首先查阅Array.prototype.map的文档.关键是这一行:
使用三个参数调用回调:元素的值,元素的索引和遍历的Array对象.
(强调我的)
然后查看parseInt的文档:
parseInt函数将其第一个参数转换为字符串,解析它,并返回一个整数或NaN.如果不是NaN,则返回的值将是作为指定基数(基数)中的数字的第一个参数的十进制整数表示.例如,10的基数表示从十进制数转换,8八进制,十六进制16,依此类推.对于大于10的基数,字母表中的字母表示大于9的数字.例如,对于十六进制数字(基数16),使用A到F.
和:
如果radix未定义或为0,则JavaScript假定以下内容:
如果输入字符串以"0x"或"0X"开头,则基数为16(十六进制).
如果输入字符串以"0"开头,则基数为8(八进制).此功能是非标准的,有些实现故意不支持它(而是使用基数10).因此,在使用parseInt时始终指定基数.
如果输入字符串以任何其他值开头,则基数为10(十进制).
所以第一个电话是:
parseInt('10',0, ['10','10',...]) // => 10 (because radix=0)
Run Code Online (Sandbox Code Playgroud)
第二个是:
parseInt('10',1, ['10','10',...]) // => NaN because radix is 1
Run Code Online (Sandbox Code Playgroud)
第三:
parseInt('10',2, ['10','10',...]) // => 2 because 10 in binary is the number "2"
Run Code Online (Sandbox Code Playgroud)
等等.
来自MDN文件:
parseInt通常与一个参数一起使用,但需要两个参数.第二个是基数对于回调函数,Array.prototype.map传递3个参数:元素,索引,数组第三个参数被parseInt忽略,但不是第二个参数,因此可能会产生混淆.
所以实际上你parseInt传递了以下值:
// 1st run:
parseInt( '10', 0 );
// 2nd run:
parseInt( '10', 1 );
// etc.
Run Code Online (Sandbox Code Playgroud)
所以你每次都使用不同的基数,从而得到结果.
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |