es6你用过哪些惊艳的写法

简介: es6在项目中用得非常多,浏览器也支持了很多es6写法,通常为了兼容性,我们会用babel将一些比较高级的语法进行转换,比如箭头函数、Promise、对象解构等等,那么我们项目中有哪些你经常用的es6[1]呢?

es6在项目中用得非常多,浏览器也支持了很多es6写法,通常为了兼容性,我们会用babel将一些比较高级的语法进行转换,比如箭头函数Promise对象解构等等,那么我们项目中有哪些你经常用的es6[1]呢?


本篇是笔者根据以往项目总结所用的es6,希望在项目中有所思考和帮助。


正文开始...


定义常量/变量(const/let)


这是一个百分百有用,是一个闭着眼睛都会的用法,不过我们注意const/let是es6引入的一个块级作用域的关键字,在{}中定义变量{}外部不能访问,并且不存在变量的提升, letconst定义的变量,不能重复定义,用const申明的变量不能重新赋值。

const STATUS = {
  0: '未开始',
  1: '进行中',
  2: '结束了'
};
let userName = 'Maic';


对象/数组解构


项目中会用得非常多,告别那种一一取值再赋值吧

const userInfo = {
  name: 'Maic',
  age: 18,
  number: 10
}
const {name,age} = userInfo;
console.log(name, age);
const {name: nname, ...rests } = userInfo
console.log(nname, rests): // Maic {age: 18, number: 10}
const url = new URL('https://github.com/type-challenges/type-challenges/issues?q=label%3A5+label%3Aanswer');
const search = url.search;
const [, params] = search.split('?');
console.log(params) // q=label%3A5+label%3Aanswer
const arr = [1,2,3,4];
const [first, ...rest] = arr;
console.log(first, rest); // 1 [2,3,4]


对象动态赋值


var key = 'test';
var obj = {
  [key]: 'test'
};


对象合并


const objs = {name: 'Tom', age: 10};
const merge = (target,options) => {
    const ret = Object.assign(Object.create({}), target, options);
    return ret;
}
const nobj = merge(objs, {age: 18})
// or
const nobj2 = {...objs, age:18};


数组合并


const arr = [1,2,3];
// 复制操作
const narr = [...arr];
// or
const [...n2arr] = arr;
// 合并数组
const barr = [4,5,6];
const carr = [...arr,...barr];


Map


Map也俗称集合,项目中你可以用此来维护一组if的条件判断,或是以前策略模式的一组数据,可以用此来优化代码,让业务代码可拓展性更强,从此告别冗余的if else,switch case,这个会用得比较多,用下面一段伪代码来感受一下,

const queryDetail = () => {
  console.log('query detail');
};
const queryList = () => {
  console.log('query list');
}
const queryPic = () => {
    console.log('query pic')
}
const request = new Map([
  ['getDetail', queryDetail],
  ['queryList', queryList]
]);
if (request.has('getDetail')) {
  request.get('getDetail')();
}
if (!request.has('queryPic')) {
  request.set('queryPic', queryPic);
}
// or 循环执行
request.forEach(fn => {
    fn();
})
request.get('queryPic')();
console.log(request.entries(request));
// 获取所有的值
console.log(request.values(request));
// 获取所有的key
console.log(request.keys(request));
/*
[Map Entries] {
  [ 'getDetail', [Function: queryDetail] ],
  [ 'queryList', [Function: queryList] ],
  [ 'queryPic', [Function: queryPic] ]
}
*/


Map常用的方法


const map = new Map();
Reflect.ownKeys(map.__proto__);
/**
[
  0: "constructor"
  1: "get"
  2: "set"
  3: "has"
  4: "delete"
  5: "clear"
  6: "entries"
  7: "forEach"
  8: "keys"
  9: "size"
  10: "values"
  11: Symbol(Symbol.toStringTag)
  12: Symbol(Symbol.iterator)
]
*/


对象转Map


const obj = {a:1,b:2};
const map = new Map(Object.entries(obj));
/*
  等价于
  const map = new Map([
    ['a',1],
    ['b',2]
  ]);
*/
console.log(map);// Map(2) { 'a' => 1, 'b' => 2 }


Map转对象


var map2 = new Map([['a','123'],['b','234']])
Object.fromEntries(map2.entries()) // {a: '123', b: '234'}


WeakMap


Map的区别是WeakMap是一种弱引用,WeakMapkey必须是非基础数据类型。WeakMap没有遍历的entrieskeysvaluessize方法,只有getsethasdelete方法。

const bodyDom = document.getElementsByTagName('body')[0];
const weakMap = new WeakMap();
weakMap.set(bodyDom, 'bodyDom');
console.log(weakMap.get(bodyDom));


Set


一般我们在项目常用去重操作,或者过滤数据处理

