[‘1’,’2’,’3’].map(parseInt) => [1,NaN,NaN]
map() 数组方法
将调用的数组的每个元素传递给指定的函数,并返回一个数组,它包含该函数的返回值。callback含有三个参数(元素值,元素索引,原数组)
注意:传递给map()的函数应该有返回值。map()返回的是新数组:它不修改调用的数组。如果是稀疏数组,返回的也是相同方式的稀疏数组:它具有相同的长度,相同的缺失元素。
parseInt(string,radix)
因为callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。而parseInt方法是可以接收两个参数的,第一个为被转化的值,第二个为被转化值的进制。map自动传入的第二个参数被当做进制了,也就是数组的index被当做进制数了。当进制数为0时,默认为10进制,故结论数组第一个值为1,。当parseInt的进制参数小于2或者大于36,就返回NaN,因此第二个值为NaN。第三个值为NaN的原因是相当于执行了parseInt(“3”,”2”),而2进制下数字3是不存在的,也返回了NaN。
let result = [1,[2,3]][3,2,1] => [1,[2,3]][1]=>[2,3]
源码的意图被 parser 误解,有两个必要条件:
- parser 优先将行结束符前后的符号流按一条语句解析,这是 ECMAScript 标准的规定,所有 parser 必须要按此要求实现。
- 行结束符之后的符号 (token) 有二义性,使得该符号与上条语句能够无缝对接,不导致语法错误。
实际上,有二义性的符号本来就不多,能导致源码意图被改变的符号数来数去就只有 [ 、( 、/ 、+ 、- 这五个而已。我们可以把它们理解成“脆弱的符号”,在它们前面显式地加上防御性分号 (defensive semicolon) 来保护其含义不被改变。