博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 引用类型 之 数组(Array)及常用方法汇总
阅读量:4093 次
发布时间:2019-05-25

本文共 8095 字,大约阅读时间需要 26 分钟。

简介

数组是js中常用的数据类型之一,但它与其他语言中的数组的差别还是很大的。

相同点:

  • 都是数据的有序集合

不同点:

  • JS 的数组中的每一项可以保存任何类型的数据
  • JS 数组的长度可以动态调整,即随着数据的增加自动增长以容纳数据

创建方式

  1. Array 构造函数

    //基本方法var colors = new Array();//创建指定长度的数组var colors = new Array(20);//创建一个包含 20 项的数组//创建指定内容的数组var colors = new Array("red", "blue", "green");

    需要注意的是,当给构造函数传递一个值的时候,如果传递的值是数字,则为指定数组长度的每一项为空的数组,而当传递的值为其他类型时则为只有一项的数组。

    var names = new Array("Greg"); // 创建一个包含 1 项,即字符串"Greg"的数组

    此外,创建时构造函数前的 new 可以省略。

  2. 数组字面量

    数组字面量由一对包含数组项的方括号表 示,多个数组项之间以逗号隔开,如下所示:

    var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组    var names = [];var values = [1,2,];var options = [,,,,,];// 创建一个空数组// 不要这样!这样会创建一个包含 2 或 3 项的数组 // 不要这样!这样会创建一个包含 5 或 6 项的数组

    第三行展示了在数组字面量的最后一项添加逗号的结果:在 IE8 及之前版本中,values 会成为一个包 含 3 个项且每项的值分别为 1、2 和 undefined 的数组;在其他浏览器中,values 会成为一个包含 2 项且值分别为 1 和 2 的数组。原因是 IE8 及之前版本中的 ECMAScript 实现在数组字面量方面存在 bug。

    由于 IE 的实现与其他浏览器不一致,因此我们强烈建议不要使用这种语法。

读取与设置数组的值

使用方括号并提供相应值的基于 0 的数字索引。

var colors = ["red", "blue", "green"]; // 定义一个字符串数组alert(colors[0]);// 显示第一项colors[2] = "black"; // 修改第三项colors[3] = "brown"; // 新增第四项

数组读取规则

  • 如果索引小于数组中的项数,则返回对应项的值。
  • 如果设 置某个值的索引超过了数组现有项数,数组就会自动增加到该索引 值加 1 的长度

数组的 length 属性很有特点——它不是只读的。

(1)通过设置这个属性,可以从数组的末尾移 除项或向数组中添加新项。

//删除数组的最后一项var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组 colors.length = 2;alert(colors[2]); //undefined//新增值为undefined的数组项var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组 colors.length = 4;alert(colors[3]); //undefined

(2)利用 length 属性也可以方便地在数组末尾添加新项。

由于数组最后一项的索引始终是 length-1,因此下一个新项的位置就是 length。每当在数组末 尾添加一项后,其 length 属性都会自动更新以反应这一变化。

var colors = ["red", "blue", "green"];// 创建一个包含 3 个字符串的数组colors[colors.length] = "black"; //(在位置3)添加一种颜色colors[colors.length] = "brown"; //(在位置4)再添加一种颜色

数组最多可以包含 4 294 967 295 个项,这几乎已经能够满足任何编程需求了。如 果想添加的项数超过这个上限值,就会发生异常。而创建一个初始大小与这个上限值 接近的数组,则可能会导致运行时间超长的脚本错误。

检测数组

通常我们使用Array.isArray()方法来判断。