var newset = [...new Set([1,1,2,3])]
  console.log(newset); // 1,2,3
  var arrsSet = new Set();
  arrsSet.add({name: 'Maic'}).add({name: 'Tom'})
  console.log([...arrsSet]);// [ { name: 'Maic' }, { name: 'Tom' } ]
  console.log(newset.has(1)) // true

根据某个字段找出两组数据中相同的数据,并合并

const data1 = [
  {price:100,attr: 'nick'}, 
  {price: 200,attr: '领带'}
];
const data2 = [
  {price:200,attr: '眼镜'}, 
  {price: 5000,attr: '戒子'}, 
  {price:100,attr: 'nick'}
];
const findSomeByKey = (target1, target2, key) => {
    const target2Set = new Set([...target2]);
    const ret = [];
    const tagret = target1.map(v => v[key]);
    target2.forEach(v => {
      Object.entries(v).forEach(s => {
          const [, val] = s;
          if (tagret.includes(val)) {
              const curent = target1.find(v => v[key] === val);
              ret.push(v, curent)
          }
      })
    })
    return ret
}
findSomeByKey(data1, data2, 'price');
/*
[
  {price: 200, attr: '眼镜'},
  {price: 200, attr: '领带'},
  {price: 100, attr: 'nick'},
  {price: 100, attr: 'nick'}
]


Set的常用方法


const nset = new Set();
console.log(Reflect.ownKeys(nset.__proto__));
/*
[
  0: "constructor"
  1: "has"
  2: "add"
  3: "delete"
  4: "clear"
  5: "entries"
  6: "forEach"
  7: "size"
  8: "values"
  9: "keys"
  10: Symbol(Symbol.toStringTag)
  11: Symbol(Symbol.iterator)
]
*/


WeakSet


没有循环,没有get,不太常用

const nweakSet = new WeakSet([['name','Maic'],['age',18]]);
console.log(nweakSet);
console.log(Reflect.ownKeys(nweakSet.__proto__));
/**
   "constructor"
    1: "delete"
    2: "has"
    3: "add"
    4: Symbol(Symbol.toStringTag)
*/


Reflect


这是es6中比较新的api

// 判断对象熟悉是否存在
const nobj = {a: 1}
if ('a' in nobj) {
    console.log('存在')
} else {
  console.log('不存在')
}
// or
console.log(nobj.hasOwnProperty('a'));
// or
console.log(Object.hasOwn(nobj, 'a'))
// now
Reflect.has(nobj, 'a');
// 向对象中添加属性
Reflect.defineProperty(obj,'b', {value: 22})
console.log(nobj); // {a:1,v:2}
// 删除对象属性
Reflect.deleteProperty(nobj, 'a');
console.log(nobj); // {b:22}
// 调用函数
function f() {
  this.age = 18;
  this.arg = [...arguments];
  console.log(this.arg,this.age); // [1,2] 18
}
Reflect.apply(f, this, [1,2]);
// 相当于过去这个
Function.prototype.apply.call(f,this,[1,2])
// 遍厉对象,获取key
console.log(Reflect.ownKeys(nobj));// ['a', 'b']


Proxy


es6对象代理,劫持对象,在vue3中实现双向数据绑定,用Proxy实现一个观察者模式

var bucket = new Set();
var effect = (fn) => {
  bucket.add(fn)
}
const proxyOption = {
  set(target, key, val, receiver) {
      const result = Reflect.set(target, key, val, receiver);
      bucket.forEach(item => {
        Reflect.apply(item, this,[])
      })
      return result
  },
  get(target, key,receiver) {
      return Reflect.get(target, key)
  }
}
// 创建观察器
const observer = (obj) => new Proxy(obj, proxyOption);
const obj = {
  name: 'Maic',
  age: 18
}
// 将obj添加到观察器中
const userInfo2 = observer(obj);
effect(() => {
    console.log(userInfo2.name, userInfo2.age);
});
userInfo2.name = 'Tom'; // 触发Proxy


async/await


这个用得太多了,异步变成同步操作,async定义的一个函数,会默认返回一个Promise,注意async中不一定有await,但是有await一定得有async

const featchList = () => new Promise((resolve, reject) => {
  resolve({code: 0, message: '成功'})
})
const requests = async () => {
  try {
    const {code} = await featchList();
  } catch (error) {
      throw error;
  }
  console.log(code, '=code');
}
requests();


Class


class Utils {
   constructor(name, age) {
     Object.assign(this, {name, age});
     // or
     /*
       this.name = name;
       this.age = age;
     */
   }
 }
 const utils = new Utils('utils', 18)


函数默认参数


function test(name = 'Maic') {
    console.log(name)
}


箭头函数


不过要注意箭头函数的一些特性,比如没有没有自己的this,不能被实例化,也不能用bind,call之类的

const request = () => {};
// 以前
const requestFn = function() {}


