JavaScript之数组(Array)详解


Posted in Javascript onApril 01, 2015

ECMAScript的数组与其他语言中的数组有着相当大的区别。虽然ECMAScript中的数组也是有序列表,但是它数组你的每一项可以保存任何类型的数据。ECMAScript数组的大小是可以动态调整的。
    创建数组的基本方式有两种。第一种是使用Array构造函数,如下所示:

var colors = new Array();

    如果知道数组要保存的项目数量,也可以给构造函数传递参数,而该参数会自动变成length属性的值,如下:
var colors = new Array(20);

    也可以向Array构造函数中传递数组中应包含的项,如下代码所示:
var colors = new Array("red","blue");

    另外,使用Array构造函数时也可以省略new操作符,如下所示:
var colors = Array(20);

    创建数组的第二种方式是使用数组字面量表示法。数组字面量由一对包含数组项的方括号表示,多个数组项之间用逗号隔开,如下所示:
var color = ["red","blue"];

var names = [];

var values = [1,2,]//IE8及之前3项,其他2项,不建议使用

    与对象一样,在使用数字字面量表示法时,也不会调用Array的构造函数。
   在读取和设置数组的值时,要使用方括号并提供相应值的基于0的数字索引,如下所示:
var colors = ["red","blue"]; //定义数组

alert(colors[0]); //red

colors[1] = "black" //修改第2项

colors[2] = "brown" //新增第3

    数组的项数保存在其length属性中,这个属性始终会返回0或更大的数字,如下所示:
var colors = ["red","blue"]; //定义数组

var names=[];

alert(colors.length);        //3

alert(names.length)          //0

    值得注意的是,数组的length值不是只读的。因此,通过设置此值,可以从数组的末尾移出项或向数组添加项,如下:
var colors = ["red","blue"];

colors.length = 1;

alert(colors[1]); //undefined

    利用length属性也可以方便的向数组末尾添加数据:
var colors = ["red","blue"];

colors[colors.length] = "black"; //在位置2新增

colors[colors.length] = "brown"; //在位置3新增

1、检测数组

    对于一个网页或一个全局作用域而言,使用instanceof操作符可以做到:

if(value instanceof Array){
// 执行操作

}

    instanceof操作符局限性在于全局作用域,如果网页包含多个框架,就存在两个以上的全局执行环境。为了解决这个问题,ECMAScript5新增了Array.isArray()方法,使用如下:
if(Array.isArray(value)){

    // 执行操作

}

2、转化方法
    调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而调用valueOf()返回还是数组。如下所示:

var colors = ['red', 'blue', 'green'];

alert(colors.toString()); //red,blue,green

alert(colors.valueOf()); //red,blue,green

alert(colors)            //red,blue,green

    数组继承的toLocalString()、tiString()和valueOf()方法,在默认情况下都会以逗号分隔符的字符串形式返回数组项。而如果使用join()方法,则可以使用不同的分隔符来构建这个字符串。join()方法只接受一个参数,即用作分隔符的字符串,如下所示:
var colors = ['red', 'blue', 'green'];

alert(colors.join(',')); //red,blue,green

alert(colors.join('|')); //red|blue|green

    如果数组中的某一项值为null或者undefied,那么该值在join()、toLocalString()、tiString()和valueOf()方法返回结果以空字符串表示。

3、栈方法

Javascript专门为数组提供了push()和pop()操作,以便实现类似栈的行为。

push()方法可以接收任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度。pop()方法则从数组末尾溢出最后一项,减少数组的length值,然后返回移出的项。

var colors = new Array(); //定义数组

var count = colors.push("red", "blue"); //压入两项

alert(count); //2

count = colors.push("black"); //压入另一项

alert(count); //3

var item = colors.pop(); //弹出最后一项

alert(item); //"black"

alert(colors.length); //2

4、队列方法

栈数据结构的访问规则是LIFO(后进先出),而队列的访问规则是FIFO(先进先出)。队列在列表末端添加项,在前端移出项。

shift()方法能够移除数组中的第一项,并返回该项,数组的length-1。结合push()和shift()方法,可以像使用队列一样使用数组,如下所示:

var colors = new Array();

var count = colors.push("red", "blue");

count = colors.push("black");

alert(count);

var item = colors.shift(); //取得第一项

