【ES6】数组新增拓展

简介: 【ES6】数组新增拓展

数字化管理平台

Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus

权限系统-商城

个人博客地址

一、新增静态方法

  • Array.of() 将参数中所有值作为元素形成数组。
console.log(Array.of(1, '2', true)); // [1, '2', true]

Array.from(arrayLike, mapFn?, thisArg?) 将类数组对象或可迭代对象转化为数组。

arrayLike 想要转换的类数组对象或可迭代对象(含有 length 属性,且元素属性名必须是数值或者可转换为数值的字符)。

mapFn 可选,map 函数,用于对每个元素进行处理,放入数组的是处理后的元素。

thisArg 可选,用于指定 map 函数执行时的 this 对象。

let map = {
    do:function(n){
        return n * 2
    }
}
let arrayLike = [1,2,3]
console.log(Array.from(arrayLike,function(n){
    return this.do(n);//this指向map对象
},map));// [2, 4, 6]

二、新增实例方法

  • map() 映射 - 一个对一个
// 一、返回开平方之后的数组
let arr = [1, 2, 4];
let result = arr.map(v => Math.sqrt(v));
console.log(result);// => (3) [1, 1.4142135623730951, 2]
// 二、根据成绩返回对应的结果数组
let scores = [24, 56, 87, 100];
let result2 = arr.map(v => v >= 60 ? '及格' : '不及格');

filter() 过滤

// 一、过滤大于 60 的值并返回符合条件的数组
let arr = [10, 30, 50, 70, 90]
let result = arr.filter(v => v > 60);
console.log(result); // => (2) [70, 90]
// 二、 商品价格过滤
let goods = [{
        good: '男士衬衫',
        price: 100
    },
    {
        good: 'LV',
        price: 12345
    },
    {
        good: '腰包',
        price: 40
    },
    {
        good: '香奈儿',
        price: 25610
    }
]
let result = goods.filter(obj => obj.price >= 10000);
console.log(result)

forEach() 迭代

let arr = ['apple', 'banana', 'orange', 'kiwi fruit'];
arr.forEach((v, i, arr) => console.log("v:", v, "i:", i, "arr:", arr));

reduce() 统计 (如:购物车商品求总价)

let arr = [1,2,3,4,5,6,7,8,9,10];
// 一、求和
let result = arr.reduce((temp, item, index) => {
  console.log("temp:",temp,"item:",item,"index:",index);
  // temp 每一次计算的临时结果(第一次将第一个数作为初始结果),作为下一次的初始结果
  // item 数组中每一项的值
  // index 数组中每一项值对应的索引,索引从第二个值开始(索引为1)
  return temp + item;
})
console.log(result);// // => 55
二、 求平均数
let average = arr.reduce((temp, item, index) => {
    if (index !== arr.length - 1) {
        return temp + item;
    } else {
        return (temp + item) / arr.length;
    }
})
console.log(average); // => 5.5

find(callback) 查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。

findIndex(callback) 查找数组中符合条件的元素索引,若有多个符合条件的元素,则返回第一个元素索引。

fill(value,startIndex?,endIndex?) 将一定范围索引的数组元素内容填充为单个指定的值。

value 用来填充数组的值

startIndex 可选。被填充数组的起始索引。默认为0

endIndex 可选。被填充数组的结束索引。默认为数组最后一个索引

copyWithin() 将一定范围索引的数组元素修改为此数组另一指定范围索引的元素。

console.log([1, 2, 3, 4].copyWithin(0,2,4)); // [3, 4, 3, 4]
// 参数1为负数表示倒数
console.log([1, 2, 3, 4].copyWithin(-2, 0)); // [1, 2, 1, 2]

entries() 遍历键值对

for(let [key, value] of ['a', 'b'].entries()){
    console.log(key, value);
}
// 0 "a"
// 1 "b"
// 不使用 for... of 循环
let entries = ['a', 'b'].entries();
console.log(entries.next().value); // [0, "a"]
console.log(entries.next().value); // [1, "b"]

keys() 遍历键名

for(let key of ['a', 'b'].keys()){
    console.log(key);
}
// 0
// 1

values() 遍历键值

for(let value of ['a', 'b'].values()){
    console.log(value);
}
// "a"
// "b"
  • includes(value,startIndex) 数组是否包含指定值
  • value 包含的指定值
  • startIndex 可选。搜索的起始索引,默认为0
  • flat(number) 嵌套数组转一维数组
  • number 可选。指定转换的嵌套层数
console.log([1 ,[2, 3]].flat()); // [1, 2, 3]
// 指定转换的嵌套层数
console.log([1, [2, [3, [4, 5]]]].flat(2)); // [1, 2, 3, [4, 5]]
// 不管嵌套多少层
console.log([1, [2, [3, [4, 5]]]].flat(Infinity)); // [1, 2, 3, 4, 5]
// 自动跳过空位
console.log([1, [2, , 3]].flat());<p> // [1, 2, 3]
  • flatMap(callback,thisObj) 先对数组中每个元素进行了的处理,再对数组执行 flat() 方法
  • callback 遍历函数。该遍历函数可接受三个参数:当前遍历的元素、当前遍历元素对应的索引、原数组
  • thisObj 可选。指定遍历函数中 this 的指向

三、拓展运算符

扩展运算符又叫三点运算符,可以用来展开与合并

3.1 作为展开运算符

  • 使用方式1:利用展开运算符进行拼接数组
