【重学JS】-7,数组 Array

102 阅读7分钟

这是我参与2022首次更文挑战的第3天,活动详情查看:链接

一,数组简介

数组在JavaScript中也是一个对象,和普通对象功能类型,都是用来储存一些值。

不同的是,普通对象使用字符串作为属性名,而数组是用数字作为索引来操作元素。

可以看下图对比一下:

#数组的索引:从0开始的整数

数组的储存新能比普通对象要好,在开发中我们经常使用数组来储存数据。

二,创建数组对象

1,使用构造函数创建数组

var arr = new Array()

#使用typeof来检查一个数组时,会返回object


#向数组中添加属性

语法:数组[索引] = 值

例:arr[0] = 10

#读取数组元素

语法:数组[索引]

例:console.log(arr[0])

如果读取不存在的索引,返回undefined\

#获取数组的长度

语法:数组.length

元素个数,对于非连续性数组,使用length会获取到数组的做大索引+1

尽量不要创建非连续性的数组,如 arr[0] = 1 ; arr[8] = 'ppp'

修改length:如果修改的length大于原数组长度,则多出的部分为空

如果修改的length 小于原来数组的长度,则多出的元素被删除。

#向数组最后一个位置添加元素

语法:数组[数组.length] = 值

2,使用字面量方式创建数组

var arr = []

可以在创建数组时就指定数组中的元素

var arr = ['1',2,3,5,6]

等同于 

var arr2 = new Array('1',2,3,5,6)

注意的是:使用构造函数创建数组时,也可以同时添加元素,将要添加的袁术作为构造函数参数传递,元素之间使用 英文逗号 , 分割

但是要注意的是,当构造函数参数只有一个,并且为整数时,会创建一个长度为该参数的数组

var arr2 = new Array(6)
// arr2 = [,,,,,]

数组中的元素可以是任意数据类型,例

var arr = ['hello',{},true,undefined,null,function(){},[]]

数组中还包含数组,这样的数组我们称之为二维数组,当然,内部数组在包含数组,我们以最里面一层为底,称为n维数组

var arr = [[],[],[]] //二维数组

var arr2 = [[[],[]],[]] //三维数组 

三,常用的数组方法

var arr = ['张三','李四','赵无能']
  • push方法
语法:数组.push(值)

向数组末尾添加一个或对个元素,并返回新的长度(作为返回值返回)

例子:

//一个  
arr.push('孔明') //arr ==  ['张三','李四','赵无能','孔明']
//多个
arr.push('值1','值2'...) //arr ==  ['张三','李四','赵无能','值1','值2'...]
//返回长度
var len = arr.push('孔明') //len == 4
  • pop方法
语法:数组.pop()

可以删除数组最后一个元素,并将被删除的元素作为返回值返回

var result = arr.pop() //result == 赵无能
  • ****unshift方法
语法:数组.unshift('大脚')
//多个 
数组.unshift('值1','值2',...)

向数组开头添加一个或者多个元素,并返回添加后的数组长度。

var result = arr.unshift('大脚') //result === 4

#注意:向前边插入元素,其他元素的索引会依次调整

arr.unshift('大脚','绣花')
// arr = ['大脚','绣花','张三','李四','赵无能'] 此时张三由索引0变为2
  • shift()方法
语法: 数组.shift()

可以删除数组第一个元素,并将删除的元素作为返回值返回

arr.shift() //arr === ['李四','赵无能']

//返回值

var result = arr.shift() // 张三
  • slice()方法

从某个已有数组返回选定元素,可以用来从数组中提取元素

语法:
数组.slice(0,1)
#参数
 -参数1:截取开始的位置
 -参数2:截取结束的位置

该方法不会改变原数组,而是将截取到的元素封装到一个新的数组返回

var  newArr = arr.slice(0,1) // ['张三']

注意的是:新的数组中 包含开始索引的位置,不包含结束位置。

第二个参数可以不写,不写直接窃取开始索引往后数组的所有元素

索引传递负值的时候,则从后往前计算,比如: -1 == 倒数第一个 ; -2 ==倒数第二个

  • splice()方法

可以用于删除数组中指定的元素,会影响原数组,会将指定元素从数组中删除,并将删除元素作为返回值返回。

