代码中map(Number)的作用是什么?如何实现字符串转数字?
为什么
map(Number)能把字符串数组转成数字数组? 嘿,这个细节抓得特别好!我来一步步给你拆解清楚:
首先先明确前置步骤的结果:strArr[0].match(/\d+/g) 匹配到的是字符串数组 ["1","2","3","4"],这一步你已经观察到了——去掉map的话打印的就是这个结果。
接下来重点说.map(Number)的运行逻辑:
Number在这里是作为普通函数调用,不是构造函数
你提到的“包装对象”是当用new Number(xxx)的时候才会生成的,但这里我们没有用new关键字,只是把Number当作一个普通转换函数来用。它的作用就是接收一个参数,尝试把这个参数转换成原始类型的数字并返回——比如Number("1")会返回数字1,Number("123")返回数字123。map方法的工作机制map会遍历数组中的每一个元素,把当前元素作为第一个参数传给你传入的回调函数,然后把回调函数的返回值收集起来,组成一个新数组。
所以结合起来,整个过程就是:
- 遍历到
"1"时,调用Number("1"),返回数字1,加入新数组 - 遍历到
"2"时,调用Number("2"),返回数字2,加入新数组 - 遍历到
"3"时,调用Number("3"),返回数字3,加入新数组 - 遍历到
"4"时,调用Number("4"),返回数字4,加入新数组
最终就得到了数字数组[1,2,3,4]。
你可以把它理解成和下面这段代码完全等价:
var arr1 = strArr[0].match(/\d+/g).map(function(numStr) { return Number(numStr); });
只是把匿名函数换成了直接传Number这个函数本身——因为map会自动把每个元素传给它,正好符合Number函数的参数要求。
另外再补充个小验证:你可以在控制台里试试console.log(Number("5")),会输出数字5;而console.log(new Number("5"))才会输出包装对象,这也能帮你区分两种调用方式的区别~
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

