ES6~ES13

Posted 转角90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6~ES13相关的知识,希望对你有一定的参考价值。

新ECMA代码执行描述

  • 词法环境:一种规范类型,用于在词法嵌套结构中定义关联的变量、函数等标识符
    • 环境记录
      • 声明式环境记录
      • 对象式环境记录
    • 外部词法环境 Outer
LexicalEnvironment和VariableEnvironment区别
LexicalEnvironment用于处理let/const声明的标识符
VariableEnvironment用于处理var 和 function声明的标识符

let VS const

let 在使用上和var一样,不同的是变量无法提升,存在暂时性死区,无法在定义前访问
const 定义一个常量,一旦定义无法被修改,如果是引用类型,可以通过引用找到对应的对象,修改对象的内容
let 和 const 
1. 不允许重复声明变量,并且都存在暂时性死区,在未定以前无法访问。
2. 不会添加到window上
3. 和位置无关,与执行顺序有关
4. 有块级作用域,块级作用域中定义的函数,可以被外界访问,只能在之后访问

模板字符串

/*
使用一:`内容$var`
使用一:调用函数:fn(参数)  fn`参数$name` 标签模板字符串
*/

function foo(...args)console.log(args)

foo`aaa $name bbb $age`  

/*
[
    [
        "aaa ",
        " bbb ",
        ""
    ],
    "ss",
    22
]
*/

函数增强

形参

