数组元素在JavaScript中默认具有名称吗?

时间:2017-08-31 09:20:55

标签: javascript

var animals = ["cat","dog","fish"];
var lengths = animals.map(function(c) {
  return c.length;
});
console.log(lengths);//[3, 3, 4]

这是代码。我不明白这个' c'争论来自。 我试图将这个参数改为另一个(任何一个词,实际上,在两个地方),并且console.log结果总是相同的!

但是这个' c'没有在任何地方定义!引擎'在哪里?得到这个' c'?

的价值

4 个答案:

答案 0 :(得分:5)

你问过两个略有不同的问题。首先是质疑机构:

  

我不明白这个' c'争论来自。我试图将此参数更改为另一个(任何单词,实际上,在两个地方),并且console.log结果始终是相同的!

     

但是这个' c'没有在任何地方定义!   引擎'在哪里?得到这个' c'?

的价值

定义参数名称(正如您已注意到的,您可以为自己选择任何名称)。该值来自数组,因为map会调用您的回调并确定要为该参数传递的参数。

这是Array.prototype.map概念性实现,这使得这一点更加清晰:



// CONCEPTUAL ONLY, NOT AN ACTUAL VERSION OF IT
function maplike(array, callback) {
    var result = [];
    for (var i = 0; i < array.length; ++i) {
        result[i] = callback(array[i]);
        //                   ^^^^^^^^--- where 'c' comes from
    }
    return result;
}

var animals = ["cat","dog","fish"];
var lengths = maplike(animals, function(c) {
  return c.length;
});
console.log(lengths);//[3, 3, 4]
&#13;
&#13;
&#13;

  

数组元素默认在JavaScript中有名称吗?

排序,但不是你想的方式。元素的名称是其索引01等。实际上,JavaScript数组aren't really arrays at all *和那些索引都转换为字符串属性名称(理论上;在实践中, JavaScript引擎优化它。)

* (披露:这是我贫穷的小博客上的帖子)

答案 1 :(得分:4)

你告诉解释器如何调用参数,这里:

function(c) {
         ^

Array.prototype.map()需要一个最多可接受3个参数的回调。第一个参数始终是“当前项目”,您恰好将其命名为c

要获得更深入的解释,请查看T.J. Crowder s answer

答案 2 :(得分:0)

在javascript中,函数是first class object,这意味着它们可以分配给变量,作为函数参数传递并从值返回。 Array.prototype.map函数接受一个函数,它的第一个参数表示数组的项。调用时,map函数为每个项执行给定的函数,并从给定函数的输出中创建一个新数组。

在您的情况下,您正在地图函数中动态定义输入函数。

您实际上可以在外部定义函数,并通过引用传递函数,如下所示。

function getLength(item) {
    return item.length;
}

var animals = ["cat","dog","fish"];
var lengths = animals.map(getLength);

console.log(lengths);//[3, 3, 4]

在这里,您可以看到它输出相同的结果。

答案 3 :(得分:0)

代码不知道命名的参数是什么。您映射一个数组。 map函数在长度变量(被赋值的变量)中创建一个新数组。怎么样?它向其中的函数参数提供当前数组中的每个元素逐个值。 这里的值是实际的字符串名称(&#34; cat&#34;或&#34; dog&#34;或&#34; fish&#34;)。

在javascript中,参数可以是可选的。这个map函数可以带三个参数,currentValue,index,array。在您的情况下,c提供当前值。 如果你要再添加一个参数c,idx。 Map函数将获取其中的currentvalue和index。

var animals = ["cat","dog","fish"];
var lengths = animals.map(function(c, idx, arr, test) {
   console.log(c); // currentvalue being processed in the array.
   console.log(idx);  // index of currentvalue in the array
   console.log(arr);  // original array being operated on.
   console.log(test); // undefined always. not available in map.
  return c.length;
});
console.log(lengths);//[3, 3, 4]