JavaScript 手写代码 第五期(重写数组方法一)-可以改变原数组的方法

这篇具有很好参考价值的文章主要介绍了JavaScript 手写代码 第五期(重写数组方法一)-可以改变原数组的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.为什么要手写代码?

我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。

2.手写实现数组方法

2.1 push

push 从后面添加元素 返回push完以后数组的长度

2.1.1 基本使用

            let arr = [1, 2];
            console.log(arr.push(1, 2, 3)); // 5
            console.log(arr); // [1,2,1,2,3]

2.1.2 手写实现

数组方法在数组的原型对象上

            Array.prototype.myPush = function () {
                for (let i = 0; i < arguments.length; i++) {
                    // this就是调用该方法的数组arr,
                    // 数组当前最后一项的索引为 this.length - 1,再往后面加索引就为this.length
                    this(this.length) = arguments[i]
                }
                return this.length
            };

调用测试
正常打印

            console.log(arr.myPush(1, 2, 3)); // 5
            console.log(arr); //  [1,2,1,2,3]

2.2 pop

删除数组的最后一位元素,返回被删除的那个元素。此方法更改数组的长度。

2.2.1 基本使用

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

2.2.2 手写实现

            Array.prototype.myPop = function () {
                let result = this[this.length - 1];
                this.length = this.length - 1;
                return result;
            };
            console.log(arr.myPop()); // 3
            console.log(arr); // [1,2]

2.3 shift

从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。

2.3.1 基本使用

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

2.3.2 手写实现

            Array.prototype.myShift = function () {
                let result = this[0];
                for (let i = 0; i < this.length; i++) {
                    // 后面的元素依次赋给前一项
                    // 因为数组的第一个元素已经删除
                    this[i] = this[i + 1];
                }
                // 改变数组长度
                this.length--;
                // 返回被删除的元素
                return result;
            };
            console.log(arr.myShift()); // 1
            console.log(arr); // [2,3]

2.4 unshift

将一个或多个元素添加到数组的开头,并返回该数组的新长度。

2.4.1 基本使用

			let arr = [1, 2, 3];
            console.log(arr.unshift(4, 5)); // 5
            console.log(arr); // [4,4,1,2,3]

2.4.2 手写实现

            Array.prototype.myUnshift = function () {
                // 最终数组的长度sum = 原数组长度 + unshift传入的参数的个数
                let sum = this.length + arguments.length;
                for (let i = sum; i > 0; i--) {
                    // 如果还没往后遍历到传入的参数的时候
                    // 原数组的值依次往向后赋值
                    if (i > arguments.length) {
                        this[i - 1] = this[i - 1 - arguments.length];
                    } else {
                        this[i - 1] = arguments[i - 1];
                    }
                }
                return sum;
            };
            console.log(arr.myUnshift(4, 5)); // 5
            console.log(arr); // [4,5,1,2,3]

2.5 splice

2.5.1 基本使用

splice() 方法用于添加或删除数组中的元素。会改变原始数组。
语法:

array.splice(index,howmany,item1,.....,itemX)

第一个参数index:必需。规定从何处添加/删除元素。
第二个参数howmany:可选。规定应该删除多少元素。必须是数字,但可以是 “0”。
后续参数:可选。要添加到数组的新元素

使用示例
不传入参数,不进行操作,返回[],原数组不发生改变

            let arr = [1, 2, 3, 4];
            console.log(arr.splice()); // []
            console.log(arr); //  [1, 2, 3, 4]

传入一个参数index 删除索引1后面的元素,原数组发生改变

            let arr = [1, 2, 3, 4];
            console.log(arr.splice(1)); // [2,3,4]
            console.log(arr); // [1]

传入两个参数index howmany,从索引0开始删除 2 个元素

            let arr1 = [1, 2, 3, 4];
            console.log(arr1.splice(0, 2)); // [1,2]
            console.log(arr1); // [3,4]

传入三个参数 index howmany 其他参数,从索引0开始删除2个元素,并用后面的参数替换。

            let arr2 = [1, 2, 3, 4];
            console.log(arr2.splice(0, 2, 5, 6)); // [1,2]
            console.log(arr2); // [5,6,3,4]

