亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript中十種一步拷貝數組的方法實例詳解

2019-11-19 11:43:55
字體:
來源:轉載
供稿:網友

JavaScript中我們經常會遇到拷貝數組的場景,但是都有哪些方式能夠來實現呢,我們不妨來梳理一下。

1、擴展運算符(淺拷貝)

自從ES6出現以來,這已經成為最流行的方法。它是一個很簡單的語法,但是當你在使用類似于React和Redux這類庫時,你會發現它是非常非常有用的。

numbers = [1, 2, 3];numbersCopy = [...numbers];這個方法不能有效的拷貝多維數組。數組/對象值的拷貝是通過引用而不是值復制。// numbersCopy.push(4);console.log(numbers, numbersCopy);// [1, 2, 3] and [1, 2, 3, 4]// 只修改了我們希望修改的,原數組不受影響// nestedNumbers = [[1], [2]];numbersCopy = [...nestedNumbers];numbersCopy[0].push(300);console.log(nestedNumbers, numbersCopy);// [[1, 300], [2]]// [[1, 300], [2]]// 由于公用引用,所以兩個數組都被修改了,這是我們不希望的

2、for()循環(淺拷貝)

考慮到函數式編程變得越來越流行,我認為這種方法可能是最不受歡迎的。

numbers = [1, 2, 3];numbersCopy = [];for (i = 0; i < numbers.length; i++) { numbersCopy[i] = numbers[i];}這個方法不能有效的拷貝多維數組。因為我們使用的是=運算符,它在處理數組/對象值的拷貝時通過引用而不是值復制。// numbersCopy.push(4);console.log(numbers, numbersCopy);// [1, 2, 3] and [1, 2, 3, 4]// nestedNumbers = [[1], [2]];numbersCopy = [];for (i = 0; i < nestedNumbers.length; i++) { numbersCopy[i] = nestedNumbers[i];}numbersCopy[0].push(300);console.log(nestedNumbers, numbersCopy);// [[1, 300], [2]]// [[1, 300], [2]]// 由于公用引用,所以兩個數組都被修改了,這是我們不希望的

3、while()循環(淺拷貝)和for() 類似。

numbers = [1, 2, 3];numbersCopy = [];i = -1;while (++i < numbers.length) { numbersCopy[i] = numbers[i];}

4、Array.map(淺拷貝)

上面的for和while都是很“古老”的方式,讓我們繼續回到當前,我們會發現map方法。map源于數學,是將一個集合轉換成另一種集合,同時保留結構的概念。

在英語中,它意味著Array.map 每次返回相同長度的數組。

numbers = [1, 2, 3];double = (x) => x * 2;numbers.map(double);

當我們使用map方法時,需要給出一個callback函數用于處理當前的數組,并返回一個新的數組元素。

和拷貝數組有什么關系呢?

當我們想要復制一個數組的時候,只需要在map的callback函數中直接返回原數組的元素即可。

numbers = [1, 2, 3];numbersCopy = numbers.map((x) => x);

如果你想更數學化一點,(x) => x叫做恒等式。它返回給定的任何參數。

identity = (x) => x;numbers.map(identity);// [1, 2, 3]

同樣的,處理對象和數組的時候是引用而不是值復制。

5、Array.filter(淺拷貝)

Array.filter方法同樣會返回一個新數組,但是并不一定是返回同樣長度的,這和我們的過濾條件有關。

[1, 2, 3].filter((x) => x % 2 === 0)// [2]

當我們的過濾條件總是true時,就可以用來實現拷貝。

numbers = [1, 2, 3];numbersCopy = numbers.filter(() => true);// [1, 2, 3]

同樣的,處理對象和數組的時候是引用而不是值復制。

6、Array.reduce(淺拷貝)

其實用reduce來拷貝數組并沒有展示出它的實際功能,但是我們還是要將其能夠拷貝數組的能力說一下的

numbers = [1, 2, 3];numbersCopy = numbers.reduce((newArray, element) => { newArray.push(element); return newArray;}, []);

reduce() 方法對數組中的每個元素執行一個由您提供的reducer函數,將其結果匯總為單個返回值。

上面我們的例子中初始值是一個空數組,我們在遍歷原數組的時候來填充這個空數組。該數組必須要從下一個迭代函數的執行后被返回出來。

同樣的,處理對象和數組的時候是引用而不是值復制。

7、Array.slice(淺拷貝)

slice 方法根據我們指定的start、end的index從原數組中返回一個淺拷貝的數組。

