有一段时间不更新博客了,今天分享给大家的是一篇关于JS数组的,数组其实比较简单,但是用法非常灵活,在工作学习中应该多学,多用,这样才能领会数组的真谛。

以下知识主要参考《JS 精粹》和《JavaScript 高级程序设计》。



数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素。JavaScript 没有像此类数组一样的数据结构。

它提供了一些类数组特性的对象,它把数组的下标转变为字符串,用其作为属性。

ECMAScript和其他语言中的数组的区别:

  • ECMAScript 数组中的每一项可以保存任何类型的数据
  • ECMAScript 数组的大小是可以动态调整的

创建数组的方式:

var arr  = new Array();
var arr1 =[]; // 创建两个空数组

一个有趣的属性 length

每个数组都有一个 length 属性。JavaScript 数组的 length 是没有上界的。

length 属性的值是这个数组最大整数属性名加上1.它不一定等于数组里的属性的个数

var arr = [];
arr.length; // arr[100] = true;
arr.length; //
// arr只包含一个属性

length值不是只读的,可以设定length的值。

设置更大的length不会给数组分配更多的空间。

而把length 设小将导致所有下标大于等于新length 的属性被删除。

删除一个元素

JavaScript 数组就是对象,可以使用 delete 运算符删除数组中的元素。

delete numbers[2];
// numbers 是 ['zero','one',undefined,'three']

被删除的元素变成undefined。并不会将后面的元素依次前移。

数组的检测

对于一个网页或一个全局作用域而言,使用 instanceof 操作符就能得到满意的结果。

if (value instanceof Array) {
// do sth with array
}

如果实际中有两个全局环境的话,就存在两个不同版本的Array 构造函数,如果你从一个框架向另一个框架传入一个数组,

那么传入的数组与第二个框架中原生创建的数组分别具有各自不同的构造函数。

为了解决这个问题,ECMAScript 5 新增了Array.isArray() 方法。

if (Array.isArray(value)) {
// do sth with array
}

转换方法(以下方法不做举例,请参考API)

所有对象都具有 toString()、valueOf()方法。

toString() 方法返回的是由数组每个值的字符串形式拼接而成的一个以逗号分隔的字符串。

valueOf() 返回的还是数组。

Array.join() 方法返回以参数为分隔的字符串。

栈方法

数组可以表现的像栈一样,栈是一种LIFO的数据结构,JS数组提供的方法是 push() 和pop()

push() 方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度。

pop() 方法则从数组的末尾移除最后一项,减少数组的 length 值,然后返回移除的项。

队列方法

队列数据结构的访问规则是FIFO,队列在列表的末端添加项,从列表的前端移除项。

push() 方法想数组末端添加项。

shift() 从数组前端取得项,同时length 减1.

unshift() 从数组的前端添加任意项,并返回新数组的长度,因此可以使用unshift() 方法和pop() 方法从相反的方向实现队列。

重排序方法

reverse() 反转数组项的顺序。 这个方法的作用直观明了,但不够灵活。

sort() 方法默认按升序排列数组项,它会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。

即使数组中的每一项都是数组,sort() 方法比较的也是字符串。

该方法可以接受一个比较函数作为参数,sort 可以按照比较函数给定的规则对数组进行排序。

这两个方法的返回值都是经过排序后的数组。

操作方法

concat() 方法可以基于当前对象的所有项创建一个新的数组,接收的参数添加到新数组的末尾。

参数如果是数据项,则直接添加到末尾,如果是数组,则将数组的每一项添加到末尾。

slice() 该方法基于当前数组中的一个或多个项创建一个新数组。该方法可以接收一个或两个参数,即要返回项的起始和结束位置。

在只有一个参数的情况下,slice() 方法返回参数指定位置到当前数组末尾的所有项。

如果有两个参数,则返回起始和结束位置之间的项,但不包括结束位置的项。

如果参数中有一个负数,则用数组长度加上该数来确定响应的位置。

splice() 这个方法是最强大的数组方法。它的最主要用途是向数组的中部插入项。

  • 删除: 可以删除任意数量的项,只需指定2个参数;要删除的第一项的位置和要删除的项数。
  • 插入: 可以向指定位置插入任意数量的项,只需提供三个参数:起始位置、0(要删除的项数)和要插入的项。如果要插入多个项,可以传入第四,第五。。个参数。
  • 替换: 可以向指定位置插入任意数量的项,三个参数,起始位置、要删除的项数和要插入的任意数量的项。插入的项不必和删除的项数相等。

位置方法

indexOf() 和 lastIndexOf() 两个方法都接收两个参数:要查找的项和(可选)表示查找起点位置的索引。

两个方法都返回要查找的项的位置,没有为-1.在查找的过程中,使用的是全等操作符(===)。

