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

JS中对数组的操作哪些会改变原数组哪些不会?今天你一定要记下!

JavaScript 数组方法:变更原数组与不变更原数组的区别

在 JavaScript 中,数组是非常常见且重要的数据结构。作为开发者,我们常常需要使用数组方法来处理数组数据。但是,数组的不同方法会以不同的方式影响原数组,它们可以分为变更原数组的方法和不变更原数组的方法。本文将详细探讨 JavaScript 中常见的数组方法,分析它们是如何工作的,并重点讨论哪些方法会修改原数组,哪些方法不会。

一、变更原数组的方法

这些方法会直接对数组本身进行修改,改变其元素、长度或结构。

1. push()

push() 方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

  • 示例:

    let arr = [1, 2, 3];
    arr.push(4);
    console.log(arr); // [1, 2, 3, 4]
    
  • 原理

    • push() 会直接修改原数组。在其内部,它会将新的元素添加到数组的末尾,并更新数组的长度。其基本实现如下:
    Array.prototype.push = function (...args) {let len = this.length;for (let i = 0; i < args.length; i++) {this[len + i] = args[i];}return this.length;
    };
    

2. pop()

pop() 方法删除数组的最后一个元素,并返回被删除的元素。

  • 示例:

    let arr = [1, 2, 3];
    let removedElement = arr.pop();
    console.log(arr); // [1, 2]
    console.log(removedElement); // 3
    
  • 原理

    • pop() 会修改数组并返回最后一个元素。其实现方式:
    Array.prototype.pop = function () {let len = this.length;if (len === 0) return undefined;let removedElement = this[len - 1];this.length = len - 1;return removedElement;
    };
    

3. shift()

shift() 方法从数组的开头删除一个元素,并返回该元素。

  • 示例:

    let arr = [1, 2, 3];
    let removedElement = arr.shift();
    console.log(arr); // [2, 3]
    console.log(removedElement); // 1
    
  • 原理

    • shift() 删除数组的第一个元素,并且其他元素会向左移动。其实现方式:
    Array.prototype.shift = function () {let len = this.length;if (len === 0) return undefined;let removedElement = this[0];for (let i = 0; i < len - 1; i++) {this[i] = this[i + 1];}this.length = len - 1;return removedElement;
    };
    

4. unshift()

unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度。

  • 示例:

    let arr = [1, 2, 3];
    arr.unshift(0);
    console.log(arr); // [0, 1, 2, 3]
    
  • 原理

    • unshift() 会将元素插入到数组的开头,并移动现有元素的位置。其实现代码:
    Array.prototype.unshift = function (...args) {let len = this.length;for (let i = len - 1; i >= 0; i--) {this[i + args.length] = this[i];}for (let i = 0; i < args.length; i++) {this[i] = args[i];}return this.length;
    };
    

5. reverse()

reverse() 方法将数组中的元素顺序颠倒,并直接修改原数组。

  • 示例:

    let arr = [1, 2, 3];
    arr.reverse();
    console.log(arr); // [3, 2, 1]
    
  • 原理

    • reverse() 直接改变原数组,颠倒数组元素顺序。其内部实现代码:
    Array.prototype.reverse = function () {let len = this.length;for (let i = 0; i < Math.floor(len / 2); i++) {let temp = this[i];this[i] = this[len - 1 - i];this[len - 1 - i] = temp;}return this;
    };
    

6. sort()

sort() 方法对数组中的元素进行排序,并返回排序后的数组。此方法会修改原数组。

  • 示例:

    let arr = [23, 12, 8, 13, 21, 9];
    arr.sort();
    console.log(arr); // [12, 13, 21, 23, 8, 9] (默认按字符串排序)
    
  • 原理

    • sort() 默认按照字符串排序,如果需要按数值排序,可以提供一个比较函数。其基本实现代码如下:
    Array.prototype.sort = function (compareFunction) {let len = this.length;for (let i = 0; i < len - 1; i++) {for (let j = 0; j < len - 1 - i; j++) {if (compareFunction(this[j], this[j + 1]) > 0) {let temp = this[j];this[j] = this[j + 1];this[j + 1] = temp;}}}return this;
    };
    

