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

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. iOS中谓词的使用

    Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数.在cocoa ...

  2. Android短彩信源码解析-短信发送流程(二)

    转载请注明出处:http://blog.csdn.net/droyon/article/details/11699935 2,短彩信发送framework逻辑 短信在SmsSingleRecipien ...

  3. 【Oracle】SQL*Loader-522: lfiopn failed for file

    Linux下使用sqlldr进行批量操作,此操作会自动生成和删除临时文件. 因此,当前操作的用户必须具备对存放文件的文件夹有增删改的权限. 使用root登录,修改改文件夹权限为777即可. chmod ...

  4. Codeforces Round #315 (Div. 2B) 569B Inventory 贪心

    题目:Click here 题意:给你n,然后n个数,n个数中可能重复,可能不是1到n中的数.然后你用最少的改变数,让这个序列包含1到n所有数,并输出最后的序列. 分析:贪心. #include &l ...

  5. VS 2013上Python的配置

    最近有点不务正业,去看了下Python (主要是学校OJ有这个语言,然后可以轻松解决大数据问题,不要说我太坑~~~) 目前感觉python和matlab有些类似,缺少了变量类型声明,总感觉自己写出来的 ...

  6. BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏( dfs )

    因为是棵树 , 所以直接 dfs 就好了... ---------------------------------------------------------------------------- ...

  7. DE1-SOC的sof文件无法下载解决办法

    按照前面友晶科技的文档介绍一步步的做,后面发现根本无法下载sof文件. 通常思维: 一,器件选错了.器件选择错误会导致sof文件无法下载,至于这个ID具体怎么识别我没有追究.如果是这种错误Quartu ...

  8. Pathchirp—有效的带宽估计方法(二)

    上一个blog介绍了有效带宽估计方法:pathload.http://blog.csdn.net/ice110956/article/details/11126491. 做一个小小的总结:pathlo ...

  9. 自定义安装Apache+php+mysql网站服务器环境

    自定义安装Apache+php+mysql 这种方式是比较麻烦的安装方式,需要具有一定的对Apache了解的基础上才能安装,安装顺序就是先安装Apache软件,然后安装php,最后安装mysql.这里 ...

  10. Dockerfile指令总结

    指令的一般格式为INSTRUCTION arguments,指令包含FROM.MAINTAINER.RUN等. FROM 格式为FROM <image>或FROM <image> ...