var arr = [1,2,3,4,5]
var changeArr = [...arr,7,8,9]
console.log(arr) //[1,2,3,4,5]
console.log(changeArr) //拼接为[ 1, 2, 3, 4, 5, 7, 8, 9 ]

使用方式2:利用展开运算符进行拼接对象

let obj1 = { a: 1, b: 2, c: {changeName: 'd'}};
let obj2 = { ...obj1,d:4,f:789};
console.log(obj1); // { a: 1, b: 2, c: { nickName: 'd' } }
console.log(obj2); // { a: 1, b: 2, c: { nickName: 'd' }, d: 4, f: 789 }

如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性

let obj1 = { a: 1, b: 2, c: {changeName: 'd'}};
let obj2 = { ...obj1,c:{changeName:"被改变的内容"}};
console.log(obj1);  // { a: 1, b: 2, c: { changeName: 'd' } }
console.log(obj2);  // { a: 1, b: 2, c: { changeName: '被改变的内容' } }  ,同名所以后面覆盖前面

使用方式3:可以用在给函数传递参数

var arr3 = [1,2,3]
function fn (a,b,c){
    console.log(a,b,c);
}
fn(...arr3)  // 等价于fn(1,2,3)

使用方式4:展开数组获取最大值

var arr4 = [123,456,333,999]
var maxNumber = Math.max(...arr4)
console.log(maxNumber);  // 获取最大值,999

使用方式5:把字符串转为数组

let stringData ='hello world'
let newArray =  [...stringData]
console.log(newArray);  // [ 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' ]

扩展运算符对对象实例的拷贝属于一种浅拷贝

javaScript数据类型分为基本数据类型和引用数据类型

基本数据类型有Number、String、Boolean、Undefined、Null

引用数据类型有Object、 Array、Function

但是需要注意的是,修改对象的部分属性,要注意数据类型

因为扩展运算符对对象实例的拷贝属于一种浅拷贝,这基本数据类型的拷贝会完整的复制一份;当类型是引用数据Object,如果拷贝的时候拷贝的是对象的引用,当原对象发生变化的时候,拷贝对象也会跟着变化,比如:

let obj1 = { a: 1, b: 2, c: {changeName: 'd'}};
let obj2 = { ...obj1};
obj2.b = 888;
console.log(obj1); //{ a: 1, b: 2, c: { changeName: 'd' } }
console.log(obj2); //{ a: 1, b: 888, c: { changeName: 'd' } } 没有影响原对象
obj2.c.changeName = "Excubile"
console.log(obj1); //{ a: 1, b: 2, c: { changeName: 'Excubile' } }
console.log(obj2); //{ a: 1, b: 888, c: { changeName: 'Excubile' } }  影响了原对象

3.2 作为合并运算符

  • 使用方式1:可以将传入的参数合并为数组
// 这是将传入add函数的参数合并为数组
function add(...arr){
    console.log(arr);
}
add(9,9)     //[ 9, 9 ]
add(1,2,3)   //[ 1, 2, 3 ]
add(4,5,6,7) //[ 4, 5, 6, 7 ]

使用方式2:与解构赋值结合起来,用于生成数组

let oldArr = ["海绵宝宝","派大星","章鱼哥","珊迪","蟹老板","痞老板"]
let [First,Second,...newArr] = oldArr;
console.log(First);   //海绵宝宝
console.log(Second);  //派大星
console.log(newArr);  //[ '章鱼哥', '珊迪', '蟹老板', '痞老板' ]   

注意点:扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错

let oldArr = ["海绵宝宝","派大星","章鱼哥","珊迪","蟹老板","痞老板"]
let [First,...newArr,Second] = oldArr;
// 或者:let [...newArr,First,Second] = oldArr;
console.log(First);   //报错
console.log(Second);  //报错
console.log(newArr);  //报错

四、for…of 语句

for...of语句在可迭代对象(包括 ArrayMapSetStringTypedArrayarguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句

let iterable = [10, 20, 30];
for (let value of iterable) {
    value += 1;
    console.log(value);
}
// 11
// 21
// 31

如果你不想修改语句块中的变量 , 也可以使用const代替let

image.png

ES6中数组拓展

相关文章
|
6月前
|
网络架构
ES6中数组新增了哪些扩展?
ES6中数组新增了哪些扩展?
75 1
|
2月前
|
自然语言处理 JavaScript 前端开发
ES6 函数及拓展
ES6 函数及拓展
108 58
|
6月前
|
Serverless 网络架构
ES6学习笔记--函数与数组的拓展
ES6学习笔记--函数与数组的拓展
|
6月前
|
算法 JavaScript 前端开发
ES6学习笔记--对象的拓展
ES6学习笔记--对象的拓展
|
6月前
|
网络架构
ES6函数新增了哪些扩展?
ES6函数新增了哪些扩展?
59 0
|
6月前
ES6对象新增了哪些扩展?
ES6对象新增了哪些扩展?
65 0
|
6月前
|
JavaScript 前端开发 索引
es6 数组新增哪些方法以及使用场景
es6 数组新增哪些方法以及使用场景
57 0
|
网络架构
ES6中数组新增了哪些扩展?
ES6通过扩展元素符…,好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列
|
网络架构
ES6中函数新增了哪些扩展?
ES6允许为函数的参数设置默认值
ES6中对象新增了哪些扩展?
ES6中,当对象键名与对应值名相等的时候,可以进行简写