偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

在JavaScript 中 14 個拷貝數(shù)組的技巧

開發(fā) 前端
數(shù)組拷貝經(jīng)常被誤解,但這并不是因為拷貝過程本身,而是因為缺乏對 JS 如何處理數(shù)組及其元素的理解。JS 中的數(shù)組是可變的,這說明在創(chuàng)建數(shù)組之后還可以修改數(shù)組的內(nèi)容。

 數(shù)組拷貝經(jīng)常被誤解,但這并不是因為拷貝過程本身,而是因為缺乏對 JS 如何處理數(shù)組及其元素的理解。JS 中的數(shù)組是可變的,這說明在創(chuàng)建數(shù)組之后還可以修改數(shù)組的內(nèi)容。

[[326489]]

這意味著要拷貝一個數(shù)組,咱們不能簡單地將舊數(shù)組分配給一個新變量,它也是一個數(shù)組。如果這樣做,它們將共享相同的引用,并且在更改一個變量之后,另一個變量也將受到更改的影響。這就是我們需要克隆這個數(shù)組的原因。

接著來看看一些關(guān)于拷貝何克隆數(shù)組的有趣方法和技巧。

技巧 1 - 使用Array.slice方法

 

  1. const numbers = [1, 2, 3, 4, 5] 
  2.  
  3. const copy = numbers.slice() 
  4. copy.push(6) // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy) 
  7. console.log(numbers) 
  8.  
  9. // 輸出 
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

技巧 2 - 使用Array.map方法

 

  1. const numbers = [1, 2, 3, 4, 5] 
  2.  
  3. const copy = numbers.map( num => num ) 
  4. copy.push(6) // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy); 
  7. console.log(numbers); 
  8.  
  9. // 輸出 
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

技巧 3 - 使用Array.from 方法

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. const copy = Array.from(new Set(numbers)); 
  4. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy); 
  7. console.log(numbers); 
  8.  
  9. // 輸出 
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

技巧 4 - 使用展開操作符

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. const copy = [...numbers]; 
  4. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy); 
  7. console.log(numbers); 
  8.  
  9. // 輸出  
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

技巧 5 - 使用 Array.of 方法和展開操作符

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. const copy = Array.of(...numbers); 
  4. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy); 
  7. console.log(numbers); 
  8.  
  9. // 輸出  
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

Array.of() 方法創(chuàng)建一個具有可變數(shù)量參數(shù)的新數(shù)組實例,而不考慮參數(shù)的數(shù)量或類型。Array.of() 和 Array 構(gòu)造函數(shù)之間的區(qū)別在于處理整數(shù)參數(shù):Array.of(7) 創(chuàng)建一個具有單個元素 7 的數(shù)組,而 Array(7) 創(chuàng)建一個長度為7的空數(shù)組(注意:這是指一個有7個空位(empty)的數(shù)組,而不是由7個undefined組成的數(shù)組)。

 

  1. Array.of(7);       // [7]  
  2. Array.of(1, 2, 3); // [1, 2, 3] 
  3.  
  4. Array(7);          // [ , , , , , , ] 
  5. Array(1, 2, 3);    // [1, 2, 3] 

 

技巧 6 - 使用 Array 構(gòu)造函數(shù)和展開操作符

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. const copy = new Array(...numbers); 
  4. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy); 
  7. console.log(numbers); 
  8.  
  9. // 輸出  
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

技巧 7 - 使用解構(gòu)

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. const [...copy] = numbers; 
  4. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy); 
  7. console.log(numbers); 
  8.  
  9. // 輸出 
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

技巧 8 - 使用 Array.concat 方法

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. const copy = numbers.concat(); 
  4. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy); 
  7. console.log(numbers); 
  8.  
  9. // 輸出 
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

技巧 9 - 使用 Array.push 方法和展開操作符

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. let copy = []; 
  4. copy.push(...numbers); 
  5. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  6.  
  7. console.log(copy); 
  8. console.log(numbers); 
  9.  
  10. // 輸出 
  11. // [1, 2, 3, 4, 5, 6] 
  12. // [1, 2, 3, 4, 5] 

 

技巧 10 - 使用 Array.unshift 方法和展開操作符

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. let copy = []; 
  4. copy.unshift(...numbers); 
  5. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  6.  
  7. console.log(copy); 
  8. console.log(numbers); 
  9.  
  10. // 輸出 
  11. // [1, 2, 3, 4, 5, 6] 
  12. // [1, 2, 3, 4, 5] 

 

