Skip to content

数组新增特性

扩展运算符

js
扩展运算符 func(...[11,12,12]) === func(11,12,12)
脱衣服

① 把数组拆分为逗号分隔的参数序列

js
1. 用数组作为实参,给有多个形参的函数传参
2. 拷贝数组
3. 合并数组
4. 也可以将可遍历对象拆分为逗号分隔的参数序列,可以实现将伪数组转为纯数组
js
// 将数组转为逗号分隔的参数序列;把数组中的每一个元素都拿出来,作为变量参数。
const nums = [1000,2000,3000,4000];
function func(n1,n2,n3,n4) {
}
func(nums);
func(...nums);   // 相当于 func(1000,2000,3000,4000)
func(...['刘姥姥', '司马姥姥', '欧阳姥姥']);   // 相当于 func('刘姥姥', '司马姥姥', '欧阳姥姥')

// 2 使用扩展运算符 复制数组
const arr01 = [100,200,300,400,500];
//const arr02 = arr01;      // arr01将地址传递给arr02,两个变量指向同一个数组
const arr02 = [...arr01];   // 使用[]创建新数组,将arr01转为参数序列放在新数组中

// 3 合并数组
const arr03 = [...nums, ...arr01, '刘姥姥'];

// 4. 也可以将可遍历对象(伪数组)转为逗号分隔的参数序列
// 将可遍历对象转为纯数组
const liBoxs = document.querySelectorAll('.news li');
const arr04 = [...liBoxs];
const arr05 = [...'Hello World'];

② 把多个值合并到一个数组中(把参数序列变为数组)

js
1. rest 参数
2. 解构赋值中应用
js
 // 1 rest 参数
function func(...args) {
    console.log(args);  // [100,200,300,400,500]
}
func(100,200,300,400,500);
console.log('');


// 2 解构赋值中的应用 
const [a1,a2,...a3] = ['刘姥姥','马姥姥', '司马姥姥', '欧阳姥姥', '爱新觉罗姥姥'];
console.log(a1);  // 刘姥姥
console.log(a2);  // 马姥姥
console.log(a3);  // ['司马姥姥', '欧阳姥姥', '爱新觉罗姥姥']

Array 构造函数本身新增的属性方法

js
Array.of()			创建新的数组,参数作为数组中的元素,参数数量不固定。
Array.of(12)		参数仅仅传一个数字,这个数字被当做元素,而不是长度,与New Array()类似。
Array.from()		将可遍历对象或伪数组转为纯数组
let arr = [...伪数组] 可将伪数组转为纯数组
js
// 创建数组
const arr01 = Array.of(100,200,300,400,'欧阳姥姥', [1,2,3], '司马姥姥');
const arr02 = Array.of(12);
const arr03 = new Array(12);
console.log(arr01);	// [100,200,300,400,'欧阳姥姥', [1,2,3], '司马姥姥']
console.log(arr02);	// [12]
console.log(arr03);	// [,,,,,,,,,,,]长度12
console.log('');


// 将伪数组转为纯数组
const liBoxs = document.querySelectorAll('.news li');

const arr03 = Array.from(liBoxs); // [li,li,li,li,li]
const arr04 = Array.from('He');
console.log(arr03); // [li,li,li,li,li]
console.log(arr04);	// ['H','e']

Array 的实例新增的属性方法

ES5(旧方法):

js
修改器方法:
push()			在数组的后面添加元素,返回添加元素后数组的长度
unshift()		在数组的前面添加元素,返回添加元素后数组的长度
pop()			删除最后一个元素,返回被删除的元素
shift()			删除第一元素,返回被删除的元素
splice()		新增或删除,替换数组指定位置,指定数量元素(索引和长度),和元素,返回值是数组中被操作的元素
sort()			数组排序,返回排好序的数组
reverse()		翻转数组,返回翻转好的数组

访问器方法:
concat()		将多个数组连接成一个,返回连接好的数组,参数是数组,可以是任意个
slice()			截取数组中一部分返回新数组,指定开始位置和结束位置
join()			将数组中所有的元素合并成一个字符串并返回,参数指定分隔符,默认是逗号

参数是(回调函数,[指定])	   
				可以只写回调函数,若没有指定参数,会从数组本身的第一个元素获取数据。
				若回调函数return true,满足条件,返回值,回调函数中的参数都是
                item index array形式	func(item,index,array)[每一个元素][索引][数组本身]
				
