es6学习


前言

在小北公众号里看到的干货,码住学习。


一、取值

从对象中取值或拼接新的对象属性名,一般操作

let d = {a:1,b:2,c:3}
let a = d.a
let b = d.b
let c = d.c
let g = d.a+d.c

使用解构赋值

let {a,b,c} = obj || {}
let g = a+c

如果想创建的变量名和对象的属性名不一致时

let {a:a1} = obj || {}
console.log(a1) //1

ES6的解构赋值虽然好用。但是要注意解构的对象不能为undefined、null。否则会报错,故要给被解构的对象一个默认值。

二、合并数据

合并数组/对象

let a = [1,2,3],
let b = [1,3,4]
let c = a.concat(b)   //[1, 2, 3, 1, 2, 4]

const obj1 = {a:1}
const obj2 = {b:2}
const obj = Object.assign({},obj2,obj1). //{a:1,b:2}

使用扩展运算符并且去重

let c = [...new Set([...a,...b])],  //1,2,3,4

let obj = {...obj1,...obj2} //{a:1,b:2}

三、关于if中的判断条件

在项目中会遇到各种各样的判断,if过多看起来不太专业的样子

if(
    type == 1 ||
    type == 2 ||
    type == 3 ||
    type == 4 ||
){
   //...
}

使用ES6中数组实例方法includes

let typeList=[1,2,3,4]
if(typeList.includes(type)){
	//...
}

四、数据扁平化

let deps = {
	'采购部':[1,2,3],
	'人事部':[5,8,12],
	'行政部':[5,14,79],
	'运输部':[3,64,105]
}
let member = [];
for (let item in deps){
    const value = deps[item];
    if(Array.isArray(value)){
        member = [...member,...value]
    }
}
member = [...new Set(member)]   // [1, 2, 3, 5, 8, 12, 5, 14, 79, 3, 64, 105]

使用Object对象的values(),返回对象所有value值的组成的数组,es6的flat(),使用Infinity参数,无需知道被扁平化的数组的维度,就可以完成扁平化

member = Object.values(deps).flat(Infinity)

flat()不支持IE

五、获取对象属性值

const name = obj && obj.name;

ES6中的可选链操作符

const name = obj?.name;

es6中新增的运算符** 、**=,||、??、?.、||=、&&=、??=

指数运算符 **,**=

** 这个运算符的一个特点是右结合,而不是常见的左结合。多个指数运算符连用时,是从最右边开始计算的

2** 3** 2 = 2**(3**2)=512

let b = 4;
b **= 3;
// 等同于 b = b * b * b;

链判断运算符|| ,?? ,?.

// 错误的写法
const  firstName = message.body.user.firstName || 'default';

// 正确的写法
const firstName = (message
  && message.body
  && message.body.user
  && message.body.user.firstName) || 'default';

firstName属性在对象的第四层,所以需要判断四次,每一层是否有值,层层判断非常麻烦,因此 ES2020 引入了“链判断运算符”(optional chaining operator)?.,简化上面的写法

const firstName = message?.body?.user?.firstName || 'default';

?.运算符,直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。

??本质上是逻辑运算,它与其他两个逻辑运算符&&和||有一个优先级问题,它们之间的优先级到底孰高孰低。优先级的不同,往往会导致逻辑运算的结果不同。
现在的规则是,如果多个逻辑运算符一起使用,必须用括号表明优先级,否则会报错。

逻辑赋值运算符||=、&&=、??=

// 或赋值运算符
x ||= y
// 等同于
x || (x = y)

// 与赋值运算符
x &&= y
// 等同于
x && (x = y)

// Null 赋值运算符
x ??= y
// 等同于
x ?? (x = y)

这三个运算符||=、&&=、??=相当于先进行逻辑运算,然后根据运算结果,再视情况进行赋值运算。
它们的一个用途是,为变量或属性设置默认值。

六、输入框非空的判断

if(value !== null && value !== undefined && value !== ''){
    //...
}

使用空值合并运算符

if((value??'')!==''){
	//...
}

七、异步函数

const fn1 = () =>{
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1);
    }, 300);
  });
}
const fn2 = () =>{
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(2);
    }, 600);
  });
}
const fn = () =>{
   fn1().then(res1 =>{
      console.log(res1);// 1
      fn2().then(res2 =>{
        console.log(res2)
      })
   })
}

这样嵌套函数调用容易形成回调地狱,使用asycn/await

const fn = async () =>{
  const res1 = await fn1();
  const res2 = await fn2();
  console.log(res1);// 1
  console.log(res2);// 2
}

需要用到并发请求时,使用Promise.all()

const fn = () =>{
   Promise.all([fn1(),fn2()]).then(res =>{
       console.log(res);// [1,2]
   }) 
}

总结

本文仅仅简单的学习了es6的使用和大佬吐槽的废物写法,有责该之。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值