[1, 2, 3, 4, 5].slice(0, 3);// [1, 2, 3]// Starts at index 0, stops at index 3// 當不給定參數時,就返回了原數組的拷貝numbers = [1, 2, 3, 4, 5];numbersCopy = numbers.slice();// [1, 2, 3, 4, 5]

同樣的,處理對象和數組的時候是引用而不是值復制。

8、JSON.parse & JSON.stringify(深拷貝)

JSON.stringify將一個對象轉成字符串;
JSON.parse將轉成的字符串轉回對象。

將它們組合起來可以將對象轉換成字符串,然后反轉這個過程來創建一個全新的數據結構。

nestedNumbers = [[1], [2]];numbersCopy = JSON.parse( JSON.stringify(nestedNumbers));numbersCopy[0].push(300);console.log(nestedNumbers, numbersCopy);// [[1], [2]]// [[1, 300], [2]]// These two arrays are completely separate!

這個可以安全地拷貝深度嵌套的對象/數組

幾種特殊情況

1、如果obj里面有時間對象,則JSON.stringify后再JSON.parse的結果,時間將只是字符串的形式。而不是時間對象;

var test = { name: 'a', date: [new Date(1536627600000), new Date(1540047600000)],};let b;b = JSON.parse(JSON.stringify(test))console.log(b)

2、如果obj里有RegExp、Error對象,則序列化的結果將只得到空對象;

const test = { name: 'a', date: new RegExp('//w+'),};// debuggerconst copyed = JSON.parse(JSON.stringify(test));test.name = 'test'console.log('ddd', test, copyed)

3、如果obj里有函數,undefined,則序列化的結果會把函數或 undefined丟失;

const test = { name: 'a', date: function hehe() { console.log('fff') },};// debuggerconst copyed = JSON.parse(JSON.stringify(test));test.name = 'test'console.error('ddd', test, copyed)

4、如果obj里有NaN、Infinity和-Infinity,則序列化的結果會變成null

5、JSON.stringify()只能序列化對象的可枚舉的自有屬性,例如 如果obj中的對象是有構造函數生成的, 則使用JSON.parse(JSON.stringify(obj))深拷貝后,會丟棄對象的constructor;

function Person(name) { this.name = name; console.log(name)}const liai = new Person('liai');const test = { name: 'a', date: liai,};// debuggerconst copyed = JSON.parse(JSON.stringify(test));test.name = 'test'console.error('ddd', test, copyed)

9、Array.cancat(淺拷貝)

concat將數組與值或其他數組進行組合。

[1, 2, 3].concat(4); // [1, 2, 3, 4][1, 2, 3].concat([4, 5]); // [1, 2, 3, 4, 5]

如果我們不指定參數或者提供一個空數組作為參數,就可以進行淺拷貝。

[1, 2, 3].concat(); // [1, 2, 3][1, 2, 3].concat([]); // [1, 2, 3]

同樣的,處理對象和數組的時候是引用而不是值復制。

10、Array.from(淺拷貝)

可以將任何可迭代對象轉換為數組。給一個數組返回一個淺拷貝。

console.log(Array.from('foo'))// ['f', 'o', 'o']numbers = [1, 2, 3];numbersCopy = Array.from(numbers)// [1, 2, 3]
同樣的,處理對象和數組的時候是引用而不是值復制。

小結

上面這些方法都是在使用一個步驟來進行拷貝。如果我們結合一些其他的方法或技術能夠發現還有很多的方式來實現數組的拷貝,比如一系列的拷貝工具函數等。