alert(item); //"red"

alert(color.length); //2

 ECMAScript还为数组提供了unshift()方法。unshift()和shift()方法用途相反:它在数组前端添加任意个项并返回新数组的长度。因此,同时使用unshift()和shift()方法,可以从相反方向来模拟队列,即在数组前端添加新项,从数组末端移出项,如下所示:
 

 var colors = new Array();

var count = colors.push("red", "green");

alert(count); //2

count = colors.unshift("black"); //推入另一项

alert(count); //3

var item = colors.pop(); //取得最后一项

alert(item) //green

alert(colors.length) //2

 

 5、重排序方法
    数组中已经存在两个可以直接用来重排序的方法:reverse()和sort()。reverse()方法会按照反转数组项的排序。

var values = [2, 1, 3, 4, 5];

values.reverse();

alert(values); //5,4,3,2,1

    默认情况下,sort()方法按照升序排列数组项,调用每一项的toString()方法,比较字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的都是字符串。
 
var values = [12, 11, 3, 4, 5];

values.sort();

alert(values); //12,11,3,4,5

    我们可以通过一个比较函数当作参数传递给sort()方法。如下:
function compare(value1, value2) {

    if (value1 < value2) {

        return -1

    } else if (value1 > value2) {

        return 1

    } else {

        return 0

    }

}

var values = [0, 1, 5, 10, 15];

values.sort(compare);

alert(values);    //0,1,5,10,15 

6、操作方法
    ECMAScript为操作在数组中提供了很多方法。其中,concat()方法可以基于当前数组中的所有项创建一个新数组。

var colors = ["red", "green", "blue"];

var colors2 = colors.concat("yellow", ["black", "brown"]);

alert(colors); //red,green,blue

alert(colors2); //red,green,blue,yellow,black,brown

    slice()方法,它能够基于当前数组的一个项或多个项创建新数组,它可以接收一个或两个参数,即要返回项的起始和结束位置。一个参数时,返回该参数指定位置开始到当前数组末尾的所有项。两个参数则返回起始到指定位置的所有项——不包括结束位置的项。注意,slipe()方法不影响原始数组。
var colors=["red","green","blue","black","brown"];

var colors2=colors.slice(1);

var colors3=colors.slice(1,4);

alert(colors2); //green,blue,black,brown

alert(colors3); //green,blue,black

    slice()方法删除:可以删除任意数量的项,只需指定2个参数:要删除的第一项的位置和要删除的项数。
    slice()方法插入:可以向指定位置插入任意数量的项,只需提供3个参数:起始位置、0(要删除的项数)和要插入的项。
    slipe()方法替换:可以项指定位置插入任意数量的项,且同时删除任意数量的项,只需指定3个参数:起始位置、要删除的项数和要插入的任意数量的项。
var colors = ["red", "green", "blue"];

//删除

var removed = colors.slice(0, 1); //删除第1项

var colors3 = colors.slice(1, 4);

alert(colors); //green,blue

alert(removed); //red

//插入

removed = colors.slice(1, 0,"yellow","orange"); //从位置1开始插入

alert(colors); //green,yellow,orange,blue

alert(removed); //空数组

//替换

removed = colors.slice(1, 1,"red","purple"); //从位置1开始插入

alert(colors); //green,"red","purple",orange,blue

alert(removed); //"yellow"

7、位置方法
    ECMAScript5为数组提供了两个位置方法:indexOf()和lastIndexOf()。这两个方法都接收两个参数:要查找的项和表示查找起点位置的索引(可选)。其中indexOf()方法从数组的开头开始先后查找,lastIndexOf()方法则从数组的末尾开始向前查找。
    这两个方法都返回要查找的项在数组中的位置,在没有找到的情况下返回-1。

var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];

alert(numbers.indexOf(4)) //3

alert(numbers.lastIndexOf(4)) //5

alert(numbers.indexOf(4, 4)) //5

alert(numbers.lastIndexOf(4, 4)) //3

8、迭代方法

ECMAScript5为数组定义了5个迭代方法。每个方法都接受两个参数,第一个是进行迭代的函数,第二个是该函数的作用域对象【可选】。

