[TOC]
* * * * *
### 1. 定义
~~~
Array.prototype.map( callback(currentValue, index, array), thisArg )
创建一个新数组,其结果是该数组中的每个元素都调用一个回调函数后返回的结果。
PS:原数组不变,返回一个新数组。
~~~
* * * * *
### 2. 参数
~~~
该函数的参数有两个:
第一个是回调函数,该函数的入参有三个,currentValue 为当前元素,index 当前元素索引,array 原数组。返回值为处理后的新元素;
第二个 thisArg 是一个对象,可选的。执行 callback 函数时 使用的 this 值,如果不指定就上层执行作用域;
PS:需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值。
如果函数处于非严格模式下:
a. 指定为 null 和 undefined 的 this 值会自动指向全局对象(浏览器中就是 window 对象) ;
b. 如果值为原始值(数字,字符串,布尔值)的,this会指向该原始值的自动包装对象。
~~~
* * * * *
### 3. 面试题
~~~
题 1:
[' a b','23 '].map(Function.prototype.call, String.prototype.trim)
可以猜测代码的意思就是对原数组中的每个元素去除首尾的空格后返回组成的新数组。
这里的 call 函数绑定的执行环境对象就是 String.prototype.trim
每一次迭代的操作如下:
String.prototype.trim.call(currentValue)
~~~
>[danger] 有些回调函数,`this` 是用在函数体内的,
有些函数,如 `trim,toLowerCase` 等 `this` 是作为该函数的调用作用域
~~~
题 2:
["A","B","C"].map(String.prototype.toLowerCase.call);
// --> TypeError: undefined is not a function
这里没有指定 thisArg,那么默认就是 undefined
String.prototype.toLowerCase.call===Function.prototype.call
~~~
>[info]验证:
![](https://box.kancloud.cn/d9ef36862a55aa2875198070d721dfcf_697x215.png)
>[info] 结论:
>[success] 从上面可以看到,`map` 的第一个参数,其实就是 `call` 函数,只是引用的方式不同,这个函数必须要有 `this` 去调用它,且类型得为 `Function` 的