JavaScript最新几年新增方法

最近几年(大概处于2019-2024年之间)新增的JavaScript的字符串、数组、对象方法,一些新增的方法更加简单、高效。

字符串

String.prototype.replaceAll()

替换字符串中所有匹配的子串。

之前使用 replace 时想替换所有项,需要使用正则表达式,replaceAll更加方便。

js 复制代码
let str = "apple, banana, apple, orange";

// 使用 replace 和正则表达式全局标志 'g'
let newStr = str.replace(/apple/g, "pear");
let newStr1 = str.replaceAll("apple", "pear");

console.log(newStr);  // 输出: "pear, banana, pear, orange"
console.log(newStr1);  // 输出: "pear, banana, pear, orange"

数组

Array.prototype.flat()flatMap()

flat(depth)方法创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中(数组扁平化,将嵌套数组按指定深度展平)。

参数depth,指定要提取嵌套数组的结构深度,默认值为 1。

flatMap():先对数组元素执行映射,再展平一层。

等价于在调用 map()方法后再调用深度为 1 的 flat() 方法(arr.map(...args).flat())。

js 复制代码
[1, [2, [3]]].flat(2); // 输出 [1, 2, 3]

[1, 2].flatMap(x => [x * 2]); // 输出 [2, 4]

// 简单实现flat
function myFlat(arr, depth = 1) {
  return depth > 0
    ? arr.reduce(
        (acc, val) =>
          acc.concat(Array.isArray(val) ? myFlat(val, depth - 1) : val),
        []
      )
    : arr.slice();
}

Array.prototype.at()

at(index) 方法接收一个整数值并返回该索引对应的元素,允许正数和负数。

与直接使用 [] 访问的区别:

  • 负数索引支持:

    • at() 方法: 支持负数索引,允许从数组的末尾开始计数。例如,arr.at(-1) 返回数组的最后一个元素,arr.at(-2) 返回倒数第二个元素。

    • [] 访问: 不直接支持负数索引。要访问倒数第一个元素,需要使用 arr[arr.length - 1]

  • 越界访问:

    • at() 方法: 如果索引超出数组的范围,at() 返回 undefined,这使得代码在处理越界索引时更具可预测性。

    • [] 访问: 如果使用负数索引或其他,参数会被解释为一个属性名 "-1",可能会导致访问到数组的原型链上的属性。

at()中:

如果 index < 0,则会访问 index + array.length 位置的元素。

如果 index < -array.lengthindex >= array.length,则直接返回 undefined

js 复制代码
const arr = [1, 2, 3];
arr.at(-1); // 输出 3(等价于arr[ -1 + arr.length ])

Array.prototype.with()

with(index, value) 方法返回一个新数组,该数组是原数组的一个副本,但指定索引处的元素被替换为新的值。

  • 负数索引会从数组末尾开始计数------即当 index < 0 时,会使用 index + array.length

  • 如果规范化后的索引超出数组边界,会抛出 RangeError

js 复制代码
const arr = [1, 2, 3, 4, 5];
const newArr = arr.with(2, 99);  // 将索引2处的元素替换为99
console.log(newArr);  // 输出: [1, 2, 99, 4, 5]
console.log(arr);     // 输出: [1, 2, 3, 4, 5] (原数组不变)

当需要更新数组中特定位置的元素但不想修改原数组时,可以使用 with() 方法。

反向操作版本

Array.prototype.findLast()

findLast() 方法返回数组中满足提供的测试函数的最后一个元素,类似 find() 的反向操作。如果没有找到,则返回 undefined

js 复制代码
const arr = [5, 12, 8, 130, 44];
const found = arr.findLast(element => element > 10);
console.log(found);  // 输出: 44

当需要在数组中查找符合条件的最后一个元素时,可以使用 findLast() 方法。

Array.prototype.findLastIndex()

findLastIndex() 方法返回数组中满足提供的测试函数的最后一个元素的索引,类似 findIndex() 的反向操作。。如果没有找到,则返回 -1

js 复制代码
const arr = [5, 12, 8, 130, 44];
const index = arr.findLastIndex(element => element > 10);
console.log(index);  // 输出: 4 (因为44是最后一个大于10的元素)

当需要在数组中查找符合条件的最后一个元素的索引时,可以使用 findLastIndex() 方法。

复制数组版本

新增的方法toReversed()toSorted()toSpliced()

与传统的 reverse()sort()splice() 方法不同,这些新方法不会修改原始数组,

对象

Object.fromEntries()

将键值对列表(如Map或二维数组)转换为对象。

