数组进阶一
一.基本概念
数组是值的有序集合
值—元素
值的位置–索引
说明
:
1.数组是无类型的(元素可以是任意类型)
2.数组是动态的(可以根据需要增添元素)
3.数组可以是稀疏的
//稀疏数组
let a=[1,2,3]
a[5]=6
//a=[1, 2, 3, empty × 2, 6]
a.length
//6
//访问empty元素输出undefined
a[4]
//undefined
//设置undefined元素,显示为undefined
a[6]=undefined
//a=a=[1, 2, 3, empty × 2, 6,undefined]
//访问undefined元素输出undefined
a[6]
//undefined
4.js数组是js对象的特殊形式(数组索引可以认为是对象的属性名)
let a=[1,2]
a["name"]="hua"
//[1, 2, name: "hua"]
5.数组继承Array.prototype中的属性
二.创建数组
1.数组字面量
let a=[1,2,3]
let b=[1, ,3]
2.构造函数Array()
//创建a3 = [1, 2, 3, "四", "五", "六"];
let a3 = new Array(1, 2, 3, "四", "五", "六");
//创建10个长度大小的空数组
let a2= new Array(10)
//创建一个空数组
let a1=new Array()
三.访问数组元素
1.读写数组元素
[]
:用于访问数组中的一个元素,也可以用于设置元素
let a=[1]
//读
a[0]
//1
//写
a[1.11] = 1.11
//a=[1, 1.11: 1.11]
四.数组长度
length
:每个数组有一个length属性,代表数组中元素的个数
说明:
1.设置为一个小于当前长度的非负整数n时,当前数组中那些索引值大于或等于n的元素将从中删除。
let aa=[1,2,3,4,5]
aa.length=3
//aa=[1, 2, 3]
2.设置为大于其当前的长度,会在数组尾部创建一系列空的区域。
aa.length=5
//aa=[1, 2, 3, empty × 2]
3.可以用Object.defineProperty()
让数组的length属性变成只读的。
Object.defineProperty(aa,"length",{writable:false})
aa.length=7
//aa=[1, 2, 3, empty × 2]
4.计算length的过程中不计算扩展元素的个数,算空位
let b=[1,2]
b[3]=4
b["test"]="hello"
//b= [1, 2, empty, 4, test: "hello"]
b.length
4
五.数组遍历
1.使用Object.keys
遍历数组索引(包括扩展索引)
用法:Object.keys(数组名)
let a=[1,2,3]
a["test"]="hello"
//a=[1, 2, 3, test: "hello"]
Object.keys(a)
// ["0", "1", "2", "test"]
2.使用Object.values()
遍历数组元素值(包括扩展元素)
用法:Object.values(数组名)
Object.values(a)
//[1, 2, 3, "hello"]
3.使用for in
获取数组索引(跳过空格;忽略扩展元素)
let b=[1,2]
b[3]=4
b["test"]="hello"
//b= [1, 2, empty, 4, test: "hello"]
for(let i in b){
console.log(i,b[i]);
}
//0 1
//1 2
//3 4
4.使用for of
获取数组元素值(不逃过空格,将空格读为undefined;忽略扩展属性)
for(let i of b){
console.log(i)
}
//1
//2
//undefined
//4
5.使用基础循环for
for(let i;i<b.length;i++)
{
console.log(b[i])
}
for of在遍历的过程在 中不可以修改数组的元素;for for/in 可以
在运用中建议用for of
六.数组相关方法(1)
join()
:将数组中所有元素转化为字符串连接在一起
不改变原数组
用法:数组名.join(分割符)
说明:
1.可以指定一个可选的字符串在生成的字符串中来分隔数组的各个元素。如果不指定分隔符,默认使用逗号。
let arr = [1, 2, 3, 4, 5];
console.log(arr.join("-"), arr.join());
//1-2-3-4-5 1,2,3,4,5
reverse()
将数组中元素颠倒顺序,返回逆序的数组
不改变原数组
let r_arr = arr.reverse();
//r_arr=[5, 4, 3, 2, 1]
sort()
将数组中的元素排序并返回排序后的数组。
用法一:参数调用sort()时,数组元素以字母表顺序排序(如有必要将临时转化为字符串进行比较) ------一位一位的进行比较
会改变原数组
let data = [22, 4, 111, 30];
let sdata = data.sort();
//data=[111, 22, 30, 4]
//sdata=[111, 22, 30, 4]
单纯的按照位来比较,在许多情况下会出错:
let b=[155,211,6];
console.log(b.sort())
//[155, 211, 6]
用法二:给sort()方法传递一个比较函数。该函数决定了它的两个参数在排好序的数组中的先后顺序。
会改变原数组
- 若 a 小于 b,即 a - b 小于零,则返回一个小于零的值,数组将按照升序排列。
- 若 a 等于 b,则返回 0
- 若 a 大于 b, 即 a - b 大于零,则返回一个大于零的值,数组将按照降序排列。
let b=[155,211,6];
//降序排序
let b2=b.sort(function(a,b){
return a-b;
})
//b2=[6, 155, 211]
//b=[6, 155, 211]
concat()
:连接数组,返回新数组
不改变原数组
说明:
1.新数组=调用方法的数组连接作为参数的数组
let a=[1,2]
let b=[3,4]
let cc=a.concat(b)
//c=[1, 2, 3, 4]
let dd=b.concat(a)
//dd=[3, 4, 1, 2]
2.可以传入多个参数
let ee=[1,1].concat(a,b)
//ee= [1, 1, 1, 2, 3, 4]
3.可以传入数组字面量
let ff=[1,1].concat([2,2],[...a,3,3])
//ff=[1, 1, 2, 2, 1, 2, 3, 3]
slice()
返回指定数组的一个片段或子数组。
不改变原数组
两个参数:
第一个参数:起始位置(包括)
第二个参数:结束位置(不包括)
let a=[1,2,3,4,5,6]
a.slice(0,2)
//[1, 2]
说明:第二个参数可以传入负数(从右边开始数第一个数的索引为-1)
a.slice(0,-5)
//[1]
splice()
:可以在数组中插入、删除、替换元素的方法,返回被删除的部分,修改原数组。
会修改原数组
有三个参数
第一个参数:起始位置的索引(包括)。
第二个参数:从起始位置开始参与改变的元素个数。
第三个参数:修改后插入的字符.
删除指定位置指定个数元素:
let a=[1,2,3,4,5,6];
let aa=a.splice(0,2);
//aa=[1,2]
//a=[3,4,5,6]
在指定位置添加:
let a=[1,2,3,4,5,6];
let aa=a.splice(0,0,0);
//aa=[]
//a=[0, 1, 2, 3, 4, 5, 6]
替换指定位置指定个数的元素:
let a=[1,2,3,4,5,6]
let aa=a.splice(0,2,...[11,22])
//aa=[1,2]
//a=[11, 22, 3, 4, 5, 6]
push()、pop()、unshift()、shift()
:
会改变原数组
unshift()
在数组的头部添加一个或多个元素,并将已存在的元素移动到更高索引的位置来获得足够的空间,最后返回数组新的长度。
let a=[1,2,3,4,5,6];
let aa=a.unshift(11,22,33)
//aa=9
//a=[11, 22, 33, 1, 2, 3, 4, 5, 6]
push()
方法在数组的尾部添加一个或多个元素,并返回数组新的长度。
let a=[1,2,3,4,5,6]
let aa=a.push(11,22,33)
//aa=9
//a= [1, 2, 3, 4, 5, 6, 11, 22, 33]
shift()
删除数组的第一个元素并将其返回,然后把所有随后的元素下移一个位置来填补数组头部的空缺。
let a=[1,2,3,4,5,6]
let aa=a.shift()
//aa=1
//a=[2, 3, 4, 5, 6]
pop()
方法:它删除数组的最后一个元素,减小数组长度并返回它删除的值。
let a=[1,2,3,4,5,6]
let aa=a.pop()
//aa=6
//a=[1, 2, 3, 4, 5]