1、什么是数组?
数组(Array),顾名思义,用来存储一组相关的值,从而方便进行求和、计算平均数、逐项遍历等操作
数组中的值的类型是没有限制的,所以数组中也可以存储数组。
包含数组的数组,我们叫做多维数组(重点)
在实际项目中,数组中通常会存储同一类型的数据。
定义数组的方法
方法一、
var arr =[] 创建空数组
var arr = [1,2,3,4] 创建带数据的数组,数组里的每一项用逗号隔开
方法二、
函数构造法
var arr = new Array(1,2,3)等同于var arr = [1,2,3]
但是当 var arr = new Array(5)时
js内部会给我们创建变量名为arr 的5项空数组空间(empty*5)
var arr = [5] ,这样创建的是变量名为arr并且只有一项数据为5的空间
访问数组项
数组每一项都有下标,下标从0开始
可以使用方括号中书写下标的形式,访问数组的任一项
JavaScript规定,访问数组中不存在的项会返回undefined,不会报错
数组的长度--数组的length表示它的长度,数组的最后一项的下标是数组的长度减1
更改数组项,如果更改的数组项超过了length-1,那么会创造这项 如图所示:
var arr = [1, 2, 3, 4, 5] delete arr[0] console.log(arr); // 这种删除方式,只能删除值,并不能删除小空间 存储删除数据的空间会变成empty
数据类型的检测 使用 Array.isArray(arr)检测arr是不是一个数组类型的数据
基本数据类型和引用类型
基本类型有 number string boolean undefined null
引用类型有 function {} []
区别如下:
1、数据存储方式不同,基本数据类型把数据存入栈内存中,引用类型把数据存入堆内存中,把内存地址放在栈内存中
2、赋值方式不同,基本数据类型直接复制数据,引用类型是复制内存地址
3、比较方式不同,基本类型比较==的时候,只比较数据是否相等,比较===的时候,先判断数据类型是否相等,引用类型比较相等的时候,是比较引用地址是否相等
数组的遍历
推荐 使用for(var i = 0; i < arr.length; i++){ } 的方法进行遍历数组
因为for(var i in arr){ } 这种方法不会遍历空的数据空间,不适合遍历数组,适合遍历对象使用
数组的一些常用的操作方法
头尾操作
数组.unshift()和数组.push()会返回数组的长度
数组.pop()和数组.shift()会返回删除的
splice()方法
splice(v,d,x),v代表开始的下标,d代表删除的个数,x代表添加元素的内容
splice()方法用于替换指定项 eg:splice(1,1,'2') --在下标为1的位置替换数据
splice()方法用于删除指定项 eg: splice(1,1) --删除下标为1的一项数据
splice()方法用于添加指定项 eg: splice(2,0,'a')--在下标为2的位置添加一项数据'a'
reverse()方法
reverse()方法用于将数组的顺序反转
sort()方法
实现数组的排序
slice()方法
用于截取数组的某一段
join()和split()方法
数组的join()方法可以使数组转为字符串;字符串的split() 方法可以使字符串转为数组
indexOf()方法
查找某个元素在数组中第一次出现的位置,如法如下:
arr.indexOf(元素,[开始查找的起始下标]);
# 参数1:将要查找的元素
# 参数2:可选项。从哪个下标开始往后查找
# 返回值:如果找到了,就返回这个元素在数组中的下标,如果没有找到,就返回-1
includes()方法
该方法用于判断数组中是否存在某个数据,如果有就返回true ,没有的话返回false
forEach()方法
用于遍历数组,如法如下:
arr.forEach(function(值, 下标, 当前数组){
// 代码段 });
# 在这个方法中需要传入一个函数参数,这个函数的参数说明如下:
# 参数1:数组遍历出来的每个值
# 参数2:可选项。数组遍历出来的每个值对应的下标
# 参数3:可选项。被遍历的当前数组
这个方法没有返回值,返回值为undefined,不会改变原来数组的值。
concat()方法
用于 数组的拼接,将数组拼接为更大的数组
map()方法
遍历数组,并将每个元素经过函数处理后,形成新的元素,所有新元素组成新数组返回
语法如下:
arr.map(function(值,下标,当前数组){的值 - 通常新的值是
return 新由旧的值处理以后得到
});
filter()方法
将数组中满足指定条件的值,组成新的数组返回
语法如下:
arr.filter(function(值, 下标, 当前数组){
return 筛选条件
});
使用方法和功能跟map方法很像,只是运行规则不一样。map方法中的函数,用于返回新的元素,而filter方法中的函数,根据返回true或false来筛选元素
reduce()方法
用于数组求和,如图所示:
其中a第一次的时候,表示第一个元素,第二次开始表示上一次返回的数据,b第一次表示第二个元素,第二个开始表示第三个元素、第四个元素。。。
some()方法
判断数组中是否至少有一个元素是满足指定条件的,返回布尔值
布尔值 = 数组.some(function(v,i,a){
return 条件;
})
// 上面的i和a是可选参数
some内置的原理,遍历数组,判断每个值是否满足条件,有满足的就返回true,并break循环,遍历完以后都没有一个是满足的,返回false
every()方法
判断数组中是否所有元素都满足指定的条件,返回布尔值
布尔值 = 数组.every(function(){
return 条件
})
// 上面的i和a是可选参数
every内置的原理,遍历数组,判断每个值是否满足条件,有不满足的就返回false,并break循环,遍历完以后都满足,返回true
find()方法
查找数组中第一个满足指定条件的值,找到返回值,找不到返回undefined
值 = 数组.find(function(v,i,a){
return 条件
})
// 上面的i和a是可选参数
find的原理,遍历数组,判断每个元素是否满足条件,满足就返回这个元素,并break循环,如果遍历完了都没有满足条件的,就返回undefined
findIndex()方法
查找数组中满足条件的第一个对应的下标,找到返回下标,找不到返回-1
语法:
下标 = 数组.findIndex(function(v,i,a){
return 条件
})
// 上面的i和a是可选参数
findIndex的原理,遍历数组,判断每个元素是否满足条件,满足就返回这个元素的下标,并break循环,如果遍历完了都没有满足条件的,就返回-1
数组的浅克隆
浅克隆:只克隆数组的第一层,如果是多维数组,或者数 组中的项是其他引用类型值,则不克隆其他层
浅克隆只克隆数组的一层,如果数组是多维数组,则克隆的 项会“藕断丝连”。
数组的深克隆
克隆数组,实现两个一模一样的数组,并且两个数组不会互相影响,可以使用递归实现深克隆
深克隆:克隆数组的所有层,要使用递归技术,使用递归思想,整体思路和浅克隆类似,但稍微进行一些改 动:如果遍历到项是基本类型值,则直接推入结果数组;如 果遍历到的项是又是数组,则重复执行浅克隆的操作