数组在任何编程语言中都是非常重要的,因为函数在最大程度上代表了要实现的功能,而数组则是这些函数所要操作的内存一部分。

1 构建数组

js与其他非脚本语言的灵活之处在于要实现一个目标它可能具有多种方式,如数组的定义有2中,对象的定义一般也有2中,而类却又多种,花样很多,目的呢都是为了节省内存,适合不同应用场景

1)使用构造函数

var arr=new Array();

2)使用字面量

var arr=[];

2 检测数组类型

在前面我们已经有了非引用的typeof,其应用于所有类型,属于广谱类型检测,再则就是instanceof属于对象类型检测,局部类型检测,也有特殊的检测如isNaN,对于Array而言也可以使用instanceof,

但是对于多框架的页面就可能存在问题(原因我也不知道,书上这样说的,具体还没碰到),所以呢就像isNaN一样采用Array.isArray()函数进行稳妥检测,与isNaN不同的是isArray是属于Array的静态函数

而isNaN则是window的函数

3 转换

数组的toString()方法:其实现过程为调用每个元素的toString()方法然后使用','连接起来得到的字符串,也可以在toString()中使用连接符参数比如:toString('||')

数组的toLocalString()方法:与toString()方法同理

数组的valueof()方法:与toString()方法同理

4 将数组作为栈使用

栈的概念即先进后出 ,后进先出,array提供push,pop两个方法来支持这种数据结构的操作

5 将数组作为队列使用

shift函数:将数组中第一个元素取出,并长度减一,非常简单实现先进先出

unshift函数:反向的向第一个位置插入一个或多个元素,因此可以和pop配合实现反向队列

6 数组排序

数组排序方法sort():数组默认排序原理,先将数组项转换为字符串,再将字符串进行比较,所以这种默认的字符串比较来排序是基本上得不到正确结果的;

数组提供sort和reverse方法,从字面上很好理解2个方法的功能。

sort支持自定义比较,即sort()可以传递一个函数,该函数接收2个形式参数,默认的比较是按照升序排列,即从小到大,那么具体怎么比较呢

如果前面小于后面返回-1,如果相等返回0,在这里接受返回1时前面的value1放后面,即升序情况下谁小谁前面,相应的返回-1

特殊情况:对于数组项全是数值型的可以直接使用相减运算;

7 数组查询

查询数组中存在某项,数组提供indexof和lastindexof;其原理:将要查找的目标与数组项挨个做全等判断,这里比较严格,必须全等,如果找到则返回该项所在的数组下标,没有找到返回-1,相应的lastindexof则从后面向前面反向查找;

8 数组迭代

数组迭代提供类似与c#中lamda表达式对Ilist迭代方法,这些迭代方法的函数表达式均接受3个参数,分别为item,项本身,index项所在的位置下标,array即该数组

即函数为:function(item,index,array){};

every():即每一个函数运行结果均返回true,最终才为true,

every(function(item,index,array){

//一些操作

return true;

})

filter:即返回true哪些项从新组成一个数组;目的就是要过滤哪些项满足条件;

foreach():该函数没有返回值,即每个项只需执行函数即可

map():即每个项运行该函数,将运行的结果组成一个数组作为返回值,相当于对一个数组进行加工得到一个新数组;

some():即每个项运行该函数,任意一个函数返回true,则返回true,相当于只要任意一个数组项满足条件,则意味着该数组就满足条件

9 数组管理

数组管理提供3个高级方法,分别是concat,slice,splice;

concat:用于构建新的数组,接收n个参数,这些参数可以是任意类型,因为数组本身可以存放任意类型,然后组成1个新的数组;

其基本原理:先将数组进行复制一份,如果没有任何参数,则是将原有数组复制一份得到新数组,如果是有参数则将参数在新数组后面依次插入;

slice:该方法用于在原有数组中取出数组项构建新的数组,该方法提供2个参数,即起始位置,和终止位置,如果不传递参数也就是将原有数组复制一份,但是有个特殊之处,slice有2个参数的时候并不会包含终止位置

的数组项;

splice:主要用于向数组中插入元素,附带的可以实现数组的替换,项的删除;该方法提供3个参数:起始位置,删除项数量,插入的项(其实这个地方可以是n个,只是说第三个参数后面可以跟n个参数,但是功能都一样)。splice跟前面concat和slice方法不同的是不会创建新的数组副本而是直接在原有数组基础上操作。

1)删除功能:一般来说只有2个参数情况下

splice(0,2):理解为从0位置开始,删除2个数组项;

2)插入功能:3个以上的参数

splice(2,0,‘red’,‘green’):理解为从下标为2的位置开始,删除0个数组项,插入2个字符串;

3)替换功能:3个参数

splice(2,2,‘red’,‘green’,‘blue’):理解为从下标为2的位置开始,删除2个数组项,然后在插入3个元素

10 数组加工

reduce和reduceRight方法,该2个方法不同点在于顺序相反,reduce是从左自右对数组进行迭代,reduceRight则是从右自左迭代,2个方法可以传递一个可选的函数作为参数;

