ES6-ES12新特性

前言:这里只是简单列出ES新特性,以及举例新特性的写法,想要更深入的了解,比如新特性和之前写法的区别、好处、优缺点以及更多的使用场景,可以自行挖掘呦,这里就不一一介绍了。欢迎评论补充。

ES6(2015)

1、let和const

在ES6之前JS是没有块级作用域,在ES6之后,有了块级作用域的概念,const与let都是块级作用域。

{   var a = 1; let b = 2; const c = 3; } 
 console.log(a); // 1
 console.log(b); // Uncaught ReferenceError: b is not defined
 console.log(c); // Uncaught ReferenceError: c is not defined
2、解构赋值

可以方便的从数组或者对象中快速提取值赋给定义的变量。

let obj = { name: "zhu", age: 3 };
let { name, age } = obj;
console.log(name); // zz
console.log(age); // 3
3、模版字符串
var a = "zhuzhu";
var str = 'my name is' + a // 字符串拼接
var str2 = `my name is ${a}`; // 模板字符串
console.log(str); // my name is zhuzhu
console.log(str2); // my name is zhuzhu
4、函数默认参数
function foo(a = 1, b = 2) { // a、b的默认值
      console.log(a) // 3
      console.log(b) // 4
}
foo(3, 4) // 这里不传,打印的就是1、2
5、箭头函数(Arrow function)
() => { }
// 举例
var list = [1, 2, 3, 4, 5];
const newList = list.map(item => item * 2);
console.log(newList); // [2, 4, 6, 8, 10]
6、扩展运算符

延展操作符(三个点...)可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造对象时, 将对象表达式按key-value的方式展开

let objClone = { ...obj };
7、symbol

symbol 是ES6 引入了一种新的基本数据类型(原始数据类型) Symbol ,表示独一无二的值。它是JavaScript 语言的第七种数据类型,前六种是: undefined 、 null 、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
每个从 Symbol() 返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的

// Symbol语法与描述:直接使用 Symbol() 创建新的symbol类型,并用一个可选的字符串作为其描述
const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol('foo');

console.log(typeof symbol1); // "symbol"
console.log(symbol3.toString()); // "Symbol(foo)"
console.log(Symbol('foo') === Symbol('foo')); // false
8、新的数据结构:Set

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

// 可用于数组去重
const numbers = [54,34,54,2,3,4,1,4,2,2,76,54,78,90,12,34];
console.log([...new Set(numbers)]); // [54, 34, 2, 3, 4, 1, 76, 78, 90, 12]
9、新的数据结构:Map

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

const map = new Map();
map.set('foo', true);
map.set('bar', false);
10、模块化,export 和 export default import

export 和 export default 都可用于导出常量、函数、文件、模块等 ,
export、import可以有多个,export default仅有一个
通过export方式导出,在导入时要加{ },且不能自定义名字,export default不用加{ },且可以自定义名字

function renderHtml(url) { }
module.exports = {
    renderHtml
} // 导出

import { renderHtml } from "./module/renderHtml.js"; // 导入

function renderHtml(url) { }
exports.renderHtml = renderHtml; // 导出

import renderHtml from './module/renderHtml.js' // 导入

ES7(2016)

1、数组方法include

判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。

const arr = [1, 2, 3]
console.log(arr.includes(2)); // true
console.log(arr.includes(4)); // false
2、指数操作符**

相当于Math.pow()

2**10 // 1024
Math.pow(2,10) // 1024

ES8(2017)

1、async/await

Promise可以解决回调地狱的问题,但是链式调用太多,则会变成另一种形式的回调地狱 —— 面条地狱,所以在ES8里则出现了Promise的语法糖async/await,专门解决这个问题。

const runTask = async (code) => {
   await registeredTask(); // 注册任务
};

runTask();
2、padStart()和padEnd()

用来补齐字符串

const str = '5';
console.log(str.padStart(2, '0'));  // 05
console.log(str.padEnd(2, '0'));  // 50
3、Object.values和Object.entries

Object.values()是一个与Object.keys()类似的新函数,但返回的是Object自身属性的所有值,不包括继承的值。
object.entries返回包含对象键名和键值的数组。

