国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JavaScript 手寫代碼 第五期(重寫數(shù)組方法一)-可以改變原數(shù)組的方法

這篇具有很好參考價值的文章主要介紹了JavaScript 手寫代碼 第五期(重寫數(shù)組方法一)-可以改變原數(shù)組的方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.為什么要手寫代碼?

我們在日常開發(fā)過程中,往往都是取出來直接用,從來不思考代碼的底層實現(xiàn)邏輯,但當(dāng)我開始研究一些底層的東西的時候,才開始理解了JavaScript每個方法和函數(shù)的底層實現(xiàn)思路,我認(rèn)為這可以很好的提高我們的代碼水平和邏輯思維。

2.手寫實現(xiàn)數(shù)組方法

2.1 push

push 從后面添加元素 返回push完以后數(shù)組的長度

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 手寫實現(xiàn)

數(shù)組方法在數(shù)組的原型對象上

            Array.prototype.myPush = function () {
                for (let i = 0; i < arguments.length; i++) {
                    // this就是調(diào)用該方法的數(shù)組arr,
                    // 數(shù)組當(dāng)前最后一項的索引為 this.length - 1,再往后面加索引就為this.length
                    this(this.length) = arguments[i]
                }
                return this.length
            };

調(diào)用測試
正常打印

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

2.2 pop

刪除數(shù)組的最后一位元素,返回被刪除的那個元素。此方法更改數(shù)組的長度。

2.2.1 基本使用

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

2.2.2 手寫實現(xiàn)

            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

從數(shù)組中刪除第一個元素,并返回該元素的值。此方法更改數(shù)組的長度。

2.3.1 基本使用

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

2.3.2 手寫實現(xiàn)

            Array.prototype.myShift = function () {
                let result = this[0];
                for (let i = 0; i < this.length; i++) {
                    // 后面的元素依次賦給前一項
                    // 因為數(shù)組的第一個元素已經(jīng)刪除
                    this[i] = this[i + 1];
                }
                // 改變數(shù)組長度
                this.length--;
                // 返回被刪除的元素
                return result;
            };
            console.log(arr.myShift()); // 1
            console.log(arr); // [2,3]

2.4 unshift

將一個或多個元素添加到數(shù)組的開頭,并返回該數(shù)組的新長度。

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 手寫實現(xiàn)

            Array.prototype.myUnshift = function () {
                // 最終數(shù)組的長度sum = 原數(shù)組長度 + unshift傳入的參數(shù)的個數(shù)
                let sum = this.length + arguments.length;
                for (let i = sum; i > 0; i--) {
                    // 如果還沒往后遍歷到傳入的參數(shù)的時候
                    // 原數(shù)組的值依次往向后賦值
                    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() 方法用于添加或刪除數(shù)組中的元素。會改變原始數(shù)組。
語法:

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

第一個參數(shù)index:必需。規(guī)定從何處添加/刪除元素。
第二個參數(shù)howmany:可選。規(guī)定應(yīng)該刪除多少元素。必須是數(shù)字,但可以是 “0”。
后續(xù)參數(shù):可選。要添加到數(shù)組的新元素

使用示例
不傳入?yún)?shù),不進行操作,返回[],原數(shù)組不發(fā)生改變

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

傳入一個參數(shù)index 刪除索引1后面的元素,原數(shù)組發(fā)生改變

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

傳入兩個參數(shù)index howmany,從索引0開始刪除 2 個元素

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

