ES6中这些细节你知道吗?

501 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

写在前面:作者主要会集中在部分重点面试问题上,本文并不能作为一篇严谨介绍ES6的文档,仅供各位想要求职的朋友们再回忆回忆,加强记忆部分内容,存在问题请留言指出,以上。 :)

let & const

  • let & const 定义的变量只能在定义后使用, var 定义的变量可以变量提升
  • let & const 都不能重复定义
  • const 定义的常量不可变 请注意基础类型和引用类型的区别

变量的解构赋值

  • ES6支持不完整的解构方式,但目标对象必须是可遍历的
    // 简单描述一下解构赋值
    
    // 不完整解构
    const [a,b] = [1,2,3];
    // a = 1
    // b = 2
    
    const [a,b,c] = [1];
    // a = 1
    // b = undefined
    // c = undefined
    
    // swap
    const [a,b] = [b,a];
    

字符串新增方法

  • includes: 用于判断字符串是否包含某个字符串,且第二个参数皆为开始搜索的index

显然, includes包含了startsWith&endWith

  • repeat: 返回一个新的字符串重复多次之后的结果

注意, repeat接受一个参数,即重复次数,若参数并非正整数,函数会试图向下转换成正整数(当值在(-1, 0)之间的时候会被转换为0)。此外,当参数 < -1 或为 Infinity 时会返回一个RangeError.

  • replaceAll: 现在 ES6 里可以直接使用replaceAll了。

数组新增方法

  • 扩展运算符: 这里要关注的是
    const arr = [1, 2, 3];
    const arr2 = [...arr] // arr2 [1,2,3]
    arr === arr2 // false

注意,只有函数调用时,扩展运算符才可以放在圆括号中,否则会报错。

  • Array.of() :为了弥补Array构造函数存在的问题,即Array(1)Array(1,2)完全不同。此外,若没有参数,则返回一个空数组。
  • Array.fill(): 用于填充数组。

注意,如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。


对象的拓展

  • 对象属性遍历方式

ES6 一共有 5 种方法可以遍历对象的属性。

  • for...in

for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。

  • Object.keys(obj)

Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

  • Object.getOwnPropertyNames(obj)

Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。

  • Object.getOwnPropertySymbols(obj)

Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。

  • Reflect.ownKeys(obj)

Reflect.ownKeys返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。

  • 首先遍历所有数值键,按照数值升序排列。
  • 其次遍历所有字符串键,按照加入时间升序排列。
  • 最后遍历所有 Symbol 键,按照加入时间升序排列。
    Reflect.ownKeys({
        [Symbol()]:100,
        b:100,
        3:100,
        100: 100,
        2:100,
        a:100
    })
    // ['2','3','100','b','a',Symbol()]

上面代码中,Reflect.ownKeys方法返回一个数组,包含了参数对象的所有属性。这个数组的属性次序是这样的,首先是数值属性210,其次是字符串属性ba,最后是 Symbol 属性。


对象新增方法

  • Object.is() Object.is()用来比较两个值是否完全相等。与===不同的是,+0不等于-0NaN等于自身。
  • Object.assign() Object.assign()方法用于对象的合并,将源对象(source)的所有自身的且可枚举属性,复制到目标对象(target)。

我们常用Object.assign来浅复制一个对象——虽然严格来说这种方式并不合理,因为会漏掉可能存在的不可枚举属性。

    let obj = { a: 1 } 
    obj === Object.assign(obj) // true

运算符

  • a**b === Math.pow(a,b)
  • a?.b === (a === null || a === undefined) ? undefined : a.b
  • a ?? b === a === null ? b : a

如果多个逻辑运算符一起使用,必须用括号表明优先级,否则会报错。