What is .map() doing in this situation?

后端 未结 4 956
执笔经年
执笔经年 2020-12-13 05:29

Using the Chrome Console, this is my input and output:

[0].map(Array);

[[0, 0, [0]]]; // output

What is happening here?

ED

相关标签:
4条回答
  • 2020-12-13 05:56

    After you updated question. Other answers provide you info about map

    To answer why array and string differ look to constructors

    String constructor accept 1 parameter String(thing) while array new Array(element0, element1[, ...[, elementN]])

    0 讨论(0)
  • 2020-12-13 05:59

    Firstly, Array could be used as a function to create arrays:

    var arr = Array(1, 2, "Hello");
    
    console.log(arr); // [1, 2, "Hello"]

    Secondly, map passes three parameters to its callback: the element, its index from the array and the array itself.

    So, since your array contains one element, the line:

    [0].map(Array);
    

    is equivalent to:

    [Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])
    
    0 讨论(0)
  • 2020-12-13 06:13

    This call

    [0].map(Array);
    

    gives you the same result as if you wrote something like this:

    [0].map(function (value, index, array) {
        return Array(value, index, array);
    })
    

    Map function is calling Array function with three parameters: value of element, index of element and whole array. This call to Array returns you array with 3 elements: value (number 0), index (number 0), whole array ([0]).

    And this new array is wrapped in the original Array, because you maped original element (number 0) to new element (array of 3 elements)

    Note: You might be used to using only the first parameter like in

    array.map(function (a) { return a * a; });
    

    or using just two to get also index

    array.map(function (item, index) { return "index=" + index + ", value=" + item; });
    

    But you need to remember that map still provides 3 parameters you just ignore them in your callback function. That's also the reason why code like:

    [0].map(String);
    

    returns

    ["0"]
    

    It's because String function care only about the first parameter and ignores other passed parameters. If you call

    String(11, "Some", "other", "ignored", "parameters")
    

    you will still get

    "11"
    
    0 讨论(0)
  • 2020-12-13 06:14

    The .map() function is calling the Array() function with three arguments, the value of the array element which is 0, the index of that element, also 0, and a reference to the whole array.

    So it's like doing this:

    var a = [0];
    var index = 0
    Array(a[index], index, a);   // create array with three elements
    

    The array returned by Array() then becomes the first element of the array that .map() creates, hence the extra level of nesting in your [[0, 0, [0]]] result.

    EDIT regarding your edit: when you say [0].map(String); that results in String() being called with the same three arguments like String(a[index], index, a), but the String() function ignores all but the first argument, whereas Array() uses all supplied arguments.

    0 讨论(0)
提交回复
热议问题