有人可以向我解释数组方法如何知道我们调用它们的值, 作为原型继承的一部分,它不应该存在于Array.prototype上。 如果我们说
let animals = ['dog','cat']
animals.map( x => console.log(x))
//dog
//cat
我只是不明白地图如何知道我们通过了['dog','cat']。 我通常看到,如果调用函数,则需要像map(animals)一样调用它。
先谢谢您
或查看地图polyfill,我们将其分配给数组参数的那一行是
if (!Array.prototype.map) {
Array.prototype.map = function(callback/*, thisArg*/) {
var T, A, k;
if (this == null) {
throw new TypeError('this is null or not defined');
}
var O = Object(this);
var len = O.length >>> 0;
// 4. If IsCallable(callback) is false, throw a TypeError exception.
// See: http://es5.github.com/#x9.11
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
if (arguments.length > 1) {
T = arguments[1];
}
A = new Array(len);
// 7. Let k be 0
k = 0;
// 8. Repeat, while k < len
while (k < len) {
var kValue, mappedValue;
if (k in O) {
// i. Let kValue be the result of calling the Get internal
// method of O with argument Pk.
kValue = O[k];
mappedValue = callback.call(T, kValue, k, O);
// For best browser support, use the following:
A[k] = mappedValue;
}
// d. Increase k by 1.
k++;
}
// 9. return A
return A;
};
}
答案 0 :(得分:0)
Array.prototype.mymap = function(callback) {
var myArray = this; // here is the magic
var newArray = [];
for (var i = 0; i < myArray.length; i++) {
newArray.push(callback(myArray[i]));
}
return newArray;
};
console.log([0, 1, 2, 3].mymap(a => a * 2));
答案 1 :(得分:0)
如果我们根据W3Schools看一下Map的定义:
map()方法使用调用a的结果创建一个新数组 每个数组元素的函数。
因此,功能图会检查每个元素并对此进行操作。 在此示例中,您说:“ Console.log此数组中的每个元素”
因此逻辑上,函数映射知道数组中的内容。
答案 2 :(得分:0)
map()
是Array
对象的方法。在JavaScript中,我们说animals
对象使用Array
对象的“原型继承”。就像说animals
继承了Array
基类的属性和方法一样(如果您来自OOP世界)。
由于map
是所有Array
对象都存在的函数,因此animals
也不例外。
根据定义map()
接受一个函数,并返回一个Array
。然后,它遍历被调用的数组的每个元素(在本例中为animals
数组),并将传递的函数应用于每个元素。
通常,您可以将其与return
语句一起使用以生成新的数组。例如,您可以编写如下内容:
var upperCaseAnimals = animals.map(x => return(x.toUpperCase()))
这将创建一个新数组upperCaseAnimals
,其中包含animals
数组的所有元素,并将toUpperCase()
应用于它们。
但是您也可以使用它对数组的每个元素进行“处理”。这就是上面示例中所做的。无需为每个元素提供返回值,而只是console.log()
设置每个元素。