进行迭代的函数接受三个参数,第一个是数组中要进行迭代的元素的值,第二个是数组候总要进行迭代的元素的位置,第三个是迭代数组本身。

    1. every()      对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true    
 2. filter()       对数组中的每一项运行给定的函数,返回该函数返回true的项组成的数组。    
 3. forEach()  对数组中的每一项运行给定的函数,这个方法没有返回值    4. map()       对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组
    5. some()     对数组中的每一项运行给定的函数,如果该函数对任意一项返回true,则返回true
    这些迭代方法支持的浏览器有,IE9+,Firefox2+,Safari3+,Opera 9.5+,chrome
    在这些方法中,最相似的是every()和some(),它们都是用于查询数组中的项是否满足某个条件。对every()来说,传入的函数必须对每一项都返回true,这个方法才返回true;否则,他就返回false。而some()方法则是只要传入的函数对数组中某一项返回true,就返回true。

var num = [1,2,3,4,5,6,7,8,9];

var everyResult = num.every(function(item, index, array) {

    if(item > 2) {

        return true;

    }

});

alert(everyResult); //false

var someResult = num.some(function(item) {

    if(item > 2) {

        return true;

    }

});

alert(someResult); //true

    filter()是利用指定的函数确定是否在返回的数组中包含某一项。

var num = [1,2,3,4,5,4,3,2,1];

var filterResult = num.filter(function(item) {

    if(item > 2) {

        return true;

    }

});

alert(filterResult);  //[3,4,5,4,3]

  map()也返回一个数组,而这个数组的每一项都是在原始数组中的对应项上运行传入函数的结果。
 

  var num = [1,2,3,4,5,4,3,2,1];

var mapResult = num.map(function(item) {

    if(item > 2) {

        return true;

    }

}); //[2,3,6,8,10,8,6,4,2]

 

   forEach()是对数组中的每一项运行传入的函数。这个方法没有返回值,本质上与使用for循环迭代数组一样。

var num = [1,2,3,4,5,4,3,2,1];

num.forEach(function(item) {

  // 执行操作

});

9、归并方法

ECMAScript5中新增了两个方法:reduceRight() 和 reduce()。这两个方法都接受两个参数:第一个是用来迭代的数组的函数,这个函数有四个参数分别是,前一个值,当前值,项的索引,数组对象。然而这个函数的任何值都会作为第一个参数自动传给下一项。第二个是作为第一个函数中第一个参数的初始值 。

var nums = [1,2,3,4,5];

var sum = nums.reduce(function(prev, cur, index, array) {

    return prev + cur;

});

alert(sum);//15
Javascript 相关文章推荐
JavaScript Undefined,Null类型和NaN值区别
Oct 22 Javascript
jQuery 性能优化指南(3)
May 21 Javascript
js最简单的拖拽效果实现代码
Sep 24 Javascript
javascript中直接写php代码的方法
Jul 31 Javascript
JavaScript Math 对象常用方法总结
Apr 28 Javascript
简单的JS轮播图代码
Jul 18 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
详解Vue.js分发之作用域槽
Jun 13 Javascript
vue.js单文件组件中非父子组件的传值实例
Sep 13 Javascript
js+css实现全屏侧边栏
Jun 16 Javascript
vue中实现点击变成全屏的多种方法
Sep 27 Javascript
如何利用JavaScript编写一个格斗小游戏
Jan 06 Javascript
JavaScript数据类型详解
Apr 01 #Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
Apr 01 #Javascript
JavaScript判断是否为数组的3种方法及效率比较
Apr 01 #Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
Apr 01 #Javascript
JavaScript判断是否为数字的4种方法及效率比较
Apr 01 #Javascript
JavaScript操作DOM元素的childNodes和children区别
Apr 01 #Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
Mar 31 #Javascript
You might like
在线竞拍系统的PHP实现框架(一)
2006/10/09 PHP
COM in PHP (winows only)
2006/10/09 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
重载toString实现JS HashMap分析
2011/03/13 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
python写入中英文字符串到文件的方法
2015/05/06 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
python实现密码强度校验
2020/03/18 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
Python自动创建Excel并获取内容
2020/09/16 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
Linux开机引导的步骤是什么
2014/02/26 面试题
自我鉴定范文200字
2013/10/02 职场文书
数控技术应届生求职信
2013/11/13 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
中秋节随笔
2015/08/15 职场文书
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js