ES6注意点

  1. let && const

    • 拥有块级作用域
    • 不可重复声明
    • 暂时性死区 (作用域内声明前, 不可用, 报错)
    • 未声明前, typeof也是直接报错, 但typeof一个为定义的变量不会报错, 输出undefined (typeof不再安全)
    • const,声明必须赋值 (并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动)
    • let、const、class声明的全局变量,不属于顶层对象的属性。从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
    • globalThis 全局对象(提案)
  2. 解构

    • 字符串也可以解构赋值。 const [a, b, c, d, e] = ‘hello’;
    • 解构赋值时,如果等号右边是数值和布尔值,则会先转为对象
    	let {toString: s} = 123;
    	s === Number.prototype.toString
    
  3. 字符串方法

    • includes(), startsWith(), endsWith() ,padStart(),padEnd(), padStart(),padEnd()
  4. 数字

    • Number.isFinite(), Number.isNaN() 与 isNaN() 区别, isNaN()会先转换成数字, 如 isNaN(‘a’) //true
    • Number.isInteger(), Number.isSafeInteger()
    • Math.sign方法用来判断一个数到底是正数、负数、还是零
    • 指数运算符(**)
  5. 函数

    • length属性 , 含义是,该函数预期传入的参数个数, 指定了默认值后,该参数不被统计
    • rest 参数(形式为…变量名),rest 参数之后不能再有其他参数
    • name属性, 函数名 var f = function () {}; // es5 f.name=> “” // es6 f.name=> “f”
    • 箭头函数内的this对象,就是定义时所在的对象
    • 箭头函数不可以当作构造函数
    • 箭头函数不可以使用arguments对象
    • 箭头函数不能用作 Generator 函数
  6. 数组

    • 扩展运算符, 复制数组, 合并数组
    • 与解构赋值结合 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) // [, , ,]
  7. 对象

    • 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() (键值对数组)
  8. set / map

    • 在 Set 内部,两个NaN是相等
    • Map 的遍历顺序就是插入顺序
  9. 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
  10. 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
  1. 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)
    			})
    
    1. await命令只能出现在 async 函数内部,否则都会报错

猜你喜欢

转载自blog.csdn.net/zdhanunity/article/details/95303100
今日推荐