傳入三個參數(shù) index howmany 其他參數(shù),從索引0開始刪除2個元素,并用后面的參數(shù)替換。

            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 手寫實現(xiàn)

           Array.prototype.mySplice = function (index, num, ...args) {
                let newArr = [];
                let returnArr = [];
                // 如果沒有傳入?yún)?shù),直接返回空數(shù)組
                if (index == undefined || num == 0) return [];
                if (index < 0) index = index + this.length;
                // 如果沒有傳入截取數(shù)組的長度,自己手動計算
                if (!num) {
                	// 這里是將num轉(zhuǎn)換為索引值,方便后續(xù)的遍歷
                    num = this.length - index + 1;
                } else if (num > 0) {
                    num = num + index;
                }
                // 遍歷index之前的數(shù)組,賦給newArr
                for (let i = 0; i < index; i++) {
                    newArr.push(this[i]);
                }
                // 遍歷我們要刪除的數(shù)組范圍
                for (; index < num; index++) {
                    returnArr.push(this[index]);
                }
                // 如果傳入其他參數(shù),就傳入的參數(shù)添加進去
                if (args.length > 0) {
                    newArr.push(...args);
                }
                // 遍歷num后面的數(shù)組,賦給newArr
                for (let i = num; i < this.length; i++) {
                    newArr.push(this[i]);
                }
                // newArr 是我們想要的原數(shù)組的值
                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() 方法用于將一個固定值替換數(shù)組的元素。
語法:

array.fill(value, start, end)

第一個參數(shù)value:必需。填充的值。
第二個參數(shù)start:可選。開始填充位置。
第三個參數(shù)end:可選。停止填充位置 (默認(rèn)為 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 手寫實現(xiàn)

            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() 方法用于反轉(zhuǎn)數(shù)組中元素的順序。

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

2.7.2 手寫實現(xiàn)

            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() 方法用于對數(shù)組的元素進行排序。
排序順序可以是字母數(shù)字,并按升序或降序。
默認(rèn)排序順序為按字母升序。
這種方法會改變原始數(shù)組!

這里只是實現(xiàn)了對數(shù)字的排序,大家有具體的思路可以評論區(qū)討論
使用實例

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

2.8.2 手寫實現(xiàn)

利用冒泡排序進行重構(gòu)。

            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() 方法用于從數(shù)組的指定位置拷貝元素到數(shù)組的另一個指定位置中。
語法:

array.copyWithin(target, start, end)

第一個參數(shù)target:必需。復(fù)制到指定目標(biāo)索引位置。
第二個參數(shù)start:可選。元素復(fù)制的起始位置。默認(rèn)起始位置為0
第三個參數(shù)end:可選。停止復(fù)制的索引位置 (默認(rèn)為 array.length)。如果為負(fù)值,表示倒數(shù)。

使用示例:
復(fù)制數(shù)組的前面兩個元素到第三和第四個位置上:文章來源地址http://www.zghlxwxcb.cn/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 手寫實現(xiàn)

            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;
                // 同時判斷賦值的區(qū)間和待拷貝數(shù)組的長度的大小
                let len = arrLength < this.length - target ? target + arrLength : this.length;
                for (; target < len; target++) {
                    console.log(newArr[k]);
                    this[target] = newArr[k++];
                }
                return this;
            };
歡迎大家在討論學(xué)習(xí),感謝大家支持

到了這里,關(guān)于JavaScript 手寫代碼 第五期(重寫數(shù)組方法一)-可以改變原數(shù)組的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • vue 重寫數(shù)組的七個方法

    一、為什么要重寫數(shù)組方法? Vue 為了實現(xiàn)響應(yīng)式數(shù)據(jù)綁定,需要能夠捕獲到數(shù)據(jù)的變化,以便在數(shù)據(jù)發(fā)生改變時自動更新視圖。JavaScript 中的數(shù)組是引用類型,所以常規(guī)的引用跟蹤機制不能捕獲數(shù)組內(nèi)部的變化。因為Vue的響應(yīng)式是通過 Object.defineProperty()實現(xiàn)的,這個api沒辦法

    2024年02月12日
    瀏覽(18)
  • 零基礎(chǔ)html學(xué)習(xí)-第五期

    好久不見,兄弟們。我又回來繼續(xù)更blog了! 博主主頁:GUIDM 收入專欄:零基礎(chǔ)HTML學(xué)習(xí) ? tr:行 td:列 th:表頭單元格,內(nèi)部文本加粗并居中顯示。 表格table屬性 border:定義線條的粗細(xì) width:定義表格的總寬度 height:定義表格的總高度 cellspacing:定義單元格之間的距離 cellpad

    2023年04月11日
    瀏覽(26)
  • JavaScript 手寫代碼 第三期

    JavaScript 手寫代碼 第三期

    我們在日常開發(fā)過程中,往往都是取出來直接用,從來不思考代碼的底層實現(xiàn)邏輯,但當(dāng)我開始研究一些底層的東西的時候,才開始理解了JavaScript每個方法和函數(shù)的底層實現(xiàn)思路,我認(rèn)為這可以很好的提高我們的代碼水平和邏輯思維。 2.1.1 基本使用 函數(shù)柯里化指的是一種將

    2024年02月10日
    瀏覽(24)
  • JavaScript 手寫代碼 第一期

    JavaScript 手寫代碼 第一期

    我們在日常開發(fā)過程中,往往都是取出來直接用,從來不思考代碼的底層實現(xiàn)邏輯,但當(dāng)我開始研究一些底層的東西的時候,才開始理解了JavaScript每個方法和函數(shù)的底層實現(xiàn)思路,我認(rèn)為這可以很好的提高我們的代碼水平和邏輯思維。 2.1.1 基本使用 定義 : 靜態(tài)方法以一個現(xiàn)

    2024年02月10日
    瀏覽(22)
  • JavaScript 手寫代碼 第四期

    我們在日常開發(fā)過程中,往往都是取出來直接用,從來不思考代碼的底層實現(xiàn)邏輯,但當(dāng)我開始研究一些底層的東西的時候,才開始理解了JavaScript每個方法和函數(shù)的底層實現(xiàn)思路,我認(rèn)為這可以很好的提高我們的代碼水平和邏輯思維。 簡單來說,就是將多維數(shù)組轉(zhuǎn)換為一維

    2024年02月10日
    瀏覽(22)
  • 搜索與圖論第五期 拓?fù)湫蛄? decoding=
  • 運維開發(fā)面試題第五期(華電天益)

    運維開發(fā)面試題第五期(華電天益)

    1、一個目錄(沒有子目錄)有很多文件,想最快速度查看到最近更新的文件你有幾種方式實現(xiàn)?請寫出一種或幾種 2、使用 tar 命令打包/etc 目錄下的所有文件(包括子文件夾) 3、服務(wù)器新增加一個U盤,系統(tǒng)讀取到的盤符為/dev/sdb1,如何將該 U盤掛載到/mnt目錄下? 4、Linux下查詢進程

    2024年02月13日
    瀏覽(22)
  • 第五期:字符串的一些有意思的操作

    第五期:字符串的一些有意思的操作

    PS:每道題解題方法不唯一,歡迎討論!每道題后都有解析幫助你分析做題,答案在最下面,關(guān)注博主每天持續(xù)更新。 1. 替換空格 題目描述 請實現(xiàn)一個函數(shù),把字符串 s 中的每個空格替換成\\\"%20\\\"。 示例1: 輸入:s = “We are happy.” 輸出:“We%20are%20happy.” 示例2: 輸入:s =

    2024年02月08日
    瀏覽(89)
  • 【FPGA-DSP】第五期:FFT調(diào)用流程

    【FPGA-DSP】第五期:FFT調(diào)用流程

    目錄 1. matlab輸入信號編寫 2. Simulink開發(fā) 2.1 模塊搭建 2.2 Simulink運行 2.3 matlab信號處理? 拓:輸入信號位數(shù)改變 本章節(jié)主要說明如何在system generator中使用fft模塊,話不多說,看操作: 參考教程第5期 - FFT調(diào)用流程 - 基于FPGA的數(shù)字信號處理系統(tǒng)開發(fā)筆記_嗶哩嗶哩_bilibili 參考我之

    2023年04月11日
    瀏覽(19)
  • python-opencv第五期:rectangle函數(shù)詳解

    python-opencv第五期:rectangle函數(shù)詳解

    概要: 眾 嗦粥汁 所周知,在如今計算機視覺( Computer Version ?short for CV)是人工智能與機器人技術(shù)發(fā)展的一個重大研究方向,而 opencv 作為一個專門為計算機視覺編程提供技術(shù)與函數(shù)支持的第三方庫,自然是一個需要重點研究的內(nèi)容。 ? ? ? ? ? ? 本期所要介紹的函數(shù)是o

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包