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 避免闭包引发的问题
Mar 17 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
Nov 20 Javascript
Jquery实现图片预加载与延时加载的方法
Dec 22 Javascript
jquery实现鼠标滑过显示提示框的方法
Feb 05 Javascript
vue2滚动条加载更多数据实现代码
Jan 10 Javascript
Vue.js父与子组件之间传参示例
Feb 28 Javascript
javascript中如何判断类型汇总
May 14 Javascript
node中实现删除目录的几种方法
Jun 24 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
Jun 26 Javascript
微信小程序wx.request的简单封装
Nov 13 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 Javascript
微信小程序点击view动态添加样式过程解析
Jan 21 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
3.从实例开始
2006/10/09 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
js实现带搜索功能的下拉框
2020/01/11 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
python的Template使用指南
2014/09/11 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
什么是python类属性
2020/06/10 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
Java模拟试题
2014/11/10 面试题
制药工程专业应届生求职信
2013/09/24 职场文书
老师推荐信
2013/10/28 职场文书
促销活动策划方案
2014/01/12 职场文书
办公室主任先进事迹
2014/01/18 职场文书
网络工程师职业规划
2014/02/10 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
法学求职信
2014/06/22 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
国庆庆典邀请函
2015/02/02 职场文书