js中那些方法不改變原來的數組對象


一、map方法

  1. function fuzzyPlural(single) {  
  2.   var result = single.replace(/o/g, 'e');    
  3.     //replace也不會修改原來數組的值,這里打印[foot,goose,moose,kangaroo]  
  4.     //alert(single);  
  5. //下面為新的數組添加了一個元素,但是我們看到在map的時候沒有對添加的元素進行處理,所以map調用的結果還是沒有變化:["feet", "geese", "meese", "kangareese"]  
  6.     //但是可以知道words結果已經變化了!  
  7.     //words[4]="metoo";  
  8. //雖然下面通過修改length為3將數組截斷了,從而相當於刪除了第四個元素,但是map方法並不會檢測到這種變化,所以在map方法調用的結果數組長度還是為4,只是最后一個元素變成了空了!但是這種刪除會影響外層的words,使得他的長度變成了3!  
  9.     //但是在具體的fuzzyPlural只會調用三次!(通過alert(single)就可以知道,因為這里已經把數組截斷了,但是返回的數組長度還是4,一個為空!)  
  10.     words.length=3;  
  11.   if( single === 'kangaroo'){  
  12.     result += 'se';  
  13.   }       
  14.   return result;   
  15. }  
  16. var words = ["foot", "goose", "moose", "kangaroo"];  
  17. alert(words.map(fuzzyPlural));  
  18. //map方法不修改原數組的值,words經過map調用以后,還是沒有發生變化!  
  19. alert(words);  
  20. // ["feet", "geese", "meese", "kangareese"]  
note:map方法的調用不會修改原來的數組,同時從上面分析來說replace方法也不會改變原來調用的字符串!同時我們上面用到了把length減少來刪除數組元素的方法,但是這種方法比較笨拙,只能從數組尾部刪除數據,同時數組也有delete刪除方法,但是這種方法的不當之處在於他會在原來的數組中留下空洞,也就是原來的對象只是變成了undefined,而不是真正的刪除。於是我們建議用splice方法,第一個參數是開始刪除的下標,第二個參數是要刪除的個數!同時 要注意parseInt方法parseInt("1",0);會變成1!

二、concat方法

  1. var num1 = [1, 2, 3];  
  2. var num2 = [4, 5, 6];  
  3. var num3 = [7, 8, 9,"c"];  
  4. var nums = num1.concat(num2, num3);  
  5. //為老數組添加一個元素,看新數組是否會發生變化  
  6. //打印[1,2,3,4,5,6,7,8,9,c]  
  7. alert(nums);  
  8. num3[4]="xxxx";  
  9. //發現新數組沒有發生變化  
  10. alert(nums);  
  11. //為num1添加一個元素  
  12. num1[3]="cccc"  
  13. //新數組也沒有發生變化!  
  14. alert(nums);  

note:對新數組的任何操作不會影響老數組,反之亦然!因為這個方法會創建當前數組的一個副本,然后將接受的參數添加到這個副本的末尾!所以互不影響!

三、slice方法

  1. // 使用slice方法從myCar中創建一個newCar.  
  2. var myHonda = { color: "red", wheels: 4, engine: { cylinders: 4, size: 2.2 } };  
  3. var myCar = [myHonda, 2, "cherry condition", "purchased 1997"];  
  4. var newCar = myCar.slice(0, 2);  
  5. // 輸出myCar, newCar,以及各自的myHonda對象引用的color屬性.  
  6. print("myCar = " + myCar.toSource());  
  7. print("newCar = " + newCar.toSource());  
  8. print("myCar[0].color = " + myCar[0].color);  
  9. print("newCar[0].color = " + newCar[0].color);  
  10. // 改變myHonda對象的color屬性.  
  11. myHonda.color = "purple";  
  12. print("The new color of my Honda is " + myHonda.color);  
  13. //輸出myCar, newCar中各自的myHonda對象引用的color屬性.  
  14. print("myCar[0].color = " + myCar[0].color);  
  15. print("newCar[0].color = " + newCar[0].color);  
note:slice不會修改原來的數組,但是如果slice得到的結果數組包含了引用對象,那么如果修改原來的引用對象,,那么除了原來的被修改了以外,通過slice獲取的結果的數組也會發生變化,這就是引用對象在slice中的表現!同時在上面的這篇博客里面我們要學到可以把類數組對象轉化為數組對象有三種方法,Array.prototype.slice.call和[].slice.call,以及slice=Function.prototype.call.bind(Array.prototype.slice)然后通過slice(arguments)來完成!第三種用法還有一種去除兩端空格的方法,a.map(Function.prototype.call,String.prototype.trim)

四、filter,forEach,some,every(只要有一個元素不滿足就會終止循環)等

 

ps:(簡單來說以下兩種更直觀:

有一個數組arr = [1, 2, 3, 4, 10]。
var str = new Array;

str = arr; //這個不是賦值,將數組arr的引用賦給str,所以改變str也會改變arr (js實際創建的str是一個對象);


正確賦值:
1、str = [].concat(arr);

或者:

     str=arr.concat();
content用於連接多個數組:arr1.concat(arr2,arr3,。。。。)

2、str=arr.slice(0);
返回一個新數組,從0到最后。
(slice有兩個參數:xx.slice(start,end),返回數組xx下標從start到end的元素。若未定義end則返回start到結尾。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM