JavaScript' forEach'误解

时间:2015-09-14 07:54:25

标签: javascript

此功能正常运行:

function task02(arr) {
  var out = [];
  arr = arr.forEach(function(item, i){
    (item > 0) ? out.push(1) : out.push(0);
  });
  return out;
}

这不是(输出undefined):

function task02(arr) {
  arr = arr.forEach(function(item, i){
    (item > 0) ? item = 1 : item = 0;
  });
  return arr;
}

我已尝试同时使用itemitem[i],但它无效。有人可以向我解释,为什么这不起作用?

2 个答案:

答案 0 :(得分:4)

  

有人可以向我解释,为什么这不起作用?

JavaScript是pass/call/assign by value。这意味着为变量赋值不会神奇地改变另一个变量(或数组元素)的值。

更简单的例子:

var foo = 42;
var bar = foo;
foo = 21;

bar仍具有值42

在您的情况下,分配给item不会更改数组元素。

与往常一样,如果您使用不熟悉的方法,read its documentation first

答案 1 :(得分:3)

第二个示例中的回调函数没有任何副作用。它只是迭代数组,进行比较,就是这样。这是.forEach(迭代数组但返回undefined)和迭代的.map.filter.reduce等数组方法之间的主要区别,对每个项执行回调并返回修改后的数组。

如果要避免临时数组,在这种情况下应使用Array.map

function task02(arr) {
  return arr.map(function(item, i){
    return (item > 0) ? 1 : 0;
  });
}