2.5.2 手写实现

           Array.prototype.mySplice = function (index, num, ...args) {
                let newArr = [];
                let returnArr = [];
                // 如果没有传入参数,直接返回空数组
                if (index == undefined || num == 0) return [];
                if (index < 0) index = index + this.length;
                // 如果没有传入截取数组的长度,自己手动计算
                if (!num) {
                	// 这里是将num转换为索引值,方便后续的遍历
                    num = this.length - index + 1;
                } else if (num > 0) {
                    num = num + index;
                }
                // 遍历index之前的数组,赋给newArr
                for (let i = 0; i < index; i++) {
                    newArr.push(this[i]);
                }
                // 遍历我们要删除的数组范围
                for (; index < num; index++) {
                    returnArr.push(this[index]);
                }
                // 如果传入其他参数,就传入的参数添加进去
                if (args.length > 0) {
                    newArr.push(...args);
                }
                // 遍历num后面的数组,赋给newArr
                for (let i = num; i < this.length; i++) {
                    newArr.push(this[i]);
                }
                // newArr 是我们想要的原数组的值
                for (let i = 0; i < newArr.length; i++) {
                    this[i] = newArr[i];
                }
                // 截取长度
                this.length = newArr.length;
                return returnArr;
            };
            console.log(arr.mySplice());
            console.log(arr.mySplice(1)); // [2,3,4]
            console.log(arr); // [1]
            let arr1 = [1, 2, 3, 4];
            console.log(arr1.mySplice(0, 0)); // [1,2]
            console.log(arr1); // [3,4]

            let arr2 = [1, 2, 3, 4];
            console.log(arr2.mySplice(0, 2, 5, 6)); // [1,2]
            console.log(arr2); // [5,6,3,4]

2.6 fill

2.6.1 基本使用

fill() 方法用于将一个固定值替换数组的元素。
语法:

array.fill(value, start, end)

第一个参数value:必需。填充的值。
第二个参数start:可选。开始填充位置。
第三个参数end:可选。停止填充位置 (默认为 array.length)

使用示例

    		let arr = [1, 2, 3, 4];
            console.log(arr.fill(4));
            console.log(arr); // [4, 4, 4, 4]
            arr.fill(5, 0, 2);
            console.log(arr); // [5, 5, 4, 4]
            console.dir(Array.prototype);

2.6.2 手写实现

            Array.prototype.myFill = function (value, start = 0, end = this.length) {
                if (start && start < 0) start = this.length + start;
                if (end && end < 0) end = this.length + end;
                for (; start < end; start++) {
                    this[start] = value;
                }
                return this;
            };
            console.log(arr.fill(4));
            console.log(arr); // [4, 4, 4, 4]
            arr.fill(5, 0, 2);
            console.log(arr); // [5, 5, 4, 4]

2.7 reverse

2.7.1 基本使用

reverse() 方法用于反转数组中元素的顺序。

            let arr = [1, 2, 3, 4, 5];
            arr.reverse();
            console.log(arr); // [5, 4, 3, 2, 1]

2.7.2 手写实现

            Array.prototype.myReverse = function () {
                let len = this.length - 1;
                for (let i = 0; i < Math.floor(this.length / 2); i++) {
                    // 交换这两个元素位置
                    let temp = arr[i];
                    arr[i] = arr[len];
                    arr[len--] = temp;
                }
                return this;
            };
            arr.myReverse();
            console.log(arr); // [5, 4, 3, 2, 1]

2.8 sort

2.8.1 基本使用

sort() 方法用于对数组的元素进行排序。
排序顺序可以是字母数字,并按升序或降序
默认排序顺序为按字母升序
这种方法会改变原始数组

这里只是实现了对数字的排序,大家有具体的思路可以评论区讨论
使用实例

            let arr = [1, 3, 2, 4];
            arr.sort((a, b) => b - a);
            console.log(arr); // [4,3,2,1]

2.8.2 手写实现

利用冒泡排序进行重构。

            Array.prototype.mySort = function (callback) {
                // 使用了冒泡排序
                for (let i = 0; i < this.length - 1; i++) {
                    for (let j = 0; j < this.length - 1 - i; j++) {
                        if (callback(this[j], this[j + 1]) > 0) {
                            let temp = this[j];
                            this[j] = this[j + 1];
                            this[j + 1] = temp;
                        }
                    }
                    return this;
                }
            };
            arr.mySort((a, b) => a - b);
            console.log(arr);

2.9 copyWithin

2.9.1 基本使用

copyWithin() 方法用于从数组的指定位置拷贝元素到数组的另一个指定位置中。
语法:

array.copyWithin(target, start, end)

第一个参数target:必需。复制到指定目标索引位置。
第二个参数start:可选。元素复制的起始位置。默认起始位置为0
第三个参数end:可选。停止复制的索引位置 (默认为 array.length)。如果为负值,表示倒数。

