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到结尾。)

原文地址:https://www.cnblogs.com/ljk001/p/8000903.html