有一段时间不更新博客了,今天分享给大家的是一篇关于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. PAT-乙级-1006. 换个格式输出整数 (15)

    1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...

  2. 转Spring+Hibernate+EHcache配置(三)

    配置每一项的详细作用不再详细解释,有兴趣的请google下 ,这里需要注意一点defaultCache标签定义了一个默认的Cache,这个Cache是不能删除的,否则会抛出No default cac ...

  3. sqlmap文件在tomcat7中运行报错原因及<![CDATA[ ]]>

    sqlmap在eclipse中运行,好好的.放到tomcat7中抛出如下异常: Caused by: java.lang.RuntimeException: Error occurred. Cause ...

  4. python参考手册--第8章

    1.模块和import (1)首次import module会做以下3件事: a)创建新的命名空间,用作在该源文件中定义的所有对象的容器.在模块中定义的函数和方法在使用global语句时将访问该命名空 ...

  5. C++ 嵌套类使用(一)

    一.嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型.之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的 ...

  6. Nginx开启Gzip压缩大幅提高页面加载速度(转)

    转自:http://www.cnblogs.com/mitang/p/4477220.html 刚刚给博客加了一个500px相册插件,lightbox引入了很多js文件和css文件,页面一下子看起来非 ...

  7. 简单的神经元算法实现(python)

    参考python代码如下 #perceptron x=[[1 ,0, 0],[1,0,1],[1, 1, 0],[1, 1, 1],[0,0,1],[0,1,0],[0,1,1],[0,0,0]] y ...

  8. java socket nio编程

    上次写了一个socket的基本编程,但是有个问题,阻塞特别严重,于是小编便去找了nio学习了一下... public class TimeServer { public static void mai ...

  9. Java版本的删除指定目录及子目录下名叫“xxx.txt”的所有文件

    以前写过一个python版本的,但是在查找文件路径的时候出现错误,无法正确的获取到文件的路径,就造成无法删除该路径下的“xxx.txt”文件. 当时以为是windows版本系统的错误造成这个问题的,也 ...

  10. ubuntu查看命令

    以非root用户更新系统 sudo: sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用 ...