JavaScript 中的 4 种新方法指南Array.
wptr33 2025-05-05 19:04 19 浏览
JavaScript 中的 4 种新方法指南Array.prototype
Array其实和Python中的l列表list的操作用非常像
JavaScript 语言标准的最新版本是 ECMAScript 2023,这是第 14 版。此更新包括原型上的新方法。Array
我将指导您了解本文中突出的四种新方法,包括它们在稀疏数组和类数组对象中的行为。如果你喜欢编写JavaScript程序的声明式、函数式风格,那么你将大饱口福。
潜入:
- 保留没有任何突变的原始阵列重要吗?
- toReversed() 方法
- toSorted() 方法
- toSpliced(start, deleteCount, ...项)方法
- with(index, value) 方法
保留没有任何突变的原始阵列重要吗?
四种新数组方法的一个共同主题是专注于不改变原始数组,而是返回一个全新的数组。您可能想知道,为什么这种行为很重要?
一般来说,不修改数据有很多优点,这四种新的数组方法就证明了这一点。这些好处不仅限于数组,而是扩展到所有 JavaScript 对象。
尽管有很多好处,但下面概述了一些最重要的好处:
- 纯函数:在函数式编程中,纯函数是在给定相同输入时始终产生相同输出的函数:它们没有任何副作用,并且它们的行为是可预测的。当你不修改数据时,使用这个函数式心智模型是理想的选择,这四种新的数组方法是一个很好的补充。
- 可预测的状态管理:创建状态对象(或数组)的新副本通过消除意外更改并使用新副本表示特定时间点的数据,使状态管理更具可预测性。这简化了大规模状态管理,并总体上改进了有关状态管理的推理
- 更改检测:像 React 这样的框架通过比较状态或 props 对象的两个副本来识别任何更改并相应地呈现用户界面,从而使用简化的更改检测。使用这些方法检测变化变得更加简单,因为我们可以在任何给定时刻比较两个对象以识别任何变化。
方法toReversed()
该方法与经典方法相似,但有明显的区别。 反转数组中的元素,而不改变原始数组。toReversed()reverse()toReversed()
考虑以下水果阵列:
const fruits = ["apple", "orange", "banana"]
现在,反向与:fruits.reverse()
// Reverse the array
const result = fruits.reverse()
console.log(result)
// ['banana', 'orange', 'apple']
console.log(fruits)
// ['banana', 'orange', 'apple']
// original array is mutated
使用 ,原始数组发生突变。reverse()
要反转数组而不改变它,我们可以使用如下所示的方法:toReversed()
// Reverse the array
const result = fruits.toReversed()
console.log(result)
// ['banana', 'orange', 'apple']
console.log(fruits)
// ["apple", "orange", "banana"]
// original array is preserved
瞧!
如果您使用的是最新版本的当前浏览器(如 Chrome),则可以访问浏览器控制台并测试本文中提供的代码示例:
在浏览器控制台中尝试该方法toReversed
稀疏数组的行为
为了快速复习,稀疏数组是没有顺序元素的数组。例如,请考虑以下事项:
const numbers = [1,2,3]
// Assign an item to index 11
numbers[11] = 12
console.log(numbers)
// [1, 2, 3, empty × 8, 12]
在上面的示例中, 有八个空项目槽。 是一个稀疏数组。现在,回到 。这如何与稀疏数组一起工作?numbersnumberstoReversed()
toReversed()从不返回稀疏数组。如果原始阵列有空插槽,则它们将返回为 。undefined
考虑调用下面的数组:toReversed()numbers
const numbers = [1,2,3]
// Assign an item to index 11
numbers[11] = 12
numbers.toReversed()
// [12, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 3, 2, 1]
正如预期的那样,所有空插槽都作为数组项值返回。undefined
类数组对象的行为
即使专门存在于原型上,它也可以在类似数组的对象上调用。toReversed()Array
类似数组的对象通常具有属性和(可选)具有整数索引名称的属性。字符串对象是类数组对象的一个示例。length
该函数首先读取调用它的对象的属性,然后从末尾到开头遍历对象的整数键,这意味着从 to .它将每个属性的值添加到新数组的末尾,然后返回该数组。toReversed()lengthlength - 10
让我们试一试。考虑在字符串上的错误应用:toReversed()
const s = "Ohans Emmanuel"
// call `toReversed` directly on the string
s.toReversed()
//Uncaught TypeError: s.toReversed is not a function
即使字符串对象是一个类似数组的对象,这个程序也是错误的:我们不能以这种方式调用它,因为原型上不存在。string.toReversed()toReversedstring
但是,我们可能会使用如下所示的方法:call()
const s = "Ohans Emmanuel"
// Array.prototype.toReversed.call(arrayLike)
Array.prototype.toReversed.call(s)
//['l', 'e', 'u', 'n', 'a', 'm', 'm', 'E', ' ', 's', 'n', 'a', 'h', 'O']
一个自我构造的、类似数组的对象怎么样?请考虑以下示例:
// Has a length property and integer index property.
const arrayLike = {
length: 5,
2: "Item #2"
}
如果这是一个标准数组,它将是一个稀疏数组,即长度为五,第二个索引中的值。
考虑调用此内容的结果:toReversed
console.log(Array.prototype.toReversed.call(arrayLike))
// [undefined, undefined, 'Item #2', undefined, undefined]
该函数生成一个反向数组,而不创建稀疏数组。正如预期的那样,空插槽返回为 。toReversed()undefined
方法toSorted()
.toSorted()是经典方法的对应物。.sort()
您可能已经猜到了,与 不同,不会改变原始数组。考虑以下基本排序操作:.sort().toSorted().sort()
const list = [1, 5, 6, 3, 7, 8, 3, 7]
//Sort in ascending order
const result = list.sort()
console.log(result)
// [1, 3, 3, 5, 6, 7, 7, 8]
console.log(list)
// [1, 3, 3, 5, 6, 7, 7, 8]
如上所示,对数组进行就地排序,从而改变数组。现在,考虑与以下相同的情况:sort()toSorted()
const list = [1, 5, 6, 3, 7, 8, 3, 7]
// Sort in ascending order
const result = list.toSorted()
console.log(result)
// [1, 3, 3, 5, 6, 7, 7, 8]
console.log(list)
// [1, 5, 6, 3, 7, 8, 3, 7]
如上所示,返回一个元素排序的新数组。toSorted()
请注意,保留与 相同的语法。例如,我们可以指定一个定义排序顺序的函数,例如。toSorted()sort()list.toSorted(compareFn)
请考虑以下示例:
const list = [1, 5, 6, 3, 7, 8, 3, 7]
//Sort the array in descending order
list.toSorted((a,b) => a < b ? 1 : -1)
// [8, 7, 7, 6, 5, 3, 3, 1]
稀疏数组的行为
空插槽将始终返回为 。事实上,它们被视为值为 .但是,不会为这些插槽调用 ,它们将始终位于返回数组的末尾。
undefinedundefinedcompareFn
考虑以下示例,其中包含第一个插槽为空的数组:
// Note the empty initial slot
const fruits = [, "apple", "orange", "banana"]
console.log(fruits.toSorted())
// ['orange', 'banana', 'apple', undefined]
此行为与初始值为 .请考虑以下示例:undefined
const fruits = [undefined, "apple", "orange", "banana"]
console.log(fruits.toSorted())
// ['orange', 'banana', 'apple', undefined]
另外,请注意,空插槽(或插槽)将始终移动到返回数组的末尾,无论它们在原始数组中的位置如何。undefined
请考虑以下示例:
// empty slot is in index 2
const fruits = ["apple", "orange", , "banana"]
console.log(fruits.toSorted())
// returned last
// ['orange', 'banana', 'apple', undefined]
// undefined value is in index 2
const otherFruits = ["apple", "orange", undefined , "banana"]
console.log(otherFruits.toSorted())
// returned last
// ['orange', 'banana', 'apple', undefined]
类数组对象的行为
当函数与对象一起使用时,它将首先读取对象的属性。然后,它将从头到尾收集对象的整数键,即从 to .对它们进行排序后,它将在新数组中返回相应的值。toSorted()lengththis0length - 1
请考虑以下带有字符串的示例:
const s = "Ohans Emmanuel"
// Array.prototype.toSorted.call(arrayLike)
Array.prototype.toSorted.call(s)
(14) [' ', 'E', 'O', 'a', 'a', 'e', 'h', 'l', 'm', 'm', 'n', 'n', 's', 'u']
请考虑以下示例,其中包含一个构造的类似数组的对象:
// Has a length property and integer index property.
const arrayLike = {
length: 5,
2: "Item #2"
10: "Out of bound Item" // This will be ignored since the length is 5
}
console.log(Array.prototype.toSorted.call(arrayLike))
// ['Item #2', undefined, undefined, undefined, undefined]
方法toSpliced(start,deleteCount,...items)
.toSpliced()是经典方法的对应物。与我们介绍的其他新方法一样,与 ..splice()toSpliced().splice()
的语法与 相同,如下所示:toSpliced.splice
toSpliced(start)
toSpliced(start, deleteCount)
toSpliced(start, deleteCount, item1)
toSpliced(start, deleteCount, item1, item2, itemN)
使用经典 添加新的数组项,如下所示:.splice()
const months = ["Feb", "Mar", "Apr", "May"]
// Insert item "Jan" at index 0 and delete 0 items
months.splice(0, 0, "Jan")
console.log(months)
// ['Jan', 'Feb', 'Mar', 'Apr', 'May']
splice()插入新的数组项并改变原始数组。要在不改变原始数组的情况下创建新数组,请使用 。toSpliced()
考虑将上面的示例重写为使用 :toSpliced()
const months = ["Feb", "Mar", "Apr", "May"]
// Insert item "Jan" at index 0 and delete 0 items
const updatedMonths = months.toSpliced(0, 0, "Jan")
console.log(updatedMonths)
// ['Jan', 'Feb', 'Mar', 'Apr', 'May']
console.log(months)
// ['Feb', 'Mar', 'Apr', 'May']
toSpliced()返回一个新数组而不改变原始数组。请注意两者的语法如何相同。toSpliced()splice()
稀疏数组的行为
toSpliced()从不返回稀疏数组。因此,空插槽将返回为 .undefined
请考虑以下示例:
const arr = ["Mon", , "Wed", "Thur", , "Sat"];
// Start at index 1, and delete 2 items
console.log(arr.toSpliced(1, 2));
// ['Mon', 'Thur', undefined, 'Sat']
类数组对象的行为
对于类似数组的对象,获取对象的长度,读取所需的整数键,并将结果写入新数组:toSplicedthis
const s = "Ohans Emmanuel"
// Start at index 0, delete 1 item, insert the other items
console.log(Array.prototype.toSpliced.call(s, 0, 1, 2, 3));
// [2, 3, 'h', 'a', 'n', 's', ' ', 'E', 'm', 'm', 'a', 'n', 'u', 'e', 'l']
方法with(index,value)
数组方法特别有趣。首先,考虑用于更改特定数组索引值的括号表示法:.with()
const favorites = ["Dogs", "Cats"]
favorites[0] = "Lions"
console.log(favorites)
//(2) ['Lions', 'Cats']
使用括号表示法,原始数组总是改变的。 实现在特定索引中插入元素的相同结果,但不会改变数组。相反,它会返回一个带有替换索引的新数组。.with()
让我们重写初始示例以使用:.with()
const favorites = ["Dogs", "Cats"]
const result = favorites.with(0, "Lions")
console.log(result)
// ['Lions', 'Cats']
console.log(favorites)
// ["Dogs", "Cats"]
稀疏数组的行为
with()从不返回稀疏数组。因此,空插槽将返回为:undefined
const arr = ["Mon", , "Wed", "Thur", , "Sat"];
arr.with(0, 2)
// [2, undefined, 'Wed', 'Thur', undefined, 'Sat']
类数组对象的行为
与其他方法类似,读取对象的属性。然后,它读取对象的每个正整数索引(小于 )。访问这些时,它会将其属性值保存到返回数组索引中。with()lengththislength
最后,在返回的数组上设置调用签名中的 and。请考虑以下示例:indexvaluewith(index, value)
const s = "Ohans Emmanuel"
// Set the value of the first item
console.log(Array.prototype.with.call(s, 0, "F"));
// ['F', 'h', 'a', 'n', 's', ' ', 'E', 'm', 'm', 'a', 'n', 'u', 'e', 'l']
结论
ECMAScript 标准在不断改进,利用它的新功能是个好主意。继续利用 、、 并创建更具声明性的 JavaScript 应用程序。
toReversedtoSortedtoSplicedwith
相关推荐
- MySql系列-常用命令
-
本篇是对...
- Record.ToTable 格式转换
-
本期案例对表格格式进行转换,前后转换效果如下:解题套路1.Record.ToTable解题思路:思路就是构造可以透视的样式。使用Record.ToTable对行记录进行转换,获得包含两列的表,首行可以...
- Table.Group 按时期累计计算唯一值
-
本期案例是根据不同id进行汇总统计:组内,相同日期的为一组,统计“from”、“to”中的非重复个数;连续日期的,统计累计数。前后转换效果如下:解题套路1.Table.Group...
- MySQL 9.1正式发布,有哪些值得关注的新特性?
-
MySQL创新版9.1.0于2024年10月15日正式发布。此外,MySQL8.0.40及8.4.3补丁版本也同时发布。8.4.3是目前MySQL的LTS长期支持版本,该版本中将不会增加新的功能与特性...
- SQL基本语句练习(基础版)
-
最近在学习SQL基本语句的练习,在此分享一下笔者做过的练习以及个人的解决教程:首先是基本练习表格的搭建,具体内容如下表所示:...
- SQL 从入门到精通:全面掌握数据库操作
-
学习SQL(StructuredQueryLanguage)是掌握数据库操作的关键步骤。SQL是一种用于管理和处理关系型数据库的标准语言,广泛应用于数据检索、插入、更新和删除等操作。以下是一些...
- ClickHouse学习笔记四ClickHouse基础语法
-
前言这里我们介绍ClickHouse的基本语法,使用环境是腾讯云的ClickHouse。默认情况下,ClickHouse在进行集群纬度执行建表等DDL操作时需要手动添加ONCLUSTERX...
- 程序员总结的常用sql语句大全
-
多年经验程序员总结的我们一般需要使用的sql语句,赶快收藏起来,方便以后使用。以下是一些常用的SQL语句及其用法:一、数据定义语言(DDL)创建库CREATEDATABASE:创建一个新数据库。...
- PQ03-分组求和
-
目标已知:销售清单求:每个销售员的销量合计方法数据准备...
- 好荐:一款数据库元数据管理平台工具
-
“元数据”的定义在不同的软件、项目、工程的定义范围都不太一样。本文这里指的是软件项目开发使用的数据库表结构信息。我今天介绍的这个开源项目叫Databasir,它是一个面向团队的关系型数据库模型文档管理...
- MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
-
前言提到SQL优化,大多数人想到的还是那些经典套路:建索引、避免全表扫描、优化JOIN顺序…这些确实是基础,但如果你还停留在MySQL5.7时代的优化思维,那就out了。MySQL8.0已经发布好...
- MySQL数据库深度优化指南:从基础到架构层面的20个关键策略
-
一、核心性能优化原则数据最小化原则...
- 动物源性食品中兽药残留的检测——喹啉类药物残留
-
喹啉类药物(quinoxaline)是具有喹啉-N1,N4-二氧化物基本结构的一类化学合成的动物专用药,具有广谱抗菌、提高饲料转化率和促生长作用。1965年德国拜耳公司以邻硝基苯胺为原料合成喹乙醇(o...
- 适合普通开发者和产品经理的PHP应用模板开发AI的SaaS应用框架
-
简单到傻!Liang_SaaS适合普通开发者和产品经理的PHP应用模板开发AI的SaaS应用框架,利用Php开发AI的SaaS应用框架,是一个强大的内容管理仪表板模板,基于Bootstrap和...
- Power Query 交错合并表格的方法
-
两张表格合并成一张表格,需要交错排列,表1取一行,表2取一行,这样排列在一起:前提是两张表的行数相同,内容排列顺序相同:我们来看两张表:表1:12列10行表2:11列10行行数相同列数不同,我们在数据...
- 一周热门
-
-
因果推断Matching方式实现代码 因果推断模型
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)