技巧 11 - 使用 Array.forEach 方法和展開操作符

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. let copy = []; 
  4. numbers.forEach((value) => copy.push(value)); 
  5. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  6.  
  7. console.log(copy); 
  8. console.log(numbers); 
  9.  
  10. // 輸出 
  11. // [1, 2, 3, 4, 5, 6] 
  12. // [1, 2, 3, 4, 5] 

 

技巧 12 - 使用 for 循環(huán)

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. let copy = []; 
  4. for (let i = 0; i < numbers.length; i++) { 
  5.     copy.push(numbers[i]); 
  6. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  7.  
  8. console.log(copy); 
  9. console.log(numbers); 
  10.  
  11. // 輸出 
  12. // [1, 2, 3, 4, 5, 6] 
  13. // [1, 2, 3, 4, 5] 

 

技巧 13 - 使用 Array.reduce 方法

這個做法是可行,但比較多余,少用

 

  1. const numbers = [1, 2, 3, 4, 5]; 
  2.  
  3. const copy = numbers.reduce((acc, x) => { acc.push(x); return acc; }, []); 
  4. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  5.  
  6. console.log(copy); 
  7. console.log(numbers); 
  8.  
  9. // 輸出 
  10. // [1, 2, 3, 4, 5, 6] 
  11. // [1, 2, 3, 4, 5] 

 

技巧 14 - 使用古老的 apply 方法

 

  1. let copy = []; 
  2. Array.prototype.push.apply(copy, numbers); 
  3. copy.push(6); // 添加新項以證明不會修改原始數(shù)組 
  4.  
  5. console.log(copy); 
  6. console.log(numbers); 
  7.  
  8. // 輸出 
  9. // [1, 2, 3, 4, 5, 6] 
  10. // [1, 2, 3, 4, 5] 

 

代碼部署后可能存在的BUG沒法實時知道,事后為了解決這些BUG,花了大量的時間進行l(wèi)og 調(diào)試,這邊順便給大家推薦一個好用的BUG監(jiān)控工具 Fundebug。

原文:https://twitter.com/protic_milos

總結(jié)

請注意,上面這些方法執(zhí)行的是淺拷貝,就是數(shù)組是元素是對象的時候,咱們更改對象的值,另一個也會跟著變,就能技巧4來說,如果咱們的數(shù)組元素是對象,如下所示:

 

  1. const authors = [ 
  2.   { name'前端小智', age: 25 },  
  3.   { name'王大冶', age: 30 },  
  4.  
  5. const copy = [...authors ] 
  6. copy[0].name = '被更改過的前端小智' 
  7.  
  8. console.log(copy) 
  9. console.log(authors) 

 

輸出

 

 

 

 

所以上面的技巧適合簡單的數(shù)據(jù)結(jié)構(gòu),復(fù)雜的結(jié)構(gòu)要使用深拷貝。數(shù)組拷貝經(jīng)常被誤解,但這并不是因為拷貝過程本身,而是因為缺乏對 JS 如何處理數(shù)組及其元素的理解。

責(zé)任編輯:華軒 來源: SegmentFault
相關(guān)推薦

2019-11-13 14:58:39

JavaScriptNumbers程序員

2019-12-12 20:49:05

JavaScript語言運算符

2020-08-21 17:40:15

JavaScript開發(fā) 技巧

2025-04-27 09:45:58

JavaScript深拷貝淺拷貝

2023-02-13 15:09:01

開發(fā)webCSS技巧

2014-12-18 13:20:09

Docker容器鏡像數(shù)據(jù)卷

2021-07-16 12:33:24

Javascript深拷貝淺拷貝

2017-11-07 21:58:25

前端JavaScript調(diào)試技巧

2011-03-01 16:00:08

java數(shù)據(jù)庫

2012-06-18 16:30:26

WindowsLinux

2020-10-12 08:35:22

JavaScript

2016-08-03 17:23:47

javascripthtml前端

2020-05-31 18:57:50

CIO影子ITIT運營

2020-09-29 08:14:46

JavaScript開發(fā)代碼

2017-09-21 08:56:50

數(shù)據(jù)管理主流

2022-12-25 16:03:31

JavaScript技巧

2023-08-11 17:39:43

JavaScriptWeb 應(yīng)用程序

2022-12-22 14:44:06

JavaScript技巧

2024-08-21 14:55:02

2023-11-26 17:54:07

JavaScript開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號