gpt4 book ai didi

javascript - 为什么使用 .reduce 而不是 reduce()?在使用 JavaScript 扁平化数组中

转载 作者:行者123 更新时间:2023-11-30 10:12:59 24 4
gpt4 key购买 nike

这个例子来自 http://eloquentjavascript.net/code/#5.1 .
我的问题是第一个重点细节;其他可能是有用的细节,但也是额外的;另请参阅第一个简短的节目,以在上下文中查看我的问题。

- 为什么是 arrays.reduce()代替reduce(arrays()) .我知道他们的作品与 arrays.reduce , 但为什么?

这是对有用的评论的回答,但对原始问题的补充。

  • 我的问题是第一个程序。由于它使用arrays.reduce,
    reduce 将是一种数组方法,我不确定为什么 reduce 是一种
    数组的方法。原因可能在于设计决策
    JavaScript?谢谢@cookie 怪物的评论!

  • 这是与我的问题有关的程序-
    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 中的 start 参数,以便将其他数组添加到该空数组中。我知道 .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;
    }

    如果有帮助,他们的其他示例之一展示了我使用单个数组的方式。它看起来像:
    console.log(reduce([1, 2, 3, 4], function(a, b){
    return a + b;
    }, 0));
    // 10

    谢谢! :)

    最佳答案

    在面向对象的设计中,指导原则是您创建或声明对象,并且这些对象具有一系列对特定类型对象进行操作的方法。由于 Javascript 是一种面向对象的语言,因此内置函数遵循许多面向对象的原则。
    .reduce()是一个只对数组起作用的函数。没有要操作的数组是没有用的。因此,在面向对象的设计范例中,放置 .reduce() 是完全有意义的。用作 Array 上的方法目的。

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

  • 它与该语言其他地方使用的面向对象原则一致。
  • 调用 .reduce() 很方便特定 array 上的函数通过使用 array.reduce()并且从它正在操作的数组的语法中可以明显看出。
  • 所有数组操作都被分组为 Array 上的方法。对象使 API 定义更加自我记录。
  • 如果你试图做 obj.reduce() (在非数组上调用它),您将立即收到有关未定义 .reduce() 的运行时错误方法。
  • 在全局范围内没有额外的空间(例如,没有定义额外的全局符号 - 减少意外覆盖或与其他代码冲突的机会)。


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

    当您想为现有的内置对象添加一些功能时,如 Array在 Javascript 中,您通常有两种选择。您可以向原型(prototype)添加一个方法(以面向对象的方式),或者您可以创建一个全局函数,该函数采用 Array作为它的第一个论点。

    对于 Array尤其是对象,将可迭代方法添加到 Array 存在一些潜在问题。原型(prototype)。这是因为如果有任何代码对数组进行这种类型的迭代(迭代数组的不好方法,但仍然有很多人这样做):
    for (var prop in array)

    它们最终不仅会迭代数组的元素,还会迭代数组的任何可迭代属性。如果使用这种语法将新方法分配给原型(prototype):
    Array.prototype.myMethod = function() {}

    然后,这个新方法最终将使用 for (var prop in array) 进行迭代。语法,它通常会导致问题。

    因此,与其向原型(prototype)添加新方法,更安全的替代方法是仅使用全局函数并避免此问题。

    从 ES 5.1 开始,有一种使用 Object.defineProperty() 的方法向对象或原型(prototype)添加不可迭代的方法,因此对于较新的浏览器,现在可以向原型(prototype)添加不受上述问题影响的方法。但是,如果您想支持旧版浏览器(如 IE8)并使用 reduce()类型的功能,你仍然被这些古老的限制所困扰。

    所以...即使一个全局 reduce()不太面向对象,并且在 Javascript 中通常不那么理想,一些较旧的代码出于合法的安全/互操作性原因而采用了这种方式。幸运的是,随着旧版 IE 的使用量下降,我们正在把这条路抛在身后(感谢上帝,微软放弃了对 XP 的支持,最终加速了旧版 IE 的消亡)。较新的浏览器已经包含 array.reduce()内置。

    关于javascript - 为什么使用 .reduce 而不是 reduce()?在使用 JavaScript 扁平化数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25477866/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com