js 引用类型 之 数组(Array)及常用方法汇总

简介

数组是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,green
alert(colors.valueOf()); // red,blue,green
alert(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); //2
count = colors.push("black"); //推入另一项
alert(count); //3
var 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)); //3

alert(numbers.lastIndexOf(4)); //5
alert(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(),主要取决于要从哪头开始遍历数组。除此之外,它们完全 相同。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在JavaScript中,数组有许多常用方法可以帮助我们处理和操作数组。以下是一些常见的JavaScript数组方法: 1. Array.concat(arr1, arr2...):将两个或多个数组合并成一个新数组。原数组不会被改变。 2. Array.splice(index, howmany, arr1, arr2...):用于添加或删除数组中的元素。从指定的index位置开始删除howmany个元素,并将arr1、arr2...依次插入到数组中。如果howmany为0,则不会删除任何元素。原数组会被改变。 3. Array.map(function):对数组中的每个元素执行指定的函数,并将函数的返回值组成一个新的数组。原数组不会被改变。 4. Array.filter(function):根据指定函数的条件,筛选出满足条件的元素,返回一个新的数组。原数组不会被改变。 5. Array.forEach(function):对数组中的每个元素执行指定的函数,没有返回值。原数组不会被改变。 6. Array.find(function):返回数组中满足指定条件的第一个元素。如果没有找到满足条件的元素,则返回undefined。 7. Array.findIndex(function):返回数组中满足指定条件的第一个元素的索引。如果没有找到满足条件的元素,则返回-1。 8. Array.reduce(function):对数组中的所有元素执行指定的函数,将它们归纳为一个单一的值。原数组不会被改变。 这些是JavaScript中数组的一些常用方法,它们可以帮助我们在处理数组时更加方便和高效。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [js数组常用方法](https://blog.csdn.net/u012451819/article/details/125768796)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码搬运媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值