-
let && const
- 拥有块级作用域
- 不可重复声明
- 暂时性死区 (作用域内声明前, 不可用, 报错)
- 未声明前, typeof也是直接报错, 但typeof一个为定义的变量不会报错, 输出undefined (typeof不再安全)
- const,声明必须赋值 (并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动)
- let、const、class声明的全局变量,不属于顶层对象的属性。从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
- globalThis 全局对象(提案)
-
解构
- 字符串也可以解构赋值。 const [a, b, c, d, e] = ‘hello’;
- 解构赋值时,如果等号右边是数值和布尔值,则会先转为对象
let {toString: s} = 123; s === Number.prototype.toString
-
字符串方法
- includes(), startsWith(), endsWith(), padStart(),padEnd(), tirmStart(), tirmEnd()
-
数字
- Number.isFinite(), Number.isNaN() 与 isNaN() 区别, isNaN()会先转换成数字, 如 isNaN(‘a’) //true
- Number.isInteger(), Number.isSafeInteger()
- Math.sign方法用来判断一个数到底是正数、负数、还是零
- 指数运算符(**)
-
函数
- length属性 , 含义是,该函数预期传入的参数个数, 指定了默认值后,该参数不被统计
- rest 参数(形式为…变量名),rest 参数之后不能再有其他参数
- name属性, 函数名 var f = function () {}; // es5 f.name=> “” // es6 f.name=> “f”
- 箭头函数内的this对象,就是定义时所在的对象
- 箭头函数不可以当作构造函数
- 箭头函数不可以使用arguments对象
- 箭头函数不能用作 Generator 函数
-
数组
- 扩展运算符, 复制数组, 合并数组
- 与解构赋值结合 const [first, …rest] = [1, 2, 3, 4, 5];
- 将字符串转为真正的数组 […‘hello’]
- Iterator
- Array.from将两类对象转为真正的数组:类似数组的对象和可遍历的对象, Array.from(Set)
- Array.of方法用于将一组值,转换为数组 Array.of(3, 11, 8)
- find() 和 findIndex()
- fill() // let a = []; a.length =100; a.fill(1) // [1,1,1,1,…100个1]
- includes()
- flat() / flatMap() 扁平化数组
- 数组的空位, ES6 则是明确将空位转为undefined // Array(3) // [, , ,]
-
对象
- Object.getOwnPropertyNames 包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)
- Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名
- Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举
- 扩展运算符 // {…{b:2}, a: 1} //{b: 2, a: 1}
- Object.is 跟 === 一样
- Object.assign(target, source1, source2) 将源对象(source)的所有可枚举属性,复制到目标对象(target)(浅拷贝)
- Object.getPrototypeOf() => proto
- Object.keys(),Object.values(),Object.entries() (键值对数组)
-
set / map
- 在 Set 内部,两个NaN是相等
- Map 的遍历顺序就是插入顺序
-
promise
// 加载图片 const preloadImage = function (path) { return new Promise(function (resolve, reject) { const image = new Image(); image.onload = resolve; image.onerror = reject; image.src = path; }); };
- Promise.all / Promise.race
-
Iterator
- 任何数据结构只要部署 Iterator 接口,就可以完成遍历操作 for…of
- 对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的
- 获取 Iterator
let iter = [1,2,3][Symbol.iterator]() iter.next() //{value: 1, done: false} iter.next() //{value: 2, done: false} iter.next() //{value: 3, done: true}
- 调用 Iterator 接口的场合 => 解构赋值, 扩展运算符, yield* , for…of, Array.from(),Map(), Set(), Promise.all / Promise.race
- async
- async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖
- async函数内部return语句返回的值,会成为then方法回调函数的参数
- 没有return , 返回 resolve(undefined)
- async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。
async function f() { throw new Error('出错了'); } f().then( v => console.log(v), ).catch(e=>{ console.log(e) })
- await命令只能出现在 async 函数内部,否则都会报错