应用场景:与Object.entries()结合,实现对象与数组的转换。

js 复制代码
Object.fromEntries([['a', 1], ['b', 2]]); // 输出 { a: 1, b: 2 }

Object.entries({ a: 1, b: 2 }); // ['a', 1], ['b', 2]])

Object.groupBy()

Object.groupBy() 方法:根据指定的条件对数组或其他可迭代对象进行分组,返回一个对象,其中每个属性对应一个分组。

应用场景:对元素进行分组。

注意,属性名为字符串,如果你需要使用某个任意值作为键来对元素进行分组,请改用 Map.groupBy() 方法。

js 复制代码
const inventory = [
  { name: "芦笋", type: "蔬菜", quantity: 5 },
  { name: "香蕉", type: "水果", quantity: 0 },
  { name: "山羊", type: "肉", quantity: 23 },
  { name: "樱桃", type: "水果", quantity: 5 },
  { name: "鱼", type: "肉", quantity: 22 },
];

function myCallback({ quantity }) {
  return quantity > 5 ? "more" : "less";
}

const result2 = Object.groupBy(inventory, myCallback);

console.log(result2);
/* 结果是:
  {
    less: [
      { name: "芦笋", type: "蔬菜", quantity: 5 },
      { name: "香蕉", type: "水果", quantity: 0 },
      { name: "樱桃", type: "水果", quantity: 5 }
    ],
    more: [
      { name: "山羊", type: "肉", quantity: 23 },
      { name: "鱼", type: "肉", quantity: 22 }
    ]
  }
  */

兼容性

除了Object.groupBy()比较新,浏览器2023年底开始支持,其他方法都在2022之前。

Nodejs兼容

Nodejs版本 方法
21.0.0 Object.groupBy()
20.0.0 Array.prototype.with() Array.prototype.toSorted() Array.prototype.toReversed() Array.prototype.toSpliced()
19.0.0
18.0.0 Array.prototype.findLast() Array.prototype.findLastIndex()
16.6.0 Array.prototype.at()
15及以下 Object.fromEntries() String.prototype.replaceAll() Array.prototype.flat() 和 flatMap()

数组方法分类

#数组分类

改变原数组 返回新数组
- push():在数组末尾添加一个或多个元素。 - pop():删除数组末尾的一个元素。 - shift():删除数组开头的一个元素。 - unshift():在数组开头添加一个或多个元素。 - splice():从数组中添加、删除或替换元素。 - reverse():反转数组的顺序。 - sort():对数组元素进行排序。 - copyWithin() - concat():连接两个或多个数组,返回一个新数组。 - slice():返回数组的浅拷贝,包含从开始到结束(不包括结束)之间的所有元素。 - join():将数组的所有元素连接成一个字符串。 - map():对数组的每个元素执行指定函数,返回一个新数组。 - filter():创建一个包含所有通过测试的元素的新数组。 - reduce():对数组中的每个元素执行指定的累加器函数,返回一个单一的值。 - flat():将多维数组"拉平"为一维数组。 - flatMap():先对数组的每个元素执行指定函数,然后将结果"拉平"为一维数组。 - toReversed():返回一个新数组,元素顺序与原数组相反。 - toSorted():返回一个新数组,元素按指定顺序排序。 - toSpliced():返回一个新数组,删除或替换指定位置的元素。 - with():返回一个新数组,指定位置的元素被替换为新值。
相关推荐
键指江湖21 分钟前
React 在组件间共享状态
前端·javascript·react.js
烛阴33 分钟前
零基础必看!Express 项目 .env 配置,开发、测试、生产环境轻松搞定!
javascript·后端·express
诸葛亮的芭蕉扇39 分钟前
D3路网图技术文档
前端·javascript·vue.js·microsoft
徐小夕1 小时前
花了2个月时间研究了市面上的4款开源表格组件,崩溃了,决定自己写一款
前端·javascript·react.js
拉不动的猪2 小时前
UniApp金融理财产品项目简单介绍
前端·javascript·面试
苏卫苏卫苏卫2 小时前
【Vue】案例——To do list:
开发语言·前端·javascript·vue.js·笔记·list
聪明的墨菲特i3 小时前
React与Vue:哪个框架更适合入门?
开发语言·前端·javascript·vue.js·react.js
拉不动的猪3 小时前
v2升级v3需要兼顾的几个方面
前端·javascript·面试
冴羽4 小时前
SvelteKit 最新中文文档教程(20)—— 最佳实践之性能
前端·javascript·svelte
Nuyoah.4 小时前
《Vue3学习手记2》
javascript·vue.js·学习