数组方法如何知道调用它们的值?

时间:2019-04-24 14:11:21

标签: javascript

有人可以向我解释数组方法如何知道我们调用它们的值, 作为原型继承的一部分,它不应该存在于Array.prototype上。 如果我们说

let animals = ['dog','cat']
animals.map( x => console.log(x))
//dog
//cat

我只是不明白地图如何知道我们通过了['dog','cat']。 我通常看到,如果调用函数,则需要像map(animals)一样调用它。

So if x is an array shouldn't it exists on Array.prototype so then we can call map on it ?

先谢谢您

或查看地图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;
  };
}

3 个答案:

答案 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()设置每个元素。