Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

['1', '2', '3'].map(parseInt) what & why ? #3

Open
lovelmh13 opened this issue Jan 29, 2020 · 2 comments
Open

['1', '2', '3'].map(parseInt) what & why ? #3

lovelmh13 opened this issue Jan 29, 2020 · 2 comments

Comments

@lovelmh13
Copy link
Owner

不明白的点:parseInt('1', 0),为什么会传进来0。
MDN上这么写的:

radix

一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。比如参数 10 表示使用十进制数值系统。始终指定此参数可以消除阅读该代码时的困惑并且保证转换结果可预测。当未指定基数时,不同的实现会产生不同的结果,通常认为其值默认为10,但是如果你的代码运行在过时的浏览器中,那么请在使用时总是显式地指定 radix

它写的让总是显示地显示radix。所以map的index就传进来了,因为parseInt需要两个参数

针对我 不明白的点:对于每个迭代map, parseInt()传递个参数: 字符串和基数

实际上可以理解成:

['1', '2', '3'].map((item, index) => {
    return parseInt(item, index)
})

所以才是:

parseInt('1', 0) // 这个0就是index传进来的
parseInt('2', 1)
parseInt('3', 2)
@lovelmh13
Copy link
Owner Author

不明白的点:parseInt('1', 0),为什么会传进来0。
MDN上这么写的:

radix
一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。比如参数 10 表示使用十进制数值系统。始终指定此参数可以消除阅读该代码时的困惑并且保证转换结果可预测。当未指定基数时,不同的实现会产生不同的结果,通常认为其值默认为10,但是如果你的代码运行在过时的浏览器中,那么请在使用时_总是显式地指定 radix_。

它写的让总是显示地显示radix。所以map的index就传进来了,因为parseInt需要两个参数

针对我 不明白的点:对于每个迭代map, parseInt()传递个参数: 字符串和基数

实际上可以理解成:

['1', '2', '3'].map((item, index) => {
    return parseInt(item, index)
})

所以才是:

parseInt('1', 0) // 这个0就是index传进来的
parseInt('2', 1)
parseInt('3', 2)

补充:
在MDN上看见有关于这个内容的解释:
通常情况下,map 方法中的 callback 函数只需要接受一个参数,就是正在被遍历的数组元素本身。但这并不意味着 map 只给 callback 传了一个参数。这个思维惯性可能会让我们犯一个很容易犯的错误。

考虑下例:

["1", "2", "3"].map(parseInt);
我们期望输出 [1, 2, 3], 而实际结果是 [1, NaN, NaN].

parseInt 经常被带着一个参数使用, 但是这里接受两个。第一个参数是一个表达式而第二个是 callback function 的基, Array.prototype.map 传递3个参数:

the element
the index
the array
第三个参数被parseInt忽视了, but not the second one, 但不是第二个。因此可能出现混淆。下面是迭代步骤的简明示例:

// parseInt(string, radix) -> map(parseInt(value, index))
/*  first iteration (index is 0): */ parseInt("1", 0); // 1
/* second iteration (index is 1): */ parseInt("2", 1); // NaN
/*  third iteration (index is 2): */ parseInt("3", 2); // NaN

@lovelmh13
Copy link
Owner Author

2021.6.20 补充:
如何让 ['1', '2', '3'].map(parseInt) 输出 [1, 2, 3]?

let foo =  fn => (val) => fn(val)
console.log(['1', '2', '3'].map( foo(parseInt) ))

输出 [ 1, NaN, NaN]

let foo =  fn => (val, index) => fn(val, index)
console.log(['1', '2', '3'].map( foo(parseInt) ))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant