为什么使用.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() {}