7. splice()

splice() 方法可以从数组中添加或删除元素,并直接修改原数组。

  • 示例:

    let arr = [1, 2, 3, 4, 5];
    arr.splice(2, 1); // 删除索引2的元素
    console.log(arr); // [1, 2, 4, 5]
    
  • 原理

    • splice() 通过删除和插入来修改原数组。其实现代码:
    Array.prototype.splice = function (start, deleteCount, ...items) {let removedItems = [];for (let i = start; i < start + deleteCount; i++) {removedItems.push(this[i]);}let len = this.length;for (let i = len - 1; i >= start + deleteCount; i--) {this[i + items.length] = this[i];}for (let i = 0; i < items.length; i++) {this[start + i] = items[i];}this.length -= deleteCount;return removedItems;
    };
    

二、不改变原数组的方法

这些方法会返回一个新数组,而不会修改原数组的内容。了解这些方法的实现原理,有助于我们更好地理解它们是如何工作的。

1. concat()

concat() 方法用于合并多个数组或值,并返回一个新的数组。

  • 示例:

    let arr1 = [1, 2, 3];
    let arr2 = [4, 5, 6];
    let newArr = arr1.concat(arr2);
    console.log(newArr); // [1, 2, 3, 4, 5, 6]
    console.log(arr1); // [1, 2, 3]
    console.log(arr2); // [4, 5, 6]
    
  • 原理

    • concat() 会返回一个新的数组,原数组不会改变。实现代码:
    Array.prototype.concat = function (...args) {let result = [...this];for (let i = 0; i < args.length; i++) {let currentArray = args[i];result.push(...currentArray);}return result;
    };
    

2. slice()

slice() 方法返回数组的一个浅拷贝,并不改变原数组。

  • 示例:

    let arr = [1, 2, 3, 4, 5];
    let newArr = arr.slice(1, 4);
    console.log(newArr); // [2, 3, 4]
    console.log(arr); // [1, 2, 3, 4, 5]
    
  • 原理

    • slice() 会返回数组的一部分副本,不会改变原数组。其实现方式如下:
    Array.prototype.slice = function (start, end) {let result = [];for (let i = start || 0; i < (end || this.length); i++) {result.push(this[i]);}return result;
    };
    

3. map()

map() 方法通过提供的函数对数组中的每个元素进行处理,返回一个新数组,不会修改原数组。

  • 示例:

    let arr = [1, 2, 3];
    let newArr = arr.map(item => item * 2);
    console.log(newArr); // [2, 4, 6]
    console.log(arr); // [1, 2, 3]
    
  • 原理

    • map() 方法会根据提供的回调函数生成一个新数组,原数组不受影响。其实现代码:
    Array.prototype.map = function (callback) {let result = [];for (let i = 0; i < this.length; i++) {result.push(callback(this[i], i, this));}return result;
    };
    

4. filter()

filter() 方法基于条件返回数组中符合条件的元素组成的新数组,原数组不改变。

  • 示例:

    let arr = [1, 2, 3, 4, 5];
    let newArr = arr.filter(item => item > 3);
    console.log(newArr); // [4, 5]
    console.log(arr); // [1, 2, 3, 4, 5]
    
  • 原理

    • filter() 会根据回调函数判断每个元素是否满足条件,返回一个新数组,原数组不变。其实现代码:
    Array.prototype.filter = function (callback) {let result = [];for (let i = 0; i < this.length; i++) {if (callback(this[i], i, this)) {result.push(this[i]);}}return result;
    };
    

5. join()

join() 方法将数组的所有元素连接成一个字符串,并返回该字符串。

  • 示例:

    let arr = [1, 2, 3];
    let result = arr.join("-");
    console.log(result); // "1-2-3"
    console.log(arr); // [1, 2, 3]
    
  • 原理

    • join() 返回一个由数组元素连接而成的字符串,原数组没有改变。其实现方式如下:
    Array.prototype.join = function (separator = ',') {let result = '';for (let i = 0; i < this.length; i++) {if (i > 0) result += separator;result += this[i];}return result;
    };
    