以上所述是小編給大家介紹的JavaScript中十種一步拷貝數組的方法實例詳解,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情精品久久久久久免费印度| 亚洲人成在线观| 色偷偷噜噜噜亚洲男人的天堂| 搡老女人一区二区三区视频tv| 亚洲天堂av图片| 红桃av永久久久| 亚州精品天堂中文字幕| 中文综合在线观看| 久久久久久久97| 日本久久久久久久| 97精品一区二区视频在线观看| 欧洲亚洲免费在线| 国产成人亚洲综合91精品| 久久精品福利视频| 国产综合在线观看视频| 日本免费一区二区三区视频观看| 国模私拍一区二区三区| 亚洲精品成a人在线观看| 欧美日韩国产一区二区三区| 亚洲欧美综合区自拍另类| 国产精品欧美日韩一区二区| 欧美噜噜久久久xxx| 精品亚洲男同gayvideo网站| 91精品啪在线观看麻豆免费| 欧美亚洲在线观看| 欧美黄色性视频| 国产成人激情小视频| www.久久色.com| 亚洲国产精品va在看黑人| 国产97在线|亚洲| 91在线观看免费| 午夜剧场成人观在线视频免费观看| 中文字幕亚洲欧美| 欧美一区二三区| 国产成人精品久久二区二区| 国产精品综合网站| 91在线观看免费观看| 青草青草久热精品视频在线网站| 丝袜美腿亚洲一区二区| 91黄色8090| 欧美国产日本在线| 欧美亚洲国产另类| 久久久久久久爱| 日韩国产精品亚洲а∨天堂免| 岛国av一区二区在线在线观看| 91久久精品美女高潮| 日本aⅴ大伊香蕉精品视频| 亚洲伊人久久综合| 欧美日韩中国免费专区在线看| 国产国语videosex另类| 超薄丝袜一区二区| 亚洲欧美日韩爽爽影院| 国产精品一区二区久久精品| 久久久久久国产精品三级玉女聊斋| 一本色道久久88综合亚洲精品ⅰ| 色综久久综合桃花网| 97视频免费在线看| 成人福利视频在线观看| 欧美性69xxxx肥| 久久精品视频免费播放| 在线观看视频亚洲| 91人成网站www| 欧美夫妻性生活视频| 92看片淫黄大片欧美看国产片| 亚洲国内高清视频| 久久久精品美女| 亚洲在线免费观看| 97不卡在线视频| 欧美性猛交xxx| 在线观看亚洲视频| 亚洲激情视频在线| 亚洲天堂免费在线| 欧美精品免费看| 中文字幕av一区二区| 91人人爽人人爽人人精88v| 91色琪琪电影亚洲精品久久| www.久久草.com| 亚洲精品自在久久| 国产欧美日韩免费看aⅴ视频| 日韩日本欧美亚洲| 欧洲精品久久久| 91精品久久久久久久久久入口| 国产自产女人91一区在线观看| 亚洲欧美一区二区三区久久| 久久偷看各类女兵18女厕嘘嘘| 精品欧美激情精品一区| 久久天天躁狠狠躁夜夜爽蜜月| 97香蕉久久超级碰碰高清版| 精品高清美女精品国产区| 中文字幕欧美精品在线| 国产精品欧美一区二区| 在线观看亚洲视频| 国产在线观看精品| 日韩大片免费观看视频播放| 17婷婷久久www| 国产精品成久久久久三级| 久久国产精品视频| 精品国产区一区二区三区在线观看| 色琪琪综合男人的天堂aⅴ视频| 亚洲国产精品美女| 亚洲国产精品va在线看黑人动漫| 国产女人精品视频| 欧美国产日产韩国视频| 色综合久久天天综线观看| 欧美日韩国产激情| 亚洲国产成人精品久久久国产成人一区| 久久久精品久久久久| 国产原创欧美精品| 欧美性生交xxxxxdddd| 国产精品一区久久| 最近日韩中文字幕中文| 国产成人在线一区| 欧美xxxx14xxxxx性爽| 亚洲一区二区久久久| 这里只有精品视频在线| 精品国产31久久久久久| 91亚洲一区精品| 尤物yw午夜国产精品视频| 98精品国产高清在线xxxx天堂| 国外成人免费在线播放| 欧美另类69精品久久久久9999| 亚洲精品短视频| 亚洲石原莉奈一区二区在线观看| 日韩av网站导航| 亚洲第一视频网| 欧美成人免费播放| 8x海外华人永久免费日韩内陆视频| 国产精品网站视频| 97超级碰碰人国产在线观看| 亚洲网在线观看| 日本成人黄色片| 国产黑人绿帽在线第一区| 亚洲大尺度美女在线| 欧美高清第一页| 国产精品999| 亚洲图片欧美午夜| 国产综合福利在线| 国产精品旅馆在线| 国产成人av网址| 欧美精品免费在线观看| 欧美午夜宅男影院在线观看| 欧美精品在线免费观看| 欧美人与物videos| 国产精品自产拍在线观| 国产成人精品综合久久久| 美日韩精品免费视频| 亚洲精品日韩激情在线电影| 57pao精品| 日韩欧美国产一区二区| 亚洲小视频在线观看| 久久激情视频免费观看| www国产精品com| 91av网站在线播放| 亚洲一区二区三区成人在线视频精品| 国产精品久久久久久久av大片| 性金发美女69hd大尺寸| 夜夜嗨av一区二区三区免费区| 久久精品视频在线观看| 91在线|亚洲| 精品成人乱色一区二区| 亚洲电影免费观看高清完整版在线| 91久久国产精品91久久性色| 亚洲第一天堂av| 亚洲欧美日韩一区二区在线|