当前位置: 首页 > news >正文

【面试题】JavaScript数组切片方法有哪些?

 给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

数组上的slice方法返回数组一部分的浅拷贝。它需要两个数字, astart和 an end。每个数组都有一个slice方法。这是一个简单的例子:

let myArray = [ '⚡️', '🔎', '🔑', '🔩' ];
let newArray = myArray.slice(2, 3);

console.log(newArray); // [ '🔑' ]
复制代码

slice该方法有两个可选参数start, 和end。如果您愿意,您可以同时提供两者、仅提供start或都不提供 - 所以所有这些都是有效的:

let arrayOne = [ '⚡️', '🔎', '🔑', '🔩' ];
let arrayOneSlice = arrayOne.slice(2, 3);  // [ '🔑' ]

let arrayTwo = [ '⚡️', '🔎', '🔑', '🔩' ];
let arrayTwoSlice = arrayTwo.slice(2);  // [ '🔑', '🔩' ]

let arrayThree = [ '⚡️', '🔎', '🔑', '🔩' ];
let arrayThreeSlice = arrayThree.slice();  // [ '⚡️', '🔎', '🔑', '🔩' ]
复制代码

开始

这是要包含在新数组中的第一项的索引。例如,如果设置为2slice则将在索引 2 处开始新的数组副本。如果使用负数,则表示距序列末尾的偏移量。例如:

let arrayOne = [ '⚡️', '🔎', '🔑', '🔩' ];
let arrayOneSlice = arrayOne.slice(-2);  // [ '🔑', '🔩' ]
let arrayOneSliceAgain = arrayOne.slice(-1);  // [ '🔩' ]
复制代码

结尾

这是从切片数组中排除的第一个元素- 这有点令人困惑。您可能希望end表示要包含的最后一项 - 但它是要排除的第一项。如果你使用,请记住这一点slice!如果省略此参数,则该slice方法将简单地继续到数组的末尾,如下例所示:

let arrayTwo = [ '⚡️', '🔎', '🔑', '🔩' ];
let arrayTwoSlice = myArray.slice(2);  // [ '🔑', '🔩' ]
复制代码

如果使用了大于数组长度的值,slice则只延续到数组的末尾。如果使用负值,则表示距数组末尾的偏移量。例如,(2, -1)将从数组的开头开始为 2,从数组的结尾开始为 -1:

let arrayOne = [ '⚡️', '🔎', '🔑', '🔩' ];
let arrayOneSlice = arrayOne.slice(2, -1);  // [ '🔑' ]
let arrayOneSliceAgain = arrayOne.slice(1, -1);  // [ '🔎', '🔑' ]
复制代码

使用切片制作数组的副本

Slice不会改变原始数组。相反,它会创建一个新的浅拷贝。因此,您现有的数组仍将继续包含相同的值:

let arrayOne = [ '⚡️', '🔎', '🔑', '🔩' ];
let arrayOneSlice = arrayOne.slice(2, 3);  

console.log(arrayOne); // [ '⚡️', '🔎', '🔑', '🔩' ]
console.log(arrayOneSlice); // [ '🔑' ]
复制代码

由于slice制作了数组的浅拷贝,它有时也用于复制和制作数组数据的副本。例如,一个空slice函数也会在内存中创建一个新数组 - 允许您在内存中拥有相同数组的两个副本且具有相同的引用:

let arrayOne = [ '⚡️', '🔎', '🔑', '🔩' ];
let arrayOneSlice = arrayOne.slice();

arrayOneSlice[2] = '⚡️'
console.log(arrayOne); // [ '⚡️', '🔎', '🔑', '🔩' ]
console.log(arrayOneSlice); // [ '⚡️', '🔎', '⚡️', '🔩' ]
复制代码

这在某些情况下可能很有用。但是,slice只制作数组的浅拷贝。这意味着当您的数组中有对象时,事情会变得有些混乱。考虑以下数组:

let arrayOne = [ { items: [ '⚡️', '🔎', '🔑', '🔩' ]}, '👨‍💻', '😄', '🐔' ]
复制代码

该数组中包含一个对象。让我们尝试制作这个数组的切片副本,然后更新items

let arrayOne = [ { items: [ '⚡️', '🔎', '🔑', '🔩' ]}, '👨‍💻', '😄', '🐔' ]
let arrayOneSlice = arrayOne.slice(0, 2);

arrayOneSlice[0].items = [ '🔎' ];
arrayOneSlice[1] = '🔎';

console.log(arrayOne); // [ { items: [ '🔎' ]}, '👨‍💻', '😄', '🐔' ]
console.log(arrayOneSlice); // [ { items: [ '🔎' ]}, '🔎' ]
复制代码

等等,什么?我们更改了arrayOneSlice'items对象,但它在arrayOne和中都发生了变化arrayOneSlice!与此同时,arrayOneSlice[1]只是变了arrayOneSlice!欢迎来到另一个 Javascript 怪癖。在第一个示例中,使用arrayOneSlice[0].items符号,Javascript 将其解释为更新浅副本中的现有元素,因此它会影响原始元素。然而,有点令人困惑的是,通过使用该arrayOneSlice[1]符号,Javascript 将其解释为将一个新值放入[1]浅拷贝本身的位置。

这意味着,尽管在使用简单数组时看起来像是在制作副本,但在更复杂的对象上使用它时却不成立。知道这一点小事有一天会为你节省很多时间。slice

结论

JavaScript slice方法对于使用原始数组数据的子集创建新的数组浅拷贝非常有用。它还可以以有限的方式用于制作可以独立更新的副本。JavaScript slice仍然与内存中的原始副本具有相同的引用,这在操作它们时很有用。

 给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

相关文章:

  • 【PyTorch深度学习项目实战100例】—— 基于CNN卷积神经网络实现中文手写汉字识别 | 第60例
  • HarmonyOS系统中内核实现UART串口通信方法
  • Selenium4.0+Python三种元素等待方式介绍 及 元素等待封装
  • django梳理
  • 嵌入式软件调试的发展历程
  • PT_连续型随机变量/分布函数/概率密度
  • Python告别pip手动安装模块,实现全自动安装第三方库,彻底解放你的双手
  • 文件目录操作——Linux命令核心
  • Taichi 加速 Python 中图像处理
  • Vue--》MVVM模型在Vue中的使用
  • 迷宫求解(云南大学)
  • 【夜读】坚持这5个习惯,遇见更优秀的自己
  • 算法与数据结构【30天】集训营——平衡二叉树的LL、RR、LR、RL调整的简单快速方法(16)
  • Java本地搭建宝塔部署实战医药WMS进销存源码
  • 基于meanshift算法的目标聚类和目标跟踪matlab仿真
  • hexo+github搭建个人博客
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • django开发-定时任务的使用
  • Invalidate和postInvalidate的区别
  • Javascript Math对象和Date对象常用方法详解
  • React系列之 Redux 架构模式
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 构造函数(constructor)与原型链(prototype)关系
  • 力扣(LeetCode)357
  • 力扣(LeetCode)965
  • 前端临床手札——文件上传
  • 算法之不定期更新(一)(2018-04-12)
  • 通过git安装npm私有模块
  • 阿里云API、SDK和CLI应用实践方案
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #LLM入门|Prompt#3.3_存储_Memory
  • #NOIP 2014# day.2 T2 寻找道路
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (30)数组元素和与数字和的绝对差
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (学习日记)2024.01.19
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ****Linux下Mysql的安装和配置
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net 反编译_.net反编译的相关问题
  • .net项目IIS、VS 附加进程调试
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945