indexOf()		返回指定元素在数组第一次出现的位置,不存在返回-1
lastIndexOf()   返回指定元素在数组最后一次出现的位置,不存在返回-1
forEach()		遍历数组,在原数组直接读取或修改数据,没有返回值
filter()		返回由满足复合条件的元素组成的新数组,如果回调函数返回true,表示满足复合条件
map()			返回由回调函数的返回值组成的新数组,新数组长度与原数组一致
every()			只有每个回调函数都返回true,every方法才返回true,否则every方法返回true
some()			只有有一个回调函数返回true,some方法就返回true		
reduce()		用于累计运算,最后一次回调函数的返回值作为reduce方法的返回值
reduceRight()	reduce()从左到右遍历,reduceRight从右到左遍历
js
arr.reduce(pre,item) 传入两个参数(上一个的返回值pre,当前所在元素) ,返回一个新

ES6+(新方法):

js
参数是(回调函数,[指定])	   
				可以只写回调函数,若没有指定参数,会从数组本身的第一个元素获取数据。
				若回调函数return true,满足条件,返回值,回调函数中的参数都是
                item index array形式	func(item,index,array)[每一个元素][索引][数组本身]
				回调函数都是同步执行的

find()				返回第一个满足条件的元素,参数是回调函数
findIndex()			返回第一个满足条件的元素的索引,参数是回调函数,找不到则返回 -1
fill()				使用固定的值替换到原来的元素值,修改器方法		
keys()				返回遍历器对象
values()			返回遍历器对象
entries()			返回遍历器对象
flat()				实现数组扁平化,参数用数字指定层级,可以用Infinity
flatMap()			先对数组map,再进行深度是1的flat,
includes()			判断是否包含指定的元素,参数是[''][位置开始],默认是0,返回布尔值
at()				根据索引读取元素,可以使用负数,负数表示倒数第几个

数组对象的属性方法ES6

js
// 定义数组
const users = [
    {name: '刘备', age:15, address:'上海'},
    {name: '关羽', age:43, address:'苏州'},
    {name: '张飞', age:41, address:'无锡'},
    {name: '诸葛亮', age:45, address:'杭州'},
    {name: '向华强', age:36, address:'宁波'},
    {name: '曹操', age:54, address:'南京'}
];
/find(回调函数) 返回第一个满足条件的元素
// 查找第一个年龄大于等于45的元素
console.log(users.find(item => item.age >= 45));
// 查找第一个年龄大于等于45的元素的索引
console.log(users.findIndex(item => item.age >= 45));


/fill(回调函数) 使用固定的值替换到原来的元素值 数组的每个元素都被替换了
// 填充数组
console.log(users.fill());
console.log(users.fill(250));	//每个元素都是250的数组
console.log(users.fill(150, 1, 3));	//索引从1到3元素被替换了
console.log(Array(12).fill('OK'));	//12个"OK"的数组

/keys()	values() entries()
// 数组
const nums = [100,200,300,400,500];
console.log(nums.keys())	//返回遍历器(迭代器)对象
console.log(nums.values())	//返回遍历器(迭代器)对象
console.log(nums.entries())	//返回遍历器(迭代器)对象
console.log('');

/flat()				实现数组扁平化(多维数组转为一维数组),参数用数字指定层级,可以用Infinity
/flatMap()			先对数组map,再进行深度是1的flat,
includes()			判断是否包含指定的元素,返回布尔值
// 定义数组
const numList = [
    [1000, 2000, 3000],
    'hello',
    [
        [10,20,30],
        [
            'a', 
            'b', 
            ['A', 'B', 'C']
        ],
        '小乐'
    ],
    12313,
    [101,202,303]
];
console.log(numList.flat()); //降一维,默认值为1,
console.log(numList.flat(2));	// 降二维
console.log(numList.flat(Infinity)); // 降正无穷,直接降为一维数组。
console.log(numList.flatMap(item => item instanceof Array ? item : item+100));//对数组先进行map操作,然后进行flat层级为1的扁平化。


console.log(nums.includes(300));
console.log(nums.includes(300, 3)); // 是否包含300,从索引3开始
console.log('');

/at()				根据索引读取元素,可以使用负数,负数表示倒数第几个
// at
console.log(nums.at(1));
console.log(nums[1]);

console.log(nums.at(-1));   // 读取倒数第一个元素
console.log(nums.at(-3));   // 读取倒数第三个元素
console.log(nums[-1]);    // undefiend