其中indexOf() 方法从数组的开头向后查找,lastIndexOf() 方法则从数组的末尾向前查找。

迭代方法

every() 对数组中每一项运行给定函数,如果该函数对每一项都返回true,则返回true

filter() 对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组

foreach() 对数组中的每一项运行给定的函数,这个函数没有返回值

map() 对数组中的每一项运行给定的函数,返回每次调用函数返回的结果组成的数组

some() 对数组汇总的每一项运行给定的函数,如果函数对任一项返回true,则返回true

归并方法

reduce() 和reduceRight() 都会迭代数组的所有项,然后构建一个最终返回的值,

其中reduce() 方法从数组的第一项开始逐个遍历到最后。

而 reduceRight() 则从数组的最后一项开始,向前遍历到第一项。

这两个方法接收两个参数,一个在每一项上调用的函数和(可选的)最为归并基础的初始值。

传给reduce* () 的函数接收四个参数:前一个值,当前值,项的索引,和数组对象。

这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,

因此第一个参数是数组的第一项,第二个参数就是数组的第二项。

深入浅出 JavaScript 数组 v0.5的更多相关文章

  1. 深入浅出 JavaScript 对象 v0.5

    JavaScript 没有类的概念,因此它的对象与基于类的语言中的对象有所不同.笔者主要参考<JS 高级程序设计>.<JS 权威指南>和<JS 精粹> 本文由浅入深 ...

  2. 深入浅出 JavaScript 关键词 -- this

    深入浅出 JavaScript 关键词 -- this 要说 JavaScript 这门语言最容易让人困惑的知识点,this 关键词肯定算一个.JavaScript 语言面世多年,一直在进化完善,现在 ...

  3. JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布

    JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布   研究了一年多的js,也差不多写一个自己的js库了.我写这个不算框架,只是一个小型的js工具 ...

  4. Javascript数组操作

    使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间:思虑下,堪能如此继续之?当狠心深学下方是正道. 原文链接 ...

  5. Javascript数组操作(转)

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  6. JavaScript 数组

    JavaScript 数组 简介:数组是值的有序集合,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改. 一:创建数组 ...

  7. 也谈面试必备问题之 JavaScript 数组去重

    Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...

  8. js 判断数组包含某值的方法 和 javascript数组扩展indexOf()方法

    var  questionId = []; var anSwerIdValue = []; ////javascript数组扩展indexOf()方法 Array.prototype.indexOf ...

  9. JavaScript 数组 length 属性获取数组长度或设置数组元素的数目

    JavaScript 数组 length 属性 JavaScript 数组 length 属性可返回或设置或组中元素的数目,语法如下: array_object.length 利用 length 属性 ...

随机推荐

  1. Scroll文字滚动js

    function ScrollImgLeft(){ var speed=50, doc=document, scroll_begin = doc.getElementById("scroll ...

  2. spoj 42

    简单题   水水~~ /************************************************************************* > Author: x ...

  3. JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar

  4. Armitage主屏幕说明与命令行启动

    (1)我们将Armitage主屏幕标注为A.B和C A:该区域显示预配置的模块.您可以在模块列表下面的文本框中输入要查找的模块进行查找. B:该区域显示我们可以进行漏洞测试的活跃主机. C:该区域显示 ...

  5. JDK个目录,以及与环境变量的关系

    最近学习过程中老是看JDK里面的东西,可每次都翻书找,找了又忘.JDK,我们今天来个了断吧........ 一:bin: JDK中所包含的开发工具的可执行文件,PATH环境变量应该包含一个指向此目录的 ...

  6. ios 应用剖析

    在创建HelloWorld的过程中,生成了很多文件(展开Xcode左边的项目导航视图可以看到,如图2-8所示),它们各自的作用是什么?彼此间又是怎样的一种关系呢? 图2-8 项目导航视图 如图2-8所 ...

  7. BIRT使用1:简介、概念、元素、报表设计器组成

    前一篇博客对birt进行了一个初探,相信通过上篇博客大家对birt有个初步认识,接下来我们随着下面这张思维导图的展示,进入birt的使用学习. 这一篇博客是第一部分,主要介绍一下birt的简介.概念. ...

  8. 函数重载二义性:error C2668: 'pow' : ambiguous call to overloaded function

    2013-07-08 14:42:45 当使用的函数时重载函数时,若编译器不能判断出是哪个函数,就会出现二义性,并给出报错信息. 问题描述: 在.cpp代码中用到pow函数,如下: long int ...

  9. mysql 更新唯一主键列 被堵塞

    mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEAT ...

  10. 用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收

    消费者:接收消息 逻辑:创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息 <?php /********* ...