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

js中那些方法不改变原来的数组对象的更多相关文章

  1. js中apply方法的使用

    js中apply方法的使用   1.对象的继承,一般的做法是复制:Object.extend prototype.js的实现方式是: Object.extend = function(destinat ...

  2. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  3. 原生JS中apply()方法的一个值得注意的用法

    今天在学习vue.js的render时,遇到需要重复构造多个同类型对象的问题,在这里发现原生JS中apply()方法的一个特殊的用法: var ary = Array.apply(null, { &q ...

  4. paip.编程语言方法重载实现的原理及python,php,js中实现方法重载

    paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...

  5. js中settimeout方法加参数

    js中settimeout方法加参数的使用. 简单使用看w3school  里面没有参数调用,  例子: <script type="text/javascript"> ...

  6. js中split()方法得到的数组长度

    js 中split(",")方法通过 ”,“ 分割字符串, 如果字符串中没有 “,” , 返回的是字符串本身 var str = “abc”://分隔符个数为0 var newSt ...

  7. 关于JS中的方法是否加括号的问题

    js中的方法什么时候加括号什么时候不加括号呢,我们有时候经常就搞不清楚,记住下面这几点就好理解了. 1.函数做参数时都不要加括号. function fun(a){ alert(a); } funct ...

  8. js中的方法如何传入多个参数

    js中的方法如何传入多个参数 $(function () { let parameter1 = 1; let parameter2 = 'Hello World'; let parameter3 = ...

  9. js 中的方法注入(aop)

    js 中的方法注入 java中很多框架支持 apo 的注入, js中也可以类似的进行实现 主要是通过扩展js中方法的老祖 Function 对象来进行实现. Function.prototype.af ...

随机推荐

  1. linux命令启动关闭firewalld防火墙,添加端口

    firewalld管理防火墙常用命令   1.查看防火墙的状态 [root@localhost HMK]# firewall-cmd --state 查看防火墙的运行状态 not running [r ...

  2. 服务器去掉IE浏览器网络安全限制

  3. 离线yum源挂载及yum服务器搭建

    在进行现网环境搭建的时候,绝大多数情况下,centos或redhat(以下以centos为例)服务器是跟公网隔离的,因此需要找一台服务器挂载自己的yum源. 一.离线yum源包的制作 离线yum源可以 ...

  4. 02 WIndows编程——危险的sizeof

    C语言中,对 sizeof() 的处理都是在编译阶段进行. 下面代码,注意可变参数是怎么使用的 #include<Windows.h> #include<stdio.h> in ...

  5. Qt一些方便易用的小技巧

    延迟给自己发信号执行操作 //延迟4500毫秒, 改变Status的值. QTimer::singleShot(4500, this, [&](){ this->Status = 0; ...

  6. redis——持久化策略

    4.2.2 持久 化方式(1 ) RDB 方式1. 什么是 RDB 方式?Redis Database(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存 ...

  7. How to resolve emulator cannot be launched issue by command line

    Issue: Resolution: 1. Open the system variables, find the Path and edit it, add below item : C:\User ...

  8. Flyme密码验证策略升级,忘记锁屏密码及「关机密码」功能

      手机里有很多需要用到密码的地方,比如「手机密码」.「文档锁定区」.「应用加密」.「隐私模式」.忘记密码可是一件麻烦事,以前只能通过清除数据或格式化存储盘来解决.现在有了「关联魅族账号」功能,这些功 ...

  9. 第95题:不同的二叉搜素树II

    一. 问题描述 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,n ...

  10. Django内置email发送邮件

    ###Django内置email发送邮件 ####1.首先在settings.py文件设置相关参数 ```python STATIC_URL = '/static/' # 设置邮件域名 EMAIL_H ...