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 22 Javascript
jquery animate 动画效果使用说明
Nov 04 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
Dec 05 Javascript
利用javascript判断文件是否存在
Dec 31 Javascript
JavaScript代码生成PDF文件的方法
Feb 26 Javascript
浅谈JS的基础类型与引用类型
Sep 13 Javascript
javascript 动态生成css代码的两种方法
Mar 17 Javascript
详解Vue webapp项目通过HBulider打包原生APP
Jun 29 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
Sep 20 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
Dec 13 Javascript
详解js实时获取并显示当前时间的方法
May 10 Javascript
html5中sharedWorker实现多页面通信的示例代码
May 07 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
ThinkPHP之getField详解
2014/06/20 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
Python import与from import使用及区别介绍
2018/09/06 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
numpy实现RNN原理实现
2021/03/02 Python
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
经典而简洁的婚礼主持词
2014/03/13 职场文书
授权委托书范本
2014/04/03 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年标准化工作总结
2014/12/17 职场文书
2015年推普周活动总结
2015/03/27 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
MySQL中连接查询和子查询的问题
2021/09/04 MySQL