为什么使用.reduce而不是reduce()?在使用JavaScript展平数组时

为什么使用.reduce而不是reduce()?在使用JavaScript展平数组时,javascript,arrays,flatten,Javascript,Arrays,Flatten,这个例子来自。 我的问题是第一个尖锐的细节;其他可能是有用的细节,但是附加的;另外,请看第一个简短的程序,以了解我的问题 -为什么使用arrays.reduce()代替reduce(arrays())。我知道他们的使用了数组。reduce,但为什么呢? 这是对一条有用的评论的回答,但是对原始问题的补充 我的问题是关于第一个节目。因为它使用arrays.reduce, reduce将是数组的一种方法,我不确定reduce为什么是数组的一种方法 数组的方法。原因可能在于设计决策 JavaScrip

这个例子来自。 我的问题是第一个尖锐的细节;其他可能是有用的细节,但是附加的;另外,请看第一个简短的程序,以了解我的问题

-为什么使用
arrays.reduce()
代替
reduce(arrays())
。我知道他们的使用了
数组。reduce
,但为什么呢? 这是对一条有用的评论的回答,但是对原始问题的补充

  • 我的问题是关于第一个节目。因为它使用arrays.reduce, reduce将是数组的一种方法,我不确定reduce为什么是数组的一种方法 数组的方法。原因可能在于设计决策 JavaScript?谢谢,@cookiemonster,谢谢你的评论
这是一个与我的问题有关的节目-

var arrays = [[1, 2, 3], [4, 5], [6]];

console.log(arrays.reduce(function(flat, current) {
  return flat.concat(current);
}, []));

// → [1, 2, 3, 4, 5, 6]

下面这些细节是附加的,但可能(也可能不是)有用:

我知道最后使用的是
[]
,因为它是函数reduce中的开始参数,所以其他数组被添加到该空数组中。我知道
.concat
是用字符串将两个数组(如
+
)放在一起的,但用于数组。以下是reduce函数(尽管是标准函数)的外观:

function reduce(array, combine, start){
  var current = start;
  for(var i = 0; i < array.length; i++)
    current = combine(current, array[i]);
  return current;
}
谢谢!:)

曾经/现在受到语言的影响,这是中国的一种方言。在Scheme中是该语言的一个关键部分。实际上,
reduce
函数与Scheme中的
fold
函数相当。在JavaScript中的
reduce
函数中,语言的创建者注意到程序员通常需要以某种方式遍历数组,并给了程序员一个更高阶的函数,在这里他们可以传递一个函数来指定他们想要如何操作数据。拥有高阶函数允许程序员抽象冗余代码,从而创建更短、更干净、更可读的代码

您可以使用JavaScript中的
reduce
函数来完成除平展列表之外的许多事情。请看一个例子。

曾经/正在受到语言的影响,一种印度方言。在Scheme中是该语言的一个关键部分。实际上,
reduce
函数与Scheme中的
fold
函数相当。在JavaScript中的
reduce
函数中,语言的创建者注意到程序员通常需要以某种方式遍历数组,并给了程序员一个更高阶的函数,在这里他们可以传递一个函数来指定他们想要如何操作数据。拥有高阶函数允许程序员抽象冗余代码,从而创建更短、更干净、更可读的代码


您可以使用JavaScript中的
reduce
函数来完成除平展列表之外的许多事情。看一个例子。

在面向对象设计中,一个指导原则是创建或声明对象,这些对象上有一系列对特定类型的对象进行操作的方法。由于Javascript是一种面向对象的语言,因此内置函数遵循许多面向对象的原则

.reduce()
是一个仅在阵列上运行的函数。如果没有阵列进行操作,它是没有用的。因此,在面向对象的设计范例中,将
.reduce()
函数作为方法放置在
数组
对象上是完全有意义的

与全局
reduce()
函数相比,这种面向对象的方法具有以下优点:

  • 它与语言中其他地方使用的面向对象原则是一致的
  • 通过使用
    array.reduce()
    可以方便地调用特定
    数组上的
    .reduce()
    函数,从它所操作的数组的语法可以明显看出
  • 所有数组操作都分组为
    数组
    对象上的方法,使API定义更具自文档性
  • 如果您尝试执行
    obj.reduce()
    (在非数组上调用它),您将立即得到一个关于未定义的
    .reduce()
    方法的运行时错误
  • 全局范围内没有额外的空间(例如,没有定义额外的全局符号-减少意外覆盖或与其他代码冲突的机会)

  • 如果您想知道为什么有人使用全局
    reduce()
    ,您需要了解一点Javascript发展的历史。在ES5之前(或对于运行浏览器但尚未实现像IE8这样的ES5的用户),Javascript在
    数组
    对象上没有内置的
    .reduce()
    方法。然而,一些熟悉其他语言中这种有用的迭代功能的开发人员希望在自己的Javascript或Javascript框架中使用它

    当您想向现有的内置对象(如Javascript中的
    Array
    )添加一些功能时,通常有两种选择。您可以向原型中添加一个方法(以面向对象的方式),也可以创建一个全局函数,将
    数组
    作为其第一个参数

    特别是对于
    Array
    对象,在
    Array
    原型中添加iterable方法存在一些潜在问题。这是因为,如果任何代码对数组进行这种类型的迭代(迭代数组的一种不好的方法,但很多代码都这样做):

    它们将不仅迭代数组的元素,而且迭代数组的任何可重用属性。如果使用此类型的语法将新方法分配给原型:

    Array.prototype.myMethod = function() {}
    
    然后,这个新方法将使用
    for(数组中的var prop)
    语法进行迭代,它通常会导致问题

    因此,与其在原型中添加新方法,不如选择更安全的替代方法
    for (var prop in array)
    
    Array.prototype.myMethod = function() {}