var result = arr.splice(0,1) //原数组 -> ['李四','赵无能']
//result -> ['张三']
语法:
数组.splice(参数1,参数2,参数3,...)
#参数
     -参数1:表示开始位置
     -参数2:表示删除数量
     -参数3及以后的参数:可以传递一些新的元素,这些元素将会自动插入开始位置索引前边
//例如:
var result = arr.splice(1,1,'王大拿','洗脚妹','孙悟空')
//原数组->   ['张三','王大拿','洗脚妹','孙悟空','赵无能']
// result -> ['李四']
  • concat()方法

concat可以将连接两个数组,并将新的数组返回

该方法不会对原数组产生影响

var arr = ['后裔','猴子','哪吒','孙尚香']
var arr2  = ['吕布','刘备','张飞','盾山']

var arr3 = ['关羽','杨戬','马可波罗']

var resulr = arr.concat(arr2) // result =  ['后裔','猴子','哪吒','孙尚香','吕布','刘备','张飞','盾山']

//连接多个
var result2 = arr.concat(arr2,arr3,'孙膑','牛魔')
// result2 = ['后裔','猴子','哪吒','孙尚香','吕布','刘备','张飞','盾山',.....]
  • join方法

该方法可以将一个数组转换为一个字符串

该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回

#在join()中可以指定一个字符串作为参数,这个字符串将会称为数组元素中的连接符,不指定默认为 ,

var arr = ['后裔','猴子','哪吒','孙尚香']
var result = arr.join() //result == '后裔,猴子,哪吒,孙尚香'

var result2=  arr.join('-') //result == '后裔-猴子-哪吒-孙尚香'
  • reverse()方法

该方法用来反转数组(前边的去后面,后面的去前面)

该方法会直接修改原数组

var arr = ['后裔','猴子','哪吒','孙尚香']
arr.reverse() //arr ==  ['孙尚香','哪吒','猴子',后裔']
  • sort()方法

可以使用sort()方法来对数组进行排序

该方法会直接修改原数组,默认会按照Unicode编码排序

var arr = ['后裔','猴子','哪吒','孙尚香']
arr.sort() //arr =  ['后裔', '哪吒', '孙尚香', '猴子']

即使对于纯数字的数组,也会按照Unicode编码排序

对数字进行排序时,需要自己指定排序规则

#我们可以在sort中添加一个回调函数,来指定排序规则。
#	-回调函数需要定义两个形参
# -浏览器将会分别使用数组中的元素作为实参去调用回调函数
# -使用元素调用不确定,但肯定的是数组中a一定在b前边
# -浏览器会根据回调函数的返回值来决定元素的顺序
# - 如果返回一个大于0的值,则元素会交换位置
# - 如果返回一个小于0的值,则元素位置不变
# - 如果返回一个等于0的值,则认为两个元素相等,不交换位置
arr.sort(function(a,b){
//	if(a >b ){
 // 	return 1
//  }else if (a<b){
  	retuen -1
 // }else{
 // 	return 0
//  }
  //或者  升序 a-b  降序 b-a
  return a-b
})

四,数组遍历

遍历数组,就是将数组中所有元素都取出来

var arr =  ['张三','王大拿','洗脚妹','孙悟空','赵无能']

for(var i = 0 ; i<arr.length; i++){
		console.log(arr[i])
}

*forEach() 只支持ie8及以上浏览器

语法:数组.forEach(), 需要一个函数作为参数,像这种函数,由我们创建但是不是由我们调用,我们称为 ' 回调函数 '

arr.forEach(function(val,index){
	console.log(val) // 值
})

数组中有几个元素,函数执行几次,每一次执行,浏览器将遍历到的元素以实参的形式传递进来,我们可以定义形参读取

浏览器会在回调函数中传递三个参数:

-第一个:当前正在遍历的元素

-第二个:索引,当前正在遍历的索引

-第三个:正在遍历的数组

#利用遍历,处理数组去重

var arr = [1,2,3,4,2,2,3,4,5,77,8,5,0,99]

for(var i = 0 ; i<arr.length; i++){
	//获取当前元素后所有元素
  for(var j = i+1; j<arr.length; j++){
  	//如果出现重复 则删除j对应的元素
    if(arrp[j] == arr[i]){
    	arr.splice(j,1)
      //当删除了当前j 所在元素后,后边元素自动补位,这个时候,不会在比较这个位置的元素,我们要在比较一次j所在的位置,所以
      j--;
    }
  }
}