总结


1、常用的letconst


2、对象解构,扩展运算符,数组解构等


3、Map,Set,Reflect,Proxyclass箭头函数等常见的运用


4、本文示例code example[2]

相关文章
|
9天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
|
9天前
|
人工智能
千问办公官网入口:阿里AI办公QwenWork产品页和免费网页端链接
千问办公官网含两大入口:一是网页端(qwenwork.cn),即开即用,支持浏览器直接访问;二是阿里云产品页 https://t.aliyun.com/U/JNKJuO 提供免费/付费版详情、功能介绍及使用指南。
|
15天前
|
网络协议 Linux iOS开发
【2026实测】Wireshark下载+安装+汉化+使用教程(图文版,巨详细)
Wireshark 是一款免费开源的网络协议分析工具,可实时捕获、解析并可视化数据包,助你诊断网络故障、分析通信协议(如HTTP、DNS、TCP等)。支持Windows/macOS/Linux,含中文界面,新手入门便捷。(239字)
|
9天前
|
人工智能 API 内存技术
刚刚 DeepSeek V4.1 Flash 开启内测,1 分钟教你用上!
刚刚 DeepSeek 内测群发布了 DeepSeek V4.1 Flash 中间版本内测的消息,这次的模型采用了新的结构,原生支持多模态、能力更强、速度更快、且成本更低。
1899 15
|
8天前
|
IDE 开发工具
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
Qoder国际版上线全新内置大模型Sonus(/ˈsoʊnəs/),全球领先,专精超长任务执行与电脑操作(Computer Use)。配合Qoder桌面端0.2.3版本,可自主完成编程、金融建模、科研及表格制作等复杂工作。现全面支持Qoder全系产品,效率提升3.2倍。
985 1
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
|
14天前
|
人工智能 运维 BI
阿里云千问办公QwenWork深度解析:基于Qwen3.8,六大核心能力重构企业全自动化工作流与计费选型指南
传统AI办公工具大多停留在对话问答、文档摘要、简单文案生成层面,只能完成单点碎片化任务,无法自主拆解复杂业务流程,很难串联多工具、多文档、外部业务系统完成端到端完整工作交付。很多企业在落地AI办公的时候,需要组合多款不同工具,来回切换界面,手动复制粘贴中间结果,智能化改造落地门槛居高不下。千问办公QwenWork是整合多款智能体产品能力打造的一体化企业办公智能体平台,底层基座依托Qwen3.8大模型,打通桌面端Agent、云端Agent、企业协同Agent三种运行形态,不再局限简单问答,接收业务目标之后自主拆解任务步骤,调用各类工具,处理文档、表格、浏览器自动化、数据查询,直接输出可交付的办公
1667 4
|
10天前
|
缓存 人工智能 自然语言处理
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
本文是阿里云百炼平台Qwen3.8-Flash大模型的选型接入指南,作为兼顾性能与响应速度的高性价比多模态模型,它支持百万级上下文窗口、全场景多模态输入与完整智能体能力矩阵,适配编程辅助、智能体协作等核心场景。文中同步梳理了最新下调的阶梯定价、夜间4折等优惠活动,搭配OpenAI兼容流式调用示例,帮助开发者低成本快速落地高并发AI应用。
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
|
15天前
|
缓存 数据可视化 开发工具
DeepSeek Harness 怎么更新?dsh 更新完整指南:更新本体(npx、npm、源码)与更新插件两种方式
DeepSeek Harness 的更新分两层:本体更新(npx 自动最新、npm update -g、源码 git pull)与插件更新(插件市场点更新、命令行覆盖安装)。本文按「准备 → 更新本体 → 更新插件 → 更新后检查」四步走,覆盖新手常见疑问。
1800 1
DeepSeek Harness 怎么更新?dsh 更新完整指南:更新本体(npx、npm、源码)与更新插件两种方式
|
11天前
|
SQL 人工智能 前端开发
QoderWake 1.0 正式发布:从桌面里的 Agent,到工作现场的数字员工
QoderWake v1.0正式发布:企业级数字员工团队平台。支持“一句话建岗”,预置10类特训岗位;Waker常驻钉钉/飞书群,@即响应、自动协作、跨任务记忆;具备定时/事件/API多触发方式与统一任务看板;已沉淀27.6万条记忆、12.3万项技能,助力组织实现人机协同增效。
815 2
|
8天前
|
缓存 测试技术 API
DeepSeek V4.1 Flash 内测接入:改个模型名即可调用(附代码)
DeepSeek V4.1 Flash 内测不用申请,base_url 不变、改个模型名就能调,9/10 到期。本文讲清接入、计费限流与多模态注意点。
827 0
DeepSeek V4.1 Flash 内测接入:改个模型名即可调用(附代码)

热门文章

最新文章