// 默认参数:不会对null做判断
function foo (name=\'hyf\',age=18) 
    console.log(name,age)

foo()  // hyf 18
foo(\'myl\',19)  // myl 19

// ES6新增语法  ?? : 判断是否是undefined和null, 
function foo (name,age=18) 
    let _name = name ?? \'hyf\' // 相当于 let _name = (name === null || name === undefined)?\'hyf\':name
    console.log(_name)

/*
1. 默认参数形参尽量写到后面
2. 剩余参数形参尽量写到最后
3. 剩余参数形参不会被length计算
*/

// 与解构一起使用
function foo (name,age = name:\'hyf\',age:18) 
    console.log(name,age)


function foo (name=\'mr\',age=11 = ) 
    console.log(name,age)

箭头函数

  • 箭头函数没有显示原型:let foo = () => ; console.log(foo.prototype) // undefined
  • 箭头函数不绑定this,arguments,super参数

展开运算符

let name = [1,2,3,4]
let str = \'abcd\'
let obj = 
    name:\'hf\',
    age:18,
    

console.log(...name)
console.log(...str)
console.log(...obj) // 无法对不是可迭代对象进行处理

let obj2 = 
    ...obj, // 构建对象字面时可以使用展开运算符
    addr:\'ddd\'

console.log(obj2)

展开运算符是一种浅拷贝:

深拷贝:引用拷贝

浅拷贝:值拷贝

数值的表示

进制表示

二进制:0b
八进制:0o
十六进制:0x

长数字表示

// ES12新增: 使用 _ 进行分割
const money = 1000_0000_0000_0000

Symbol的使用

// 解决变量冲突,变量名独一无二,
const s1 = Symbol()
const obj = 
    [s1]:\'aaa\'


// 描述 ES10
const s2 = Symbol(\'描述\')
console.log(s2.description)

// 获取Symbol对应的key
Object.getOwnPropertySymbols(obj)

// 相同的Symbol
const s3 = Symbol.for(s2.description)
console.log(s3 === s2) // false
const s4 = Symbol.for(s2.description)
console.log(s3 === s4)

// 获取key
Symbol.keyFor(s3)  // \'描述\'

Set的使用

// 里面的元素不能重复
let _set = new Set()

// 添加元素
_set.add(11)
_set.add(10)
_set.add(11)
_set.add(12)
_set.add(12)
_set.add(12)
let obj1 = 
let obj2 = 
_set.add(obj1)
_set.add(obj2)

// 应用场景: 数组的去重

常见属性

  • size: 获取Set中元素的个数

常见方法

  • add(value)
  • delete(value)
  • has(value)
  • clear()
  • forEach(callback,)

WeakSet的使用

弱引用:GC在计数时不会计算在内
1. WeakSet只能存放对象类型
2. 对对像的引用都是弱引用
3. 不可遍历
const weakSet = new WeakSet()
weakSet.add(obj1)
weakSet.add(obj2)
weakSet.add(obj3)
weakSet.delete(obj3)
weakSet.has(obj3) // false

Map的使用

// 可以将对象作为key
const info = name:\'asdf\'
const info2 = age:10

const map = new Map()
map.set(info,99)
map.set(info2,88)
console.log(map)

常见属性

  • size: 获取Map中元素的个数

常见方法

  • set(key,value)
  • get(key)
  • delete(key)
  • has(key)
  • clear()
  • forEach(callback,)

WeakMap

1. WeakMap中的key只能是对象
2. 不可遍历
  • set(key,value)
  • get(key)
  • delete(key)
  • has(key)

ES7

Array includes

arr.includes(item1) // true/false

指数运算符

3**3 相当于 pow(3,3)

ES8

对象相关的属性

// 1. 获取所有的keys
const keys = Object.keys(obj)

// 2. 获取所有的value
const values = Object.values(obj)

// 3. 获取一个数组,可枚举属性key,value
const items = Object.entries(obj)
for (let [key,val] of items) 
    console.log(key,val)

字符串填充

let str = \'123\'

str = str.padEnd(4,\'p\')  // 123p

str = str.padStart(6,\'0\') // 00123p

Trailing Commas 尾部逗号

function foo(item,item2,)

Object Descriptors

ES9

  • Promise finally

ES10

flat flatMap

flat会按照一定的深度进行递归遍历,将遍历到的元素和子数组中的元素组成一个新的数组,进行返回,拉平
let arr = [1,2,3,[34,5,6,7,[9,88,90]]]
let arr1 = arr.flat(1)  // 默认拉平1层, Infinity表示无限拉平
// flatMap
let mes = [\'hello hyf\',\'aaa bbb\']
let newMes = mes.flatMap((item)=>
    return item.split(\' \')
)
console.log(newMes)

Object.fromEntries

let obj = 
    name:123,
    age:1234

let entries = Object.entries(obj)

let obj1 = Object.fromEntries(obj)

// 应用场景
let url = new URLSearchParams(\'name="hyf"&age=12\')
let urlObj = Object.fromEntries(url)

去除空格

  • str.trimStart()
  • str.trimEnd()

ES11

BigInt

9007199254740991n+100n 一定正确

?? 空值合并

var name = name1 ?? \'默认值\'  // 当name1为null或undefined时使用默认值

可选链

/*
?.
*/
obj?.frind?.running?.()

Global This

通过globalThis获取全局对象

for...in标准化

对for...in 遍历对象进行标准化,遍历的是key

allSettled(ES11)

ES12

FinalizationRegistry

/*
当一个在注册表中注册的对象被回收时,请求在某个时间点调用一个清理回调finalizer
通过register进行注册
*/

let obj = name:\'hyf\',age:18
const finalRegistry = new FinalizationRegistry(()=>
    console.log(\'回收了\')
)
finalRegistry.register(obj)

obj = null // 回收了 

WeakRefs

let obj = new WeakRef(o)  // 弱引用
obj.deref().name

逻辑赋值运算符

let message ||= \'默认值\'  // message=message || \'默认值\'

let ms ??= \'默认值\'   // ms = ms ?? \'默认值\'

obj && obj.running && obj.running()

let obj = obj && obj.name  // obj为undefined时 赋值给obj
let obj1 &&= obj1.name

ES13

方法

at()

Object.hasOwn(obj,propKey)

  • 防止对象中有自己的hasOwnProperty方法
  • 更广泛

class中的新成员

class Person
    height = 1.88  // 公共实例字段
    #intro = \'this is private\'  // 私有属性
    static total = 30  // 类属性
    
    constructor(name,age)
        this.name = name
        this.age = age
    
    log()
        console.log(this.height,this.#intro)
    
    
    // 静态代码块
    static 
        console.log(this.height,this.#intro,total)
    

let p = new Person(\'hyf\',18)
console.log(p.name,p.height,p.age)

总结:

  • 公共实例属性
  • 私有属性
  • 类属性 static
  • 静态代码块

以上是关于ES6~ES13的主要内容,如果未能解决你的问题,请参考以下文章

Node v13 / Jest / ES6 — 原生支持没有 babel 或 esm 的模块

JavaScript的ES6语法13下一代ES的展望

ES6学习手册(13)

ES6深入浅出-13 Proxy 与 Reflect-2.Proxy 代理

ES6深入浅出-13 Proxy 与 Reflect-1.Reflect 反射

ES6学习手册(13)