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

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. ZIOZIA_百度百科

    ZIOZIA_百度百科 ZIOZIA

  2. android动效开篇

    大神博客:http://blog.csdn.net/tianjian4592/article/details/44155147 在现在的Android App开发中,动效越来越受到产品和设计师同学的重 ...

  3. css中的定位

    上一篇博客,我大概介绍了下浮动的使用及行为.其实在整个文档布局中,定位也对我们整个的页面排版有非常好的帮助,当然前提是使用得当. 一.定位分类: a.静态定位  position:static;   ...

  4. USACO Preface Numbering 构造

    一开始看到这道题目的时候,感觉好难 还要算出罗马的规则. 但是仔细一看,数据规模很小, n 只给到3500 看完题目给出了几组样例之后就有感觉了 解题方法就是: n的每个十进制数 转换成相应的罗马数字 ...

  5. HDU 3925 Substring 【大数相减】

    题目意思是,给你提供两个数字 a 和 b a 可以不断的往上加, 直到b 为其子串 问的是 a 最小加几? 显而易见,a  的数据范围给了10 ^100非常大,直接模拟肯定不行 那么就用 b 减去 a ...

  6. (Problem 6)Sum square difference

    Hence the difference between the sum of the squares of the first ten natural numbers and the square ...

  7. Android HttpClient HttpURLConnection相关介绍

    Android HttpClient HttpURLConnection相关介绍 遇到一个问题 在android studio上用HttpClient编写网络访问代码的时候,发现该类无法导入并使用.. ...

  8. Python函数式编程:内置函数map()使用说明

    一.概述 map操作是函数式编程中的重要技术之一,其作用就是对一个集合中的每个元素做处理,生成一个新的元素,由这些新的元素组成一个新的集合的返回. 所以map操作后,产生的新集合的元素个数和原集合的元 ...

  9. Chapter 17 Replication 复制

    Chapter 17 Replication 复制 Table of Contents 17.1 Replication Configuration 17.2 Replication Implemen ...

  10. Hadoop实战实例

    Hadoop实战实例        Hadoop实战实例        Hadoop 是Google MapReduce的一个Java实现.MapReduce是一种简化的分布式编程模式,让程序自动分布 ...