6. some()

some() 方法检查数组中是否有至少一个元素符合条件,返回布尔值,原数组不变。

  • 示例:

    let arr = [1, 2, 3, 4];
    let result = arr.some(item => item > 3);
    console.log(result); // true
    console.log(arr); // [1, 2, 3, 4]
    
  • 原理

    • some() 检查数组中是否有符合条件的元素,如果有则返回 true,否则返回 false。原数组不受影响,代码实现如下:
    Array.prototype.some = function (callback) {for (let i = 0; i < this.length; i++) {if (callback(this[i], i, this)) {return true;}}return false;
    };
    

7. every()

every() 方法检查数组中的每个元素是否都满足条件,返回布尔值,原数组不变。

  • 示例:

    let arr = [1, 2, 3, 4];
    let result = arr.every(item => item > 0);
    console.log(result); // true
    console.log(arr); // [1, 2, 3, 4]
    
  • 原理

    • every() 会判断数组中的所有元素是否都满足给定条件,如果都满足返回 true,否则返回 false。其实现代码如下:
    Array.prototype.every = function (callback) {for (let i = 0; i < this.length; i++) {if (!callback(this[i], i, this)) {return false;}}return true;
    };
    

至此,我们已经完成了 数组操作以及操作是否改变数组本身的源码分析 的完整解析。通过源码实现的方式,我们了解了不同数组方法是如何工作的,哪些方法会修改原数组,哪些方法不会。掌握这些方法的内部原理可以帮助我们在开发中更好地选择使用合适的数组操作方法。

相关文章:

JS中对数组的操作哪些会改变原数组哪些不会?今天你一定要记下!

JavaScript 数组方法&#xff1a;变更原数组与不变更原数组的区别 在 JavaScript 中&#xff0c;数组是非常常见且重要的数据结构。作为开发者&#xff0c;我们常常需要使用数组方法来处理数组数据。但是&#xff0c;数组的不同方法会以不同的方式影响原数组&#xff0c;它们可…...

公式与函数的应用

一 相邻表格相乘 1 也可以复制 打印标题...

ShenNiusModularity项目源码学习(7:数据库结构)

ShenNiusModularity项目默认使用mysql数据库&#xff0c;数据库连接字符串放到了ShenNius.Admin. Mvc、ShenNius.Admin.Hosting的appsettings.json文件内。   ShenNiusModularity项目为自媒体内容管理系统&#xff0c;支持常规管理、CMS管理、商城管理等功能&#xff0c;其数…...

【STL笔记】字符串

字符串 下标从0开始&#xff0c;常规用法不再赘述&#xff0c;持续更新中… 1. substr(pos&#xff0c;len): 返回从位置 pos 开始&#xff0c;长度为 len 的子串。(len默认为npos) std::string str "Hello, World!"; std::string sub1 str.substr(7, 5); // 提…...

java知识点 | java中不同数据结构的长度计算

在Java中&#xff0c;size 和 length是两个不同的属性&#xff0c;分别用于不同的数据结构。以下是它们的详细区别和适用场景&#xff1a; 1.length 适用对象&#xff1a; 数组&#xff08;Array&#xff09;&#xff1a;数组是一个固定长度的线性数据结构&#xff0c;其长度是…...

WordPress event-monster插件存在信息泄露漏洞(CVE-2024-11396)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion(原理介绍)

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09; 目录 手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09;DDPM 原理图Stable Diffusion 原理Stable Diffusion的原理解释Stable Diffusion 和 Diffus…...

AI软件栈:LLVM分析(一)

文章目录 AI 软件栈后端编译LLVM IRLLVM的相关子项目AI 软件栈后端编译 AI软件栈的后端工作通常与硬件架构直接相关,为了实现一个既能适配现代编程语言、硬件架构发展的目标,所以提出了LLVM具备多阶段优化能力提供基础后端描述,便于进行编译器开发兼容标准编译器的行为LLVM …...

