JavaScript中Array类型之数组的那些方法

Array类型

ECMAScript数组的特别之处在于

1.数组的每一项,可以保存任意的数据类型

2.数组的长度是可以动态调整的,随着数据的添加自动增长以容纳新数据

创建数组的方式

1.使用构造函数

var arr = new Array()

var arr = new Array(20)//初始长度为20

var arr = new Array(“1”)//初始长度1

var arr = new Array(“1”,1,2)

可以省略new操作符,效果不变
2.数组字面量

var arr = []

与对象一样,使用字面量的方式,不会调用构造函数new Array()

数组的length属性

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

通过这个特点,我们可以从数组的末尾添加或删除元素(修改length的数值)

如果给数组的特定位置添加一个值,那么之间没有赋值的位置同样存在,值为undefined

检测数组

使用 arr instanceof Array操作符来检测是否为数组的问题在于: 它假定只有一个全局执行环境.如果网页中包含多个框架,实际上就存在两个以上的不同的全局执行环境,从而存在两个以上不同版本的Array构造函数.如果从一个框架向另一个框架传入数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数.为了解决这个问题,ECMAScript5新增了Array.isArray()方法,该方法的目的是最终确定某个值到底是不是数组,而不管它在哪个全局执行环境中创建

数组转换

所有的对象都具有toLocalString(), toString(),valueof()方法

数组调用toString()方法返回以逗号分割的字符串

数组调用valueof()方法返回的还是数组

join()方法

数组调用join()方法,返回指定分隔符拼接成的数组字符串

join方法只接受一个参数 join(“分隔符”)

如果数组中的某一项值为null或undefined,那么该项在toLocalString(), toString(),valueof(),join()这些方法中返回的结果为空字符串“”

栈方法

push()接收任意个参数,逐个添加至数组的末尾,并返回修改后的数组长度

pop()方法删除数组的最后一项,减小数组的长度,并返回被删除的项

队列方法

unshift()接收任意个参数,添加至数组的前端,并返回修改后的数组长度

shift()方法删除数组的第一项,减小数组的长度,并返回被删除的项

结合pop()和 shift()方法就可以像使用队列一样使用数组

重排序方法

reverse() 返回经过翻转后的数组

sort() 默认升序排序,返回经过排序后的数组

sort()方法会调用数组每一项的toString()转型方法,然后比较得到的字符串,以确定如何排序,即使数组项的值为数值类型,比较的也是字符串,这种排序方式有时会产生排序错误,比如升序时,10会排在5前面。这种排序方式在很多情况下都不是最佳的解决方案。因此,
sort()方法可以接收一个比较函数作为参数,比较函数接收两个参数,降序排序时返回num2-num1,升序排序时返num1-num2. 比较函数通过返回正数或负数或0来影响排序结果,因此减法很合适

操作方法

concat()

concat()

基于当前数组的所有项创建一个新数组。即该方法会先创建一个当前数组的副本(新数组),再把参数添加到新数组的末尾,最后返回新数组。不传参时,就是复制数组。如果传递的参数是一个或多个数组,则该方法会将这些参数数组的每一项都添加到新数组中。如果传递的参数不是数组,就会被简单的添加到新数组的末尾

slice() 截取

slice() 截取

该方法可以基于当前数组中的一项或多项创建一个新数组

它接收一个或两个参数,即要截取的起始位置和结束位置(不包括结束位置)。如果只有一个参数,则截取起始位置到末尾的所有项。

如果参数中有负数,那么就用数组长度加上该参数的到结果作为实际参数,例如数组长度为5时,slice(-2,-1)与slice(3,4)的效果相同,如果结束位置小于起始位置,则返回空数组

splice()

splice() 数组最强大的方法,它可以删除,添加,替换

实现删除:指定两个参数,参数1:起始位置 参数2:删除的项数 例如splice(0,2) 删除头两项

**实现添加:**指定三个参数,参数1:起始位置 参数2:0(表示要删除的项数,0表示只插入不删除)参数3:要添加的项(如果要添加的项有多个,可以继续传入多个项)例如splice(1,0,“22”,“99”) 从数组的下标1开始添加项

**实现替换:**从指定位置添加任意数量的项,同时删除任意数量的项,需要指定三个参数,参数1:起始位置 参数2:要删除的项数 参数3:要插入的任意数量的项。插入的项数不必与删除的项数相等 例如 splice(2,1,“k”,‘l’) 删除数组位置2的项,再从位置2开始插入新元素

splice()方法始终会返回一个新数组,该数组包含被删除的项,如果没有删除,则返回空数组

位置方法

indexOf(要查找的项,【起始位置】) 从前往后查找,返回查找元素的索引,没找到返回-1

lastIndexOf(要查找的项,【起始位置】) 从后往前查找,返回查找元素的索引,没找到返回-1

在比较被查找元素与数组中的每一项时,底层使用的是===全等操作符

迭代方法

ECMAScript为数组定义了5个迭代方法,这些方法需要接收两个参数。参数1:要在每一项上运行的函数;参数2(可选的):运行该函数的作用域对象——影响this的值。参数1的函数需要接收3个参数(item,index,array),分别是数组项的值,索引,数组对象本身

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

filter():对数组的每一项运行给定的函数,返回结果为true的项组成的数组

forEach():对数组的每一项运行给定的函数,没有返回值 ,本质上与使用for循环迭代数组一样

map():对数组的每一项运行给定的函数,返回每一次调用函数时得到的结果组成的数组

some():对数组的每一项运行给定的函数,如果有任意一项返回true,则结果为true

以上方法都不会改变原数组的值
使用案例
var numbers = [1,2,3,4,5,4,3,2,1]
var everyResult = numbers.every(function(item,index,array){
    
    
 return (item>2)
})
console.log(everyResult);//false


var someResult = numbers.some(function(item,index,array){
    
    
 return (item>2)
})
console.log(someResult);//true


var filterReslt = numbers.filter(function(item,index,array){
    
    
 return (item>2)
})
console.log(filterReslt);//Array(5) [ 3, 4, 5, 4, 3 ]


var mapReslt = numbers.map(function(item,index,array){
    
    
 return (item*2)
})
console.log(mapReslt);//Array(9) [ 2, 4, 6, 8, 10, 8, 6, 4, 2 ]


numbers.forEach(function(item,index,array){
    
    
   //数组的每一项执行某些操作,本质与使用for循环一样
   console.log(item);
 })

归并方法

reduce() 从数组的开头开始迭代到最后一项

reduceRight() 从数组的最后一项开始迭代到第一项

这两个方法都会迭代数组的所有项,然后构建一个最终返回值。它们都接收两个参数,参数1(可选):在每一项上调用的函数; 参数2(可选):归并基础的初始值。 参数1的函数接收4个参数,分别为前一个值,当前值,项的索引,数组对象。这个函数的返回值会自动传递给下一项作为下一次执行该函数时的函数的参数1。
第一次迭代发生在数组的第二项,所以参数1为下标为0的项,参数2为下标为1的项,

使用reduce() 还是reduceRight() 取决于从哪边开始遍历数组,除此之外,两者没有区别

使用案例
//数组求和
var numbers = [1,2,3,4,5,4,3,2,1]
var reduceResult = numbers.reduce(function(pre,cur,index,array){
    
    
  return (pre+cur)
 })
 console.log(reduceResult);//25
//reduceRight() 作用相似,只不过方向相反

猜你喜欢

转载自blog.csdn.net/m0_48895748/article/details/127419942