(迁移自旧博客2017-04-19)

快速复制数组及数组比较大小方法

首先介绍一下复制数组的方法:

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var aCopy = arr.slice();
aCopy; // ['A', 'B', 'C', 'D', 'E', 'F', 'G'];

这样就成功复制数组了,是不是很神奇?

slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array:

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: ['A', 'B', 'C']
arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G']

注意到slice()的起止参数包括开始索引,不包括结束索引。

如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array。也就是我们第一段程序的原理所在。

然后给出一段代码:

var arr=[1,2,3];
var copyarr=arr.slice();
console.log(arr===copyarr);

这时你就会想copyarr数组是由arr复制而来的,它们应该相等才对。然而你发现这时浏览器返回的是false,它们不相等。这是为什么呢?

原来,两个数组比较大小是不能通过或者=来比较的,无论是相等还是全等都不行,都会返回false。

正确比较方法:要判断JS中的两个数组是否相同,需要先将数组转换为字符串,再作比较。

以下两行代码将返回true。

alert([].toString()== [].toString());
alert([].toString()===[].toString());

延伸:如果要比较两个数组是否具有相同的元素,即两个数组所有元素都相同,但元素的顺序不一定一致。只就需要先将数组进行排序,再比较两个数组是否相等。看下面两行代码:

alert([1,2,3].toString()== [3,2,1].toString());
alert([1,2,3].sort().toString()== [3,2,1].sort().toString());

第一行返回false,第二行返回true。第二行是正确姿势!

接下来解释下为什么两个数组比较大小是不能通过或者=来比较的。

因为在js中数组是对象,即使是相同的数组也会有不同的地址,所以返回的是false。

js数组和对象的区别

最后,既然说到数组是对象,那么来看下js数组和对象的区别。

两者都可以用来表示数据的集合:比如有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},然后你运行alert(a[1]),两种情况下的运行结果是相同的!这就是说,数据集合既可以用数组表示,也可以用对象表示,那么我到底该用哪一种呢?数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。

数组和对象的另一个区别是,数组的数据没有”名称”(name),对象的数据有”名称”(name)。很多编程语言中,都有一种叫做”关联数组”(associative array)的东西。这种数组中的数据是有名称的。

比如在javascript中,可以这样定义一个对象:

var a={“城市”:”北京”,”面积”:16800,”人口”:1600};

但是,也可以定义成一个关联数组:

a["城市"]=”北京”;
a["面积"]=16800;
a["人口"]=1600;

其实在Javascript中,关联数组就是对象,对象就是关联数组。这一点与php语言完全不同,在php中,关联数组也是数组。

比如运行下面这段javascript:

var a=[1,2,3,4];
a['foo']=’Hello World’;
alert(a.length);

最后的结果是4,也就是说,数组a的元素个数是4个。

但是,运行同样内容的php代码就不一样了:

< ? php
$a=array(1,2,3,4);
$a["foo"]=”Hello world”;
echo count($a);
? >

最后的结果是5,也就是说,数组a的元素个数是5个。

js注意点:数组比较大小方法及数组与对象的区别的更多相关文章

  1. console.log的一个应用 -----用new方法生成一个img对象和document.createElement方法创建一个img对象的区别

    我用两种方法来生成img对象,第一种方法是用new方法,第二种方法是用document.createElement方法. var img1 = new Image(); var img2 = docu ...

  2. 数组的filter方法处理数组内对象元素时,会改变原值

    arr = [{n:11},{n:22},{n:33}] arr.filter(v=>v.n=8) console.log(arr)  //  [{n:8},{n:8},{n:8}]

  3. java提高篇(十八)-----数组之一:认识JAVA数组

          噢,它明白了,河水既没有牛伯伯说的那么浅,也没有小松鼠说的那么深,只有自己亲自试过才知道!道听途说永远只能看到表明现象,只有亲自试过了,才知道它的深浅!!!!! 一.什么是数组      ...

  4. 18.数组(一)之认识java数组

    数组是一个简单的复合数据类型,它是一组有序数据的集合,它当中的每一个数据都具有相同的数据类型,我们通过数组名再加上一个不会越界的下标值来唯一确定数组中的元素. 还有就是,数组是一个特殊的对象. 不管在 ...

  5. 详解JS与Jquery获得的对象的区别与联系

    世上无难事只怕有心人,敲代码也一样只要你用心去搞懂一件事,即使一个小小的用法对你以后也会有很大的作用: 项目虽然赶得紧但是有些问题百度找完答案解决之后,也要自己梳理一遍做到心领神会!!!今天就直接来上 ...

  6. js 常用数组和字符串方法

    javascript数组与字符串常用方法总结 最近在梳理js的基础,首先从数组和字符串开始. string 常用方法: 1.substring(start开始位置的索引,end结束位置索引) 截取的位 ...

  7. 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型

    前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法6.操作方法 ...

  8. 比較JS合并数组的各种方法及其优劣

    原文链接:  Combining JS Arrays原文日期: 2014-09-09翻译日期: 2014-09-18翻译人员: 铁锚 本文属于JavaScript的基础技能. 我们将学习结合/合并两个 ...

  9. js巧用apply方法实现数组最值以及合并

    尽管js的apply方法在平常的使用中并不多见,但是在某些地方使用的还是很有帮助性的,这里就和大家说两个比较实用的例子:1.数组最大最小值 求数组中的最大最小值,js有相应的方法:Math.min() ...

随机推荐

  1. selenium操作浏览器cookies

    package test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; imp ...

  2. keycode简记表

    keycode值 实际含义 48到57 0到9 65到90 a到z(A到Z) 112到135 F1到F24 8 BackSpace(退格) 9 Tab 13 Enter(回车) 20 Caps_Loc ...

  3. ubuntu 切换到ROOT权限

    1.sudo+命令,输入当前用户密码后以root权限执行命令,有时间限制且仅限当前命令. 2.sudo -i,输入当前用户密码后以root权限登录shell,无时间限制.使用exit或logout退出 ...

  4. java支付宝接口开发

    在线支付接入支付宝,首先需要去官网申请开发者账号,具体步骤如下: 一.打开官网 1.直接打开链接https://open.alipay.com/platform/home.htm进入 2.百度搜索蚂蚁 ...

  5. .htaccess实现php网站伪静态

    伪静态是啥?很简单,就是假的静态网页...例如有个网页是:www.xxx.com/index.php?id=1这是动态网页,php后缀的如果改成:www.xxx.com/index-1.html那么这 ...

  6. U面经Prepare: Web Address

    题目是给你一堆域名,其中一些是另一些的parent,比如.com是.youku.com的parent,然后.youku.com是.service.youku.com的parent这样,然后再给你一个网 ...

  7. JDK8 HashMap--removeNode()移除节点方法

    /*删除节点*/ final Node<K,V> removeNode(int hash, Object key, Object value, boolean matchValue, bo ...

  8. mysql的执行过程

    1 总流程   https://www.cnblogs.com/annsshadow/p/5037667.html 2 优化器   https://www.cnblogs.com/olinux/p/5 ...

  9. package.json中 npm依赖包版本前的符号的意义

    版本的格式 major.minor.patch 主版本号.次版本号.修补版本号 ———————————————————— patch:修复bug,兼容老版本 minor:新增功能,兼容老版本 majo ...

  10. 【函数参数】什么是*args和**kwargs?

    **args表示任何多个无名参数,它是一个tuple,Python将**args从开始到结束作为一个tuple传入函数 **kwargs表示关键字参数,它是一个dict,Python将**kwargs ...