【问题标题】:How to remember if a method mutates the original array?如何记住一个方法是否改变了原始数组?
【发布时间】:2019-02-22 22:33:28
【问题描述】:

我知道我可以在 MDN 上找到一个 mutator 方法列表,但实际上,我总是忘记 push() 或 reverse() 等方法是否会改变原始数组或创建一个新数组。为什么某些方法是突变体而有些是非突变体是否有逻辑,所以我很容易记住?

【问题讨论】:

  • 这是一个有效的问题,没有具体的解决方案。当我编写一个处理数组的函数式程序时,我将复制输入并使用副本。 const array = [...], let copy = [...array].
  • 在了解需要复制的地方之前复制是一个陷阱。我想不出上次我制作了一个数组的完整副本并且我不使用变异方法。

标签: javascript methods


【解决方案1】:

也许记住它们的一个有用方法是识别变异方法并将它们分组;只有少量。

从数组中添加/删除:

  • Array.prototype.fill() - 覆盖任何地方的元素
  • Array.prototype.pop() - 从右侧移除
  • Array.prototype.push() - 添加到右侧
  • Array.prototype.shift() - 从左侧移除
  • Array.prototype.unshift() - 添加到左侧
  • Array.prototype.splice() - 在任何地方添加/删除

重新排列数组:

  • Array.prototype.flat() - 展平数组
  • Array.prototype.sort() - 使用排序功能重新排列元素
  • Array.prototype.reverse() - 反向元素

奇数:

  • Array.prototype.copyWithin() - 老实说,我从未使用过这种方法

变异数组方法列表 -

  • Array.prototype.copyWithin()
  • Array.prototype.fill()
  • Array.prototype.flat()
  • Array.prototype.pop()
  • Array.prototype.push()
  • Array.prototype.reverse()
  • Array.prototype.shift()
  • Array.prototype.sort()
  • Array.prototype.splice()
  • Array.prototype.unshift()

非可变数组方法列表 -

  • Array.from() - 从可迭代对象创建数组
  • Array.isArray() - 检查变量是否为数组
  • Array.of() - 创建一个数组; []的函数版本
  • Array.prototype.concat() - 将多个数组组合成一个新的单个数组
  • Array.prototype.entries() - 获取键/值对的迭代器
  • Array.prototype.every() - 检查每个值是否与函数匹配
  • Array.prototype.filter() - 创建一个与过滤器匹配的值数组
  • Array.prototype.find() - 使用函数查找值
  • Array.prototype.findIndex() - 使用函数查找值的索引
  • Array.prototype.flatMap() - 使用映射函数创建一个新数组
  • Array.prototype.forEach() - 为每个值运行一个副作用
  • Array.prototype.includes() - 检查数组是否包含值
  • Array.prototype.indexOf() - 按值查找值的索引
  • Array.prototype.join() - 使用分隔符将值组合成一个字符串
  • Array.prototype.keys() - 获取键的迭代器
  • Array.prototype.lastIndexOf() - 按值查找索引,从末尾开始
  • Array.prototype.map() - 使用映射函数创建一个新数组
  • Array.prototype.reduce() - 折叠每个值,产生一个新值
  • Array.prototype.reduceRight() - 折叠每个值,从右边开始,产生一个新值
  • Array.prototype.slice() - 选择一个子数组
  • Array.prototype.some() - 检查某个值是否与函数匹配
  • Array.prototype.toLocaleString() - 数组的字符串表示,在值上使用 toLocaleString
  • Array.prototype.toString() - 数组的字符串表示,在值上使用 toString
  • Array.prototype.values() - 获取值的迭代器
  • Array.prototype[@@iterator]() - 获取默认迭代器

【讨论】:

  • 编辑队列已满,所以我要在这里指出一些更正:Array.prototype.pop() - 删除 last 元素 Array.prototype.push() - 在 last 上添加元素位置 Array.prototype.shift() - 删除第一个元素 Array.prototype.unshift() - 在第一个位置插入元素
【解决方案2】:

任何导致索引移动、减少或增长,或以其他方式更改列表的原始定义的方法,本质上都必须是可变的。助记符可能是考虑您是想要数组中的东西还是想要对数组做某事? Shift 和 pop 可以说是令人困惑的,因为它们实际上没有等效的不可变便捷方法,例如 say 'top' 或 'last'。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 2016-06-24
    • 2015-04-24
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多