使用示例:
复制数组的前面两个元素到第三和第四个位置上:文章来源地址https://www.toymoban.com/news/detail-503028.html

            let arr = [1, 2, 3, 4, 5];
            arr.copyWithin(2, 0, 2);
            console.log(arr); // [1, 2, 1, 2, 5]

2.9.2 手写实现

            Array.prototype.myCopyWithin = function (target, start = 0, end = this.length) {
                let newArr = [];
                if (target < 0) target = this.length + target;
                if (start < 0) start = this.length + start;
                if (end < 0) end = this.length + end;
                for (let i = start; i < end; i++) {
                    newArr.push(this[i]);
                }
                let arrLength = newArr.length;
                let k = 0;
                // 同时判断赋值的区间和待拷贝数组的长度的大小
                let len = arrLength < this.length - target ? target + arrLength : this.length;
                for (; target < len; target++) {
                    console.log(newArr[k]);
                    this[target] = newArr[k++];
                }
                return this;
            };
欢迎大家在讨论学习,感谢大家支持

到了这里,关于JavaScript 手写代码 第五期(重写数组方法一)-可以改变原数组的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue 重写数组的七个方法

    一、为什么要重写数组方法? Vue 为了实现响应式数据绑定,需要能够捕获到数据的变化,以便在数据发生改变时自动更新视图。JavaScript 中的数组是引用类型,所以常规的引用跟踪机制不能捕获数组内部的变化。因为Vue的响应式是通过 Object.defineProperty()实现的,这个api没办法

    2024年02月12日
    浏览(32)
  • 零基础html学习-第五期

    好久不见,兄弟们。我又回来继续更blog了! 博主主页:GUIDM 收入专栏:零基础HTML学习   tr:行 td:列 th:表头单元格,内部文本加粗并居中显示。 表格table属性 border:定义线条的粗细 width:定义表格的总宽度 height:定义表格的总高度 cellspacing:定义单元格之间的距离 cellpad

    2023年04月11日
    浏览(34)
  • JavaScript 手写代码 第一期

    我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。 2.1.1 基本使用 定义 : 静态方法以一个现

    2024年02月10日
    浏览(35)
  • JavaScript 手写代码 第三期

    我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。 2.1.1 基本使用 函数柯里化指的是一种将

    2024年02月10日
    浏览(40)
  • JavaScript 手写代码 第四期

    我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。 简单来说,就是将多维数组转换为一维

    2024年02月10日
    浏览(48)
  • 搜索与图论第五期 拓扑序列

    拓扑排序 拓扑排序是一种对有向无环图(Directed Acyclic Graph,简称DAG)进行的排序过程,目的是将图中所有的顶点按照发生事件的顺序排成一条线性序列。这种排序确保了图中任意两个相邻顶点之间至少有一条边相连,且在这条边的方向上,这条边的终点在前于起点。拓扑排

    2024年01月23日
    浏览(41)
  • 运维开发面试题第五期(华电天益)

    1、一个目录(没有子目录)有很多文件,想最快速度查看到最近更新的文件你有几种方式实现?请写出一种或几种 2、使用 tar 命令打包/etc 目录下的所有文件(包括子文件夹) 3、服务器新增加一个U盘,系统读取到的盘符为/dev/sdb1,如何将该 U盘挂载到/mnt目录下? 4、Linux下查询进程

    2024年02月13日
    浏览(33)
  • python-opencv第五期:rectangle函数详解

    概要: 众 嗦粥汁 所周知,在如今计算机视觉( Computer Version  short for CV)是人工智能与机器人技术发展的一个重大研究方向,而 opencv 作为一个专门为计算机视觉编程提供技术与函数支持的第三方库,自然是一个需要重点研究的内容。             本期所要介绍的函数是o

    2024年02月05日
    浏览(29)
  • 【FPGA-DSP】第五期:FFT调用流程

    目录 1. matlab输入信号编写 2. Simulink开发 2.1 模块搭建 2.2 Simulink运行 2.3 matlab信号处理  拓:输入信号位数改变 本章节主要说明如何在system generator中使用fft模块,话不多说,看操作: 参考教程第5期 - FFT调用流程 - 基于FPGA的数字信号处理系统开发笔记_哔哩哔哩_bilibili 参考我之

    2023年04月11日
    浏览(29)
  • 第五期:字符串的一些有意思的操作

    PS:每道题解题方法不唯一,欢迎讨论!每道题后都有解析帮助你分析做题,答案在最下面,关注博主每天持续更新。 1. 替换空格 题目描述 请实现一个函数,把字符串 s 中的每个空格替换成\\\"%20\\\"。 示例1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 示例2: 输入:s =

    2024年02月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包