其中函数有4个参数,function(pre,cur,index,array)

pre:前一次迭代的返回值

cur:当前迭代的数组项值

index:当前迭代的数组项的位置

array:数组本身

js中的数组很强大,高级方法也很多,参数也很灵活,所以也是不太好记住的地方

重操JS旧业第三弹:Array的更多相关文章

  1. 重操JS旧业第十一弹:BOM对象

    BOM对象即浏览器内置对象,现今流行的浏览器内核有Safri,Firefox,Chrome,Opera,IE其中IE的兼容性是最蛋疼的在10及其过后还好点,但是现在IE基本上淘汰,而国内像360这种垃 ...

  2. 重操JS旧业第十弹:闭包

    闭包是js最难理解,也是最蛋疼的一个名词,仿佛只可意会不可言传一样,有人说闭包说白了就是函数嵌套,也有人说闭包就是函数能够访问函数外部的变量,而内部的外部访问不了: 貌似都非常有道理,其实仔细想来只不 ...

  3. 重操JS旧业第八弹:面向对象与继承

    js里面没有语言语法层面的继承机制,但这并不意味着js就不能实现继承,利用js属性和方法动态性来模拟实现继承,通过总结大概有如下方法实现: 1 原型链继承 我们知道原型在对象中扮演着重要的角色,函数本 ...

  4. 重操JS旧业第七弹:面向对象与对象创建

    JS是一种完全面向对象的程序设计语言,在面向对象处理方面,具有多种多样的实现方式,加之对象成员的动态性使得这门语言更加灵活:而js对象成员动态性也是创建和扩展对象的有力方式. 1 对象成员动态性 属性 ...

  5. 重操JS旧业第六弹:基本类型包装

    在前面已经知道js中的类型有boolean,string,number,undefined,function,object,其中boolean,number,string为值类型.所谓的基本类型包装, ...

  6. 重操JS旧业第五弹:函数

    函数在任何编程语言中起着非常重要的位置,因为他是功能的最小单元,在js中函数是一种类型 Function 1 申明与定义 显示声明:function cc(){};函数名其实是函数的一个指针,函数名某 ...

  7. 重操JS旧业第四弹:Date与Global对象

    1 Date原理 Date类型表示时间,js中采用UTC国际协调时间,以1971年1月1日0分0秒0微秒开始,经过的毫秒数来表示时间,比如一年的时间计算 1分:1000*60: 1小时:1000(毫秒 ...

  8. 重操JS旧业第二弹:数据类型与类型转换

    一 数据类型 1 js中的数据类型 1.1 数据类型列举 1)number类型 2)boolean类型 3)string类型 4)对象类型 5)函数类型 6)undefined类型 1.2 数据类型获 ...

  9. 重操JS旧业第九弹:函数表达式

    函数表达式,什么概念,表达式中的函数表达式. 1 函数申明 function 函数名([函数参数]){ //函数体 } js中无论像这样的显示函数什么放在调用之前还是调用之后,都不影响使用,因为js解 ...

随机推荐

  1. android -- 蓝牙 bluetooth (一) 入门

    前段时间在 网上看了一些关于android蓝牙的文章,发现大部分是基于老版本(4.1以前含4.1)的源码,虽然无碍了解蓝牙的基本原理和工作流程,但对着4.2.2的代码看起来总是有些遗憾.所以针对4.2 ...

  2. mac 下搭建 Android 开发环境

    因工作需要,要在mac 下搭建 Android 开发环境.谷歌.度娘了好久,没有找个一个完整又系统的方法,很是苦恼.最终,皇天不负有心人,找到了下面这篇文档,结合亲身体验,特此记录.也为有这方面需求的 ...

  3. 驱动: oops

    linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id= ...

  4. HDU2527:Safe Or Unsafe(哈弗曼树)

    Problem Description Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一样的!并且当 ...

  5. java排序方法中的插入排序方法

    插入排序方法就是:将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据. package Array; //插入排序方法 import java.until.Scanner; ...

  6. C# struct 性能损失

    虽然结构是值类型,但在语法上常常可以把它们当作类来处理.例如,在上面的 Dimensions 类的定义中,可以编写下面的代码:Dimensions point = new Dimensions();p ...

  7. 在VC6.0中能不能使用Duilib界面库呢?

    Duilib库的源代码是在vs2010下编译的,一般适用于vs2008及以上的版本开发使用,那么duilib能不能在vc6.0的工程中使用呢?如何在vc6.0中使用duilib库呢? 今天,由于工作要 ...

  8. wget -r -nc -np "http://www.zhihu.com/"

    下载网站所有 -r,  --recursive          specify recursive download. -nc, --no-clobber              skip dow ...

  9. hdu 1528 Card Game Cheater ( 二分图匹配 )

    题目:点击打开链接 题意:两个人纸牌游戏,牌大的人得分.牌大:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < ...

  10. ReviewBoard安装和配置札记

    眼下部门还没有採用Pair Programming那种时时刻刻都在review代码的工作方式,代码Review多採用走查方式,即代码写完后召开一个Code Review的Meeting,集中时间和经验 ...