if (Array.isArray(value)){
//对数组执行某些操作}

支持 Array.isArray()方法的浏览器有 IE9+、Firefox 4+、Safari 5+、Opera 10.5+和 Chrome。

还有人会用 instanceof操作符来判断,但是它只限于在仅有一个全局作用域的场景。如果网页中包含多个框架,那实 际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的 Array 构造函数。如果你从 一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自 不同的构造函数。

转换方法

toString()

返回由数组中每个值的字符串形式 拼接而成的一个以逗号分隔的字符串。

valueOf()

返回数组本身,

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组alert(colors.toString()); // red,blue,greenalert(colors.valueOf()); // red,blue,greenalert(colors);// red,blue,green,因为alert要接收字符串参数,它会在后台调用toString方法,所以结果与toString 相同

join()

用指定分隔符来拼接数组的每一项,返回字符串。

var colors = ["red", "green", "blue"]; alert(colors.join(",")); //red,green,blue alert(colors.join("||")); //red||green||blue

栈方法

栈是一种 LIFO(Last-In-First-Out, 后进先出)的数据结构,也就是最新添加的项最早被移除。而栈中项的插入(叫做推入)和移除(叫做 弹出),只发生在一个位置——栈的顶部。

JS 的类似的栈方法 push()、 pop();

push()

接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。

var colors = new Array(); // 创建一个数组var count = colors.push("red", "green");  //推入两项alert(count); //2

pop()

从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项。

var item = colors.pop(); alert(item); //"black" alert(colors.length); //2

队列方法

队列数据结构的访问规则是 FIFO(First-In-First-Out, 先进先出)。队列在列表的末端添加项,从列表的前端移除项。

结合使用 shift()和 push()方法,可以像使 用队列一样使用数组。

shift()

它的用法是移除数组中的第一个项并返回该项,同时将数组长度减 1。

var colors = new Array(); //创建一个数组var count = colors.push("red", "green");  //推入两项alert(count); //2count = colors.push("black"); //推入另一项alert(count); //3var item = colors.shift(); //取得第一项alert(item); //"red" alert(colors.length); //2

unshift()

unshift()与 shift()的用途相反: 它能在数组前端添加任意个项并返回新数组的长度。

var colors = new Array(); //创建一个数组 var count = colors.unshift("red", "green"); //推入两项 alert(count); //2

排序方法

reverse()

反转数组项的顺序。

var values = [1, 2, 3, 4, 5]; values.reverse();alert(values); //5,4,3,2,1

这个方法的作用相当直观明了,但不够灵活,因此才有了 sort()方法。

sort()

按升序排列数组项——即最小的值位于最前面,最大的值排在最后面。

需要注意的是,为了实现排序,sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以 确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串,如下所示:

var values = [0, 1, 5, 10, 15]; values.sort();alert(values); //0,1,10,15,5

上例中因为数值 5 虽然小于 10,但在进行字符串比较时,"10"则位于"5"的前面,于是数组的顺序就被修改了。但是这种方案很多时候并不是最优方案,所以sort()方法还可以接收一个比较函数作为参 数,以便我们指定哪个值位于哪个值的前面。

function compare(value1, value2) {
if (value1 < value2) {
//如果第一个参数应该位于第二个之前则返回一个负数 return -1; } else if (value1 > value2) {
//如果第一个参数应该位于第二个之后则返回一个正数 return 1; } else {
//如果两个参数相等 则返回 0 return 0; }}

由于比较函数通过返回一个小于零、等于零或大于零的值来影响排序结果,因此减法操作就可以适当地处理所有这些情况。

function compare(value1, value2){
return value2 - value1;}

操作方法

concat()

连接数组,返回一个新数组。
具体来说,这个方法会先创建当前数组一个副本,然后将接收到的参数 添加到这个副本的末尾,最后返回新构建的数组。

var colors = ["red", "green", "blue"];//不传参,复制当前数组并返回副本var colors1 = colors.concat();alert(colors1);  //["red", "green", "blue"];//传递一或多个数组/值,将数组中的每一项添加到新数组中var colors2 = colors.concat("yellow", ["black", "brown"]);alert(colors2);    //red,green,blue,yellow,black,brown

slice()

根据参数指定的起始位置和结束位置截取数组,返回新数组。

var colors = ["red", "green", "blue", "yellow", "purple"]; //只有一个参数时,截取从指定开始位置到最后的数组项var colors2 = colors.slice(1);alert(colors2);   //green,blue,yellow,purple//两个参数时,截取两数之间的数组项(不包含结束位置处,即含头不含尾)var colors3 = colors.slice(1,4);alert(colors3);   //green,blue,yellow

注意,

  • slice()方法不会影响原始数组。
  • 如果 slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位 置。例如,在一个包含 5 项的数组上调用 slice(-2,-1)与调用 slice(3,4)得到的 结果相同。
  • 如果结束位置小于起始位置,则返回空数组。

splice()

这是最强大的数组方法,可以删除、插入、替换数组项。返回新数组,数组元素由原数组中删除的项组成。该方法会改变原数组。

  1. 删除

    可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。

    var colors = ["red", "green", "blue"];var removed = colors.splice(0,1); alert(colors); // green,blue alert(removed); // red,返回的数组中只包含一项
  2. 插入

    可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、0(要删除的项数) 和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项。

    removed = colors.splice(1, 0, "yellow", "orange");   alert(colors); // green,yellow,orange,blue alert(removed); // 返回的是一个空数组
  3. 替换

    可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起 始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。

    removed = colors.splice(1, 1, "red", "purple"); alert(colors); // green,red,purple,orange,blue alert(removed); // yellow,返回的数组中只包含一项

位置方法

ECMAScript 5 为数组实例添加了两个位置方法:indexOf()和 lastIndexOf()。

参数:

这两个方法都接收 两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中,indexOf()方法从数组的开头(位 置 0)开始向后查找,lastIndexOf()方法则从数组的末尾开始向前查找。

返回值:

这两个方法都返回要查找的项在数组中的位置索引值,或者在没找到的情况下返回-1。
在比较第一个参数与数组中的每一项时,会使用全等操作符;也就是说,要求查找的项必须严格相等(就像使用===一样)。

以下是几个例子。

var numbers = [1,2,3,4,5,4,3,2,1]; alert(numbers.indexOf(4)); //3alert(numbers.lastIndexOf(4)); //5alert(numbers.indexOf(4, 4)); //5 alert(numbers.lastIndexOf(4, 4)); //3 var person = {
name: "Nicholas" }; var people = [{
name: "Nicholas" }]; var morePeople = [person];alert(people.indexOf(person)); //-1 alert(morePeople.indexOf(person)); //0

迭代方法

ECMAScript 5 为数组定义了 5 个迭代方法。

参数:

每个方法都接收两个参数:要在每一项上运行的函数和 (可选的)运行该函数的作用域对象——影响 this 的值。
其中,每一项运行的函数又包含3个参数,数组项的值、该项在数组中的位置和数组对象本身。

  • every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。

    var numbers = [1,2,3,4,5,4,3,2,1];var everyResult = numbers.every(function(item, index, array){
    return (item > 2);});alert(everyResult); //false
  • filter():对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。

    var numbers = [1,2,3,4,5,4,3,2,1];var filterResult = numbers.filter(	function(item, index, array){
    return (item > 2); });alert(filterResult);//[3,4,5,4,3]
  • forEach():对数组中的每一项运行给定函数。这个方法没有返回值。

    var numbers = [1,2,3,4,5,4,3,2,1];numbers.forEach(function(item, index, array){
    //执行某些操作});
  • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。

    var numbers = [1,2,3,4,5,4,3,2,1];var mapResult = numbers.map(function(item, index, array){
    return item * 2;});alert(mapResult); //[2,4,6,8,10,8,6,4,2]
  • some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。

    var numbers = [1,2,3,4,5,4,3,2,1];var someResult = numbers.some(function(item, index, array){
    return (item > 2);});alert(someResult); //true

以上方法都不会修改数组中的包含的值。

归并方法

ECMAScript 5 还新增了两个归并数组的方法:reduce()和 reduceRight()。这两个方法都会迭 12 代数组的所有项,然后构建一个最终返回的值。

2个参数:

在每一项上运行的函数、作为归并基础的初始值(可选)。
而运行函数又有4个参数:
上一个值,当前值,项的索引,数组对象,函数的返回值作为第一个参数自动传给下一项。

reduce()

使用 reduce()方法可以执行求数组中所有值之和的操作,比如:

var values = [1,2,3,4,5];var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;});alert(sum); //15

reduceRight()

reduceRight()的作用类似,只不过方向相反而已。

var values = [1,2,3,4,5];var sum = values.reduceRight(function(prev, cur, index, array){
return prev + cur;});alert(sum); //15

使用 reduce()还是 reduceRight(),主要取决于要从哪头开始遍历数组。除此之外,它们完全 相同。

转载地址:http://yxvii.baihongyu.com/

你可能感兴趣的文章
DirectX11 平行光
查看>>
DirectX11 点光
查看>>
DirectX11 聚光灯
查看>>
DirectX11 HLSL打包(packing)格式和“pad”变量的必要性
查看>>
DirectX11 光照演示示例Demo
查看>>
漫谈一下前端的可视化技术
查看>>
VUe+webpack构建单页router应用(一)
查看>>
Vue+webpack构建单页router应用(二)
查看>>
从头开始讲Node.js——异步与事件驱动
查看>>
Node.js-模块和包
查看>>
Node.js核心模块
查看>>
express的应用
查看>>
NodeJS开发指南——mongoDB、Session
查看>>
Express: Can’t set headers after they are sent.
查看>>
2017年,这一次我们不聊技术
查看>>
实现接口创建线程
查看>>
Java对象序列化与反序列化(1)
查看>>
HTML5的表单验证实例
查看>>
JavaScript入门笔记:全选功能的实现
查看>>
程序设计方法概述:从面相对象到面向功能到面向对象
查看>>