We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
这是今天在 Advanced-Frontend组织 看到一个比较有意思的题目。 主要是讲JS的映射与解析 早在 2013年, 加里·伯恩哈德就在微博上发布了以下代码段:
['10','10','10','10','10'].map(parseInt); // [10, NaN, 2, 3, 4]
parseInt() 函数解析一个字符串参数,并返回一个指定基数的整数 (数学系统的基础)。
parseInt()
const intValue = parseInt(string[, radix]);
string 要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。
string
radix 一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。默认为10。 返回值 返回一个整数或NaN
radix
返回值
parseInt(100); // 100 parseInt(100, 10); // 100 parseInt(100, 2); // 4 -> converts 100 in base 2 to base 10
注意: 在radix为 undefined,或者radix为 0 或者没有指定的情况下,JavaScript 作如下处理:
更多详见parseInt | MDN
map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
map()
var new_array = arr.map(function callback(currentValue[,index[, array]]) { // Return element for new_array }[, thisArg])
可以看到callback回调函数需要三个参数, 我们通常只使用第一个参数 (其他两个参数是可选的)。 currentValue 是callback 数组中正在处理的当前元素。 index可选, 是callback 数组中正在处理的当前元素的索引。 array可选, 是callback map 方法被调用的数组。 另外还有thisArg可选, 执行 callback 函数时使用的this 值。
callback
currentValue
index
array
thisArg
const arr = [1, 2, 3]; arr.map((num) => num + 1); // [2, 3, 4]
更多详见Array.prototype.map() | MDN
回到我们真实的事例上
['1', '2', '3'].map(parseInt)
对于每个迭代map, parseInt()传递两个参数: 字符串和基数。 所以实际执行的的代码是:
map
['1', '2', '3'].map((item, index) => { return parseInt(item, index) })
即返回的值分别为:
parseInt('1', 0) // 1 parseInt('2', 1) // NaN parseInt('3', 2) // NaN, 3 不是二进制
所以:
['1', '2', '3'].map(parseInt) // 1, NaN, NaN
由此,加里·伯恩哈德例子也就很好解释了,这里不再赘述
如果您实际上想要循环访问字符串数组, 该怎么办? map()然后把它换成数字?使用编号!
['10','10','10','10','10'].map(Number); // [10, 10, 10, 10, 10]
The text was updated successfully, but these errors were encountered:
或者给parseInt套一层,扔进map里 function parse(n){ return parseInt(n,10) }
Sorry, something went wrong.
第一感觉结果应该是[ 1, 2, 3 ],但答案却是[ 1, NaN, NaN ]:
[ 1, 2, 3 ]
[ 1, NaN, NaN ]
['1', '2', '3'].map(parseInt); // [ 1, NaN, NaN ]
这是因为map()方法创建一个新数组,该数组中的每个元素都调用一个提供的函数后返回的结果。
parseInt()方法接收2个参数,第一个参数为要被解析的字符串,第二个参数表示要解析的数字的基数,可选。
map()有3个参数,分别是当前元素,索引,数组本身,因为parseInt()方法接收两个参数,所以这里只用到了前两个参数。
详情请看MDN: map() parseInt()
详情请看MDN:
因此,['1', '2', '3'].map(parseInt)的等价代码实际是:
['1', '2', '3'].map((item, index) => { return parseInt(item, index); });
执行三次,返回的值依次是:
parseInt('1', 0); // 1 // 基数为0,数字以10进制来解析,返回1 parseInt('2', 1); // NaN // 基数为1,数字以2进制来解析,但2>1,无法表示,返回NaN parseInt('3', 2); // NaN // 基数为2,数字以3进制来解析,但3>2,无法表示,返回NaN
因此,['1', '2', '3'].map(parseInt)的返回结果当然是[ 1, NaN, NaN ]了。
如果就想要返回[ 1, 2, 3 ],也是可以的,map里传递Number即可:
Number
['1', '2', '3'].map(Number); // [ 1, 2, 3 ]
No branches or pull requests
这是今天在 Advanced-Frontend组织 看到一个比较有意思的题目。
主要是讲JS的映射与解析
早在 2013年, 加里·伯恩哈德就在微博上发布了以下代码段:
parseInt
parseInt()
函数解析一个字符串参数,并返回一个指定基数的整数 (数学系统的基础)。string
要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。radix
一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。默认为10。返回值
返回一个整数或NaN注意:
在
radix
为 undefined,或者radix
为 0 或者没有指定的情况下,JavaScript 作如下处理:更多详见parseInt | MDN
map
map()
方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。可以看到
callback
回调函数需要三个参数, 我们通常只使用第一个参数 (其他两个参数是可选的)。currentValue
是callback 数组中正在处理的当前元素。index
可选, 是callback 数组中正在处理的当前元素的索引。array
可选, 是callback map 方法被调用的数组。另外还有
thisArg
可选, 执行 callback 函数时使用的this 值。更多详见Array.prototype.map() | MDN
回到真实的事例上
回到我们真实的事例上
对于每个迭代
map
,parseInt()
传递两个参数: 字符串和基数。所以实际执行的的代码是:
即返回的值分别为:
所以:
由此,加里·伯恩哈德例子也就很好解释了,这里不再赘述
如何在现实世界中做到这一点
如果您实际上想要循环访问字符串数组, 该怎么办?
map()
然后把它换成数字?使用编号!The text was updated successfully, but these errors were encountered: