1

以下是我需要澄清的代码。我希望这段代码能像选项 2'mango', 'apple', 'orange'一样逐个控制台,但这会引发另一个输入,我不知道 JavaScript 是如何吐出这个输出的。

const myFunc = (...data) => (data.map(console.log))

myFunc('mango', 'apple', 'orange')

选项 2 -(预期输出)

var myFunc = (...data) => {
  data.map(x => {
    console.log(x)
  })
}

myFunc('mango', 'apple', 'orange')

请纠正我的理解,因为我认为这data.map(console.log)只会记录这些项目。

4

4 回答 4

7

您的代码工作正常,并且应该为其他函数产生预期的结果。

Array#map接受一个回调函数,它将为数组的每个元素调用该函数。医疗器械网络:

回调函数接受以下参数:

currentValue
数组中正在处理的当前元素。

indexOptional
数组中正在处理的当前元素的索引。

arrayOptional
调用了数组映射。

因为你是console.log作为回调函数传递的,所以你实际上是在写这个:

const myFunc = (...data) => (data.map((curVal,index,arr) => console.log(curVal,index,arr)))

myFunc('mango', 'apple', 'orange')

所以额外的输出是因为你也在不知不觉中记录了indexandarray参数。

请注意,您使用的任何其他函数也将接收这些额外参数。如果他们只接受一个参数,那么它应该完全按照您的预期工作。

于 2020-06-23T20:54:54.100 回答
3

console.log接受多个参数。

您可以将函数包装在另一个函数中并仅使用第一个参数。

forEach如果map从不使用结果会更好。

const single = fn => first => fn(first);

var myFunc = (...data) => {
    data.forEach(single(console.log));
}

myFunc('mango', 'apple', 'orange')

于 2020-06-23T20:55:15.690 回答
1

这是map引擎盖下的内容:

function map(a, f) {
  var b = new Array(a.length);
  for (let i = 0; i < a.length; i++) {
    b[i] = f(a[i], i, a);
  }
  return b;
}

console.log(
  map([0, 1, 2, 3], function(x, i, a) {
    return x * x;
  })
);

如您所见,f接收 3 个参数:元素a[i]、其位置i和数组a。是否使用它们取决于您,如这些扭曲的示例所示:

console.log(
  ["a", "b", "c", "d"].map(function(x, i, a) {
    return x + " " + a[(i + 1) % a.length];
  })
);

console.log(
  ["a", "b", "c", "d"].map(function(_, i) {
    return "2^" + i + " = " + 2 ** i;
  })
);

由于console.log接受任意数量的参数,如果直接将其传递给map它将使用所有三个参数a[i],ia. 要仅选择一个参数,您需要一个过滤器:

"abcd".split("").map(function(x) {
  console.log(x);
});

但是,正如 Nina 所说,forEach在这种情况下更合适,因为我们忽略了map(which is [undefined × 4]) 的输出:

"abcd".split("").forEach(function(x) {
  console.log(x);
});

于 2020-06-24T07:42:06.093 回答
0

选项 1中的输出将是:-

mango 0 (3) ["mango", "apple", "orange"]
apple 1 (3) ["mango", "apple", "orange"]
orange 2 (3) ["mango", "apple", "orange"]

这是因为以下两个原因:-

map()方法使用为每个数组元素调用函数的结果创建一个新数组。map()方法按顺序为数组中的每个元素调用一次提供的函数。

于 2020-06-23T20:58:07.467 回答