编程语言中的常见Bug及解决方案

在编程过程中&#xff0c;不同语言有其独特的特性和挑战&#xff0c;这也导致了各种常见Bug的出现。本文将总结几种主流编程语言中的常见Bug&#xff0c;包括JavaScript、Python、C/C、Java和Go&#xff0c;并提供相应的解决方案和案例。 一、JavaScript中小数相加精度不准确的…...

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)

Understanding Diffusion Models: A Unified Perspective&#xff08;三&#xff09; 文章概括 文章概括 引用&#xff1a; article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…...

修改maven的编码格式为utf-8

1.maven默认编码为GBK 注:配好MAVEN_HOME的环境变量后,在运行cmd. 打开cmd 运行mvn -v命令即可. 2.修改UTF-8为默认编码. 设置环境变量 变量名 MAVEN_OPTS 变量值 -Xms256m -Xmx512m -Dfile.encodingUTF-8 3.保存,退出cmd.重新打开cmd 运行mvn -v命令即可. 源码获取&…...

从AD的原理图自动提取引脚网络的小工具

这里跟大家分享一个我自己写的小软件&#xff0c;实现从AD的原理图里自动找出网络名称和引脚的对应。存成文本方便后续做表格或是使用简单行列编辑生成引脚约束文件&#xff08;如.XDC .UCF .TCL等&#xff09;。 我们在FPGA设计中需要引脚锁定文件&#xff0c;就是指示TOP层…...

Coze,Dify,FastGPT,对比

在当今 AI 技术迅速发展的背景下&#xff0c;AI Agent 智能体成为了关键领域&#xff0c;Coze、Dify 和 FastGPT 作为其中的佼佼者&#xff0c;各有千秋。 平台介绍 - FastGPT&#xff1a;由环界云计算公司发起&#xff0c;是基于大语言模型&#xff08;LLM&#xff09;的开源…...

【数据结构】_链表经典算法OJ(力扣版)

目录 1. 移除链表元素 1.1 题目描述及链接 1.2 解题思路 1.3 程序 2. 反转链表 2.1 题目描述及链接 2.2 解题思路 2.3 程序 3. 链表的中间结点 3.1 题目描述及链接 3.2 解题思路 3.3 程序 1. 移除链表元素 1.1 题目描述及链接 原题链接&#xff1a;203. 移除链表…...

【数据结构】(1)集合类的认识

一、什么是数据结构 1、数据结构的定义 数据结构就是存储、组织数据的方式&#xff0c;即相互之间存在一种或多种关系的数据元素的集合。 2、学习数据结构的目的 在实际开发中&#xff0c;我们需要使用大量的数据。为了高效地管理这些数据&#xff0c;实现增删改查等操作&…...

Vue 3 中的 TypeScript:接口、自定义类型与泛型

在 Vue 3 中&#xff0c;TypeScript 提供了强大的类型系统&#xff0c;帮助我们更好地管理代码的类型安全。通过使用 接口&#xff08;Interface&#xff09;、自定义类型&#xff08;Type Aliases&#xff09; 和 泛型&#xff08;Generics&#xff09;&#xff0c;我们可以编…...

计算机组成原理(计算机系统3)--实验七:新增指令实验

一、实验目标 了解RISC-V mini处理器架构&#xff0c;在其基础之上新增一个指令&#xff0c;完成设计并观察指令执⾏。 二、实验内容 1) 修改数据通路&#xff0c;新增指令comb rs1,rs2,rd采用R型指令格式&#xff0c;实现将rs1高16位和rs2低16位拼接成32位整数&#xff0c;…...

LeetCode 0040.组合总和 II:回溯 + 剪枝

【LetMeFly】40.组合总和 II&#xff1a;回溯 剪枝 力扣题目链接&#xff1a;https://leetcode.cn/problems/combination-sum-ii/ 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates…...

