有一段时间不更新博客了,今天分享给大家的是一篇关于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. mybatis include标签

    使用mybatis 的include标签达到SQL片段达到代码复用的目的 示例: xml文件 <sql id="paysql"> payid,p.oid,p.bdate ...

  2. Hibernate 缓存机制二(转)

    感谢:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是一个 ...

  3. spoj 178

    输出相邻的点   比较简单吧....... #include <cstdio> #include <cstring> using namespace std; int main ...

  4. KafkaSpout分析:配置

    public KafkaSpout(SpoutConfig spoutConf) { _spoutConfig = spoutConf;} 基于0.93版本的Storm SpoutConfig继承自K ...

  5. Injection Attacks-Log 注入

    日志注入(也称日志文件注入) 很多应用都维护着一系列面向授权用户.通过 HTML 界面展示的日志,因而成为了攻击者的首要目标,这些攻击者试图伪装其他攻击.误导日志读者,甚至对阅读和分析日志监测应用的用 ...

  6. 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

    1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...

  7. poj 3440 Coin Toss 概率问题

    这题主要是推导数学公式!!! 将概率问题转化为圆心所在的面积! 代码如下: #include<iostream> #include<stdio.h> #include<a ...

  8. Android 调用系统的拍相程序进行录像

    xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  9. Android ListView相关 头和尾 headView footerView

    ListView还可以添加头和尾部,而这头和尾就是View对象, 可以使用listView.addHeadView(view)方法和listView.addFootView(view)方法分别添加头和 ...

  10. HTTPS访问:weblogic下配置SSL

    进入Weblogic安装路径下的JDK安装目录bin文件下,通过keytool工具生成密钥对(标识密钥库) 输入命令,生成密钥 keytool.exe -genkey -v -alias weblog ...