js中那些方法不改变原来的数组对象
一、map方法
- function fuzzyPlural(single) {
- var result = single.replace(/o/g, 'e');
- //replace也不会修改原来数组的值,这里打印[foot,goose,moose,kangaroo]
- //alert(single);
- //下面为新的数组添加了一个元素,但是我们看到在map的时候没有对添加的元素进行处理,所以map调用的结果还是没有变化:["feet", "geese", "meese", "kangareese"]
- //但是可以知道words结果已经变化了!
- //words[4]="metoo";
- //虽然下面通过修改length为3将数组截断了,从而相当于删除了第四个元素,但是map方法并不会检测到这种变化,所以在map方法调用的结果数组长度还是为4,只是最后一个元素变成了空了!但是这种删除会影响外层的words,使得他的长度变成了3!
- //但是在具体的fuzzyPlural只会调用三次!(通过alert(single)就可以知道,因为这里已经把数组截断了,但是返回的数组长度还是4,一个为空!)
- words.length=3;
- if( single === 'kangaroo'){
- result += 'se';
- }
- return result;
- }
- var words = ["foot", "goose", "moose", "kangaroo"];
- alert(words.map(fuzzyPlural));
- //map方法不修改原数组的值,words经过map调用以后,还是没有发生变化!
- alert(words);
- // ["feet", "geese", "meese", "kangareese"]
note:map方法的调用不会修改原来的数组,同时从上面分析来说replace方法也不会改变原来调用的字符串!同时我们上面用到了把length减少来删除数组元素的方法,但是这种方法比较笨拙,只能从数组尾部删除数据,同时数组也有delete删除方法,但是这种方法的不当之处在于他会在原来的数组中留下空洞,也就是原来的对象只是变成了undefined,而不是真正的删除。于是我们建议用splice方法,第一个参数是开始删除的下标,第二个参数是要删除的个数!同时要注意parseInt方法parseInt("1",0);会变成1!
二、concat方法
- var num1 = [1, 2, 3];
- var num2 = [4, 5, 6];
- var num3 = [7, 8, 9,"c"];
- var nums = num1.concat(num2, num3);
- //为老数组添加一个元素,看新数组是否会发生变化
- //打印[1,2,3,4,5,6,7,8,9,c]
- alert(nums);
- num3[4]="xxxx";
- //发现新数组没有发生变化
- alert(nums);
- //为num1添加一个元素
- num1[3]="cccc"
- //新数组也没有发生变化!
- alert(nums);
note:对新数组的任何操作不会影响老数组,反之亦然!因为这个方法会创建当前数组的一个副本,然后将接受的参数添加到这个副本的末尾!所以互不影响!
三、slice方法
- // 使用slice方法从myCar中创建一个newCar.
- var myHonda = { color: "red", wheels: 4, engine: { cylinders: 4, size: 2.2 } };
- var myCar = [myHonda, 2, "cherry condition", "purchased 1997"];
- var newCar = myCar.slice(0, 2);
- // 输出myCar, newCar,以及各自的myHonda对象引用的color属性.
- print("myCar = " + myCar.toSource());
- print("newCar = " + newCar.toSource());
- print("myCar[0].color = " + myCar[0].color);
- print("newCar[0].color = " + newCar[0].color);
- // 改变myHonda对象的color属性.
- myHonda.color = "purple";
- print("The new color of my Honda is " + myHonda.color);
- //输出myCar, newCar中各自的myHonda对象引用的color属性.
- print("myCar[0].color = " + myCar[0].color);
- 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中那些方法不改变原来的数组对象的更多相关文章
- js中apply方法的使用
js中apply方法的使用 1.对象的继承,一般的做法是复制:Object.extend prototype.js的实现方式是: Object.extend = function(destinat ...
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
- 原生JS中apply()方法的一个值得注意的用法
今天在学习vue.js的render时,遇到需要重复构造多个同类型对象的问题,在这里发现原生JS中apply()方法的一个特殊的用法: var ary = Array.apply(null, { &q ...
- paip.编程语言方法重载实现的原理及python,php,js中实现方法重载
paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...
- js中settimeout方法加参数
js中settimeout方法加参数的使用. 简单使用看w3school 里面没有参数调用, 例子: <script type="text/javascript"> ...
- js中split()方法得到的数组长度
js 中split(",")方法通过 ”,“ 分割字符串, 如果字符串中没有 “,” , 返回的是字符串本身 var str = “abc”://分隔符个数为0 var newSt ...
- 关于JS中的方法是否加括号的问题
js中的方法什么时候加括号什么时候不加括号呢,我们有时候经常就搞不清楚,记住下面这几点就好理解了. 1.函数做参数时都不要加括号. function fun(a){ alert(a); } funct ...
- js中的方法如何传入多个参数
js中的方法如何传入多个参数 $(function () { let parameter1 = 1; let parameter2 = 'Hello World'; let parameter3 = ...
- js 中的方法注入(aop)
js 中的方法注入 java中很多框架支持 apo 的注入, js中也可以类似的进行实现 主要是通过扩展js中方法的老祖 Function 对象来进行实现. Function.prototype.af ...
随机推荐
- 远程调用cmd更新本地jar
最近遇到一个项目需求需要实现远程更新,但是本地项目无法更新自己,这让博主很是头疼,既然自己无法更新自己的话,那就自建新的项目,通过本地项目来调用新项目接口来更新本地项目. 代码如下: /** * 重启 ...
- 安装jdk配置环境变量后jps command not found
配置Java环境变量的时候一般是 vi /etc/profile 然后按两个大写的G就会跑到最后一行去,然后配置写入下文: 这个时候你jps查看Java的进程会出现: 分析原因: 一般是配置之后,没有 ...
- Linux命令——netstat
参考:20 Netstat Commands for Linux Network Management Foreword Print network connections, routing tabl ...
- RT-Thread--简介
RT-Thread 概述 RT-Thread,全称是 Real Time-Thread,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行,但并不是真正的同时运行,而是宏 ...
- Ubuntu系统---又显示nvidia-smi 未找到命令
Ubuntu系统---又显示nvidia-smi 未找到命令 本来nvidia驱动+CUDA安装好用,两次遇到开机发现字体异常,不用合计,是显卡驱动的问题.一查,确实是nvidia-smi 未找到命令 ...
- SQL JOB实现数据库同步
数据库同步是一种比较常用的功能.以下结合我自己的体会整理的,如果有理解不完全或者有误的地方望大牛不理赐教.下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式 sql Job的方式同步数据 ...
- Oracle中查询表中数据的上次更新时间
目前找到的是以下方式,但是这种方式在表的数据量比较大的时候效率会比较慢. select to_char(scn_to_timestamp(max(ora_rowscn)),'YYYY-MM-DD HH ...
- SEO 统计算法
1)简单粗暴型的,这里不用去管浏览器的user-agent,不管cookie等信息,每产生一次PV,就直接计数,优点:简单,缺点:可能不真实,也可能有刷量数据 2) 稍微细腻点的统计,会区分新老用户, ...
- sklearn逻辑回归实战
目录 题目要求 ex2data1.txt处理 方案一:无多项式特征 方案二:引入多项式特征 ex2data2.txt处理 两份数据 ex2data1.txt ex2data2.txt 题目要求 根据学 ...
- Java基础 @org.junit.Test-单元测试方法 + 操纵Collection和Map的工具类 : Collections 的sort/binarySearch/max/min等静态方法
单元测试代码: ( 在IDEA中先输入'@Test '然后根据提示进行自动修订即可!!运行时直接运行即可! 若有多个单元测试块的时候,直接把鼠标放在哪里就自动在哪里运行那个单元块) import ...