var obj = { name: "张三", age: 10 };
Object.values(obj) // ["张三", 10]

for (let [key, value] of Object.entries(obj)) {
      console.log(`${key}: ${value}`)
      // name: 张三
      // age: 10
}
4、函数拓展,es2017规定函数的参数列表的结尾可以为逗号
5、Object.getOwnPropertyDescriptors()

方法用来获取一个对象的所有自身属性的描述符

const obj2 = { name: 'Jine', get age() { return '18' } };
Object.getOwnPropertyDescriptors(obj2)
image.png
6、SharedArrayBuffer对象

SharedArrayBuffer 对象用来表示一个通用的,固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象,它们都可以用来在共享内存(shared memory)上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分离。

let sab = new SharedArrayBuffer(1024); // 必须实例化
worker.postMessage(sab);

ES9(2018)

1、for await...of

异步迭代器,主要用来遍历异步对象

2、promise.prototype.finally(),无论premise失败成功都会走的方法
.then(() => {
       // 成功
}).catch(() => {
      // 失败
}).finally(() => {
      // 成功失败都走这里
});
3、对象的扩展运算符

let obj1 = {c: 3} let obj = {...obj1,d:4}

ES10(2019)

1、trimStart和trimEnd,用来移除字符串首位空白格

var str=" 123"; str.trimStart(); // 123

2、flat和flatMap,用于创建并返回一个新数组
var arr1 = [1, 2, 3, 4]
arr1.map(x => [x * 2]) // [[2], [4], [6], [8]]
arr1.flatMap(x => [x * 2]) // [2, 4, 6, 8]
// 深度为1
arr1.flatMap(x => [[x * 2]]) // [[2], [4], [6], [8]]
3、Object.formEntires

可以把键值对列表转化成一个对象,和 Object.entries() 相对的。

Object.fromEntries([
    ['foo', 1],
    ['bar', 2]
]) // {foo: 1, bar: 2}
4、symbol描述,let dog = Symbol("dog"),dog为描述
5、toString()
6、catch,es2019之前,catch是带有参数,现在不带参数
// 之前 
try {} catch(e) {};
// 现在 
try {} catch() {}

ES11(2020)

1、BigInt,js第八种基本类型,BigInt 可以表示任意大的整数
2、空格合并运算符(??),只有 ?? 左边为 null 或 undefined时才返回右边的值
3、可选链操作符
// 之前写法
const name = (system && system.user && system.user.addr && system.user.addr.province && system.user.addr.province.name) || 'default';
// 之后写法
const name = system?.user?.addr?.province?.name || 'default';

ES12(2021)

1、replaceAll

返回全新字符串,所有符合匹配规则的字符都将被替换掉

var str = "hello word";
// 之前
str.replace(/o/g, "a); // hella ward
// 现在
str.replaceAll("o", "a"); // hella ward
2、promise.any

只要其中一个promise成功,就返回那个已经成功的permise,如果可叠戴对象中没有一个premise成功,就返回一个失败的premise

const promise1 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("promise1");
      //  reject("error promise1 ");
    }, 3000);
  });
};
const promise2 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("promise2");
      // reject("error promise2 ");
    }, 1000);
  });
};
const promise3 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("promise3");
      // reject("error promise3 ");
    }, 2000);
  });
};
Promise.any([promise1(), promise2(), promise3()])
  .then((first) => {
    // 只要有一个请求成功 就会返回第一个请求成功的
    console.log(first); // 会返回promise2
  })
  .catch((error) => {
    // 所有三个全部请求失败 才会来到这里
    console.log("error", error);
  });
3、weakRefs

使用weakRefs的class类创建对对象的弱引用

4、逻辑运算符和赋值表达式

新特性结合了逻辑运算符(&&,||,??)和赋值表达式,
(1)&&=: x &&= y等同于x && (x = y);
(2)||=:x ||= y 等同于:x || (x = y)
(3)??=:x ??= y 等价于: x ?? (x = y);

5、数字分隔符

用下划线 _(U+005F)在数字间进行分隔。
let num = 1_000_000_000

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。