解决使用Selenium时ChromeDriver版本不匹配问题

在学习Python爬虫过程中如果使用Selenium的时候遇到报错如下session not created: This version of ChromeDriver only supports Chrome version 99… 这说明当前你的chrome驱动版本和浏览器版本不匹配。 例如 SessionNotCreatedException: Message: session not created: This…...

CAN波特率匹配

STM32 LinuxIMX6ull&#xff08;Linux&#xff09;基于can-utils测试...

JVM垃圾回收器的原理和调优详解!

全文目录&#xff1a; 开篇语前言摘要概述垃圾回收器分类及原理1. Serial 垃圾回收器2. Parallel 垃圾回收器3. CMS 垃圾回收器4. G1 垃圾回收器 源码解析示例代码 使用案例分享案例 1&#xff1a;Web 服务的 GC 调优案例 2&#xff1a;大数据任务的 GC 优化 应用场景案例垃圾回…...

与机器学习相关的概率论重要概念的介绍和说明

概率论一些重要概念的介绍和说明 1、 试验 &#xff08;1&#xff09;试验是指在特定条件下&#xff0c;对某种方法、技术、设备或产品&#xff08;即&#xff0c;事物&#xff09;进行测试或验证的过程。 &#xff08;2&#xff09;易混淆的概念是&#xff0c;实验。实验&…...

JavaScript中的相等运算符:`==`与`===`

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…...

66-《虞美人》

虞美人 虞美人&#xff08;学名&#xff1a;Papaver rhoeas L.&#xff09;&#xff1a;一年生草本植物&#xff0c;全体被伸展的刚毛&#xff0c;稀无毛。茎直立&#xff0c;高25-90厘米&#xff0c;具分枝。叶片轮廓披针形或狭卵形&#xff0c;羽状分裂&#xff0c;裂片披针形…...

obsidian插件——Metadata Hider

原本是要找导出图片时显示属性的插件&#xff0c;奈何还没找到&#xff0c;反而找到了可以隐藏属性的插件。唉&#xff0c;人生不如意&#xff0c;十之八九。 说一下功能&#xff1a; 这个插件可以把obsidian的文档属性放在右侧显示&#xff0c;或者决定只显示具体几项属性&a…...

MySQL中InnoDB逻辑存储结构

在MySQL中&#xff0c;InnoDB是最常用的存储引擎之一&#xff0c;它具有高度的事务支持、行级锁、ACID特性以及自动崩溃恢复等特性。InnoDB的逻辑存储结构可以分为多个层次&#xff0c;下面是详细的解析。 1. 表空间 (Tablespace) InnoDB的物理存储结构以表空间为基础。表空间…...

高阶C语言|深入理解字符串函数和内存函数

文章目录 前言1.求字符串长度1.1 字符串长度函数&#xff1a;strlen模拟实现 长度不受限制的字符串函数1.2 字符串拷贝函数&#xff1a;strcpy模拟实现 1.3 字符串连接函数&#xff1a;strcat模拟实现 1.4 字符串比较函数&#xff1a;strcmp模拟实现 长度受限制的字符串函数2.1…...

Pandas DataFrame 拼接、合并和关联

拼接:使用 pd.concat(),可以沿着行或列方向拼接 DataFrame。 合并:使用 pd.merge(),可以根据一个或多个键进行不同类型的合并(左连接、右连接、全连接、内连接)。 关联:使用 join() 方法,通常在设置了索引的 DataFrame 上进行关联操作。 concat拼接 按列拼接 df1 = …...

特种作业操作之低压电工考试真题

1.下面&#xff08; &#xff09;属于顺磁性材料。 A. 铜 B. 水 C. 空气 答案&#xff1a;C 2.事故照明一般采用&#xff08; &#xff09;。 A. 日光灯 B. 白炽灯 C. 压汞灯 答案&#xff1a;B 3.人体同时接触带电设备或线路中的两相导体时&#xff0c;电流从一相通过人体流…...