ES6常用语法入门与提高

116 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

本文记录项目中常用到的语法。可快速上手使用。欢迎访问我的 个人博客

let声明

新增的let类似于我们js常用的var,只是var只能在所声明的代码块内有效

{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1
  1. let声明的变量不能在代码块外访问。
  2. let声明的变量只能在声明之后才能使用。
  3. 不能再相同作用域内重复声明。

实战总结:现在项目基本上都有代码规范和代码检查,基本不会使用到var。

const声明

const声明的常量不可改变,这里指的是变量指向的内存地址不变。对数值、字符串、布尔值等常量不可修改。而对象、数字等变量指向的是指针,可以修改实际存储的属性值。

const a = 1
a = 2 // 失败报错

const b = {name: 'b'}
b.name = 'c'
b // {name: 'c'}
  1. constlet一样块作用域内作用。且声明后才可使用。
  2. const声明变量值类型不可修改,引用类型可以修改内部属性、结构,不可重新赋值。

实战总结:实际使用多数是基础数据类型,不允许修改。

解构赋值

1. 对象结构赋值

可以说是我用的最多也是最好用的语法了。声明变量并从对象或者数组中取某些值。

let {a, b = 2, c: d, e: {f}} = {a: 1, c: 3, e: {f:4}}
a // 1
b // 2 对象没有该属性时赋值默认值
d // 3
c // Uncaught ReferenceError: c is not defined
f //4
  1. 可以一次声明多个变量,直接从对象取值。
  2. c:d: 从对象取值c赋值给变量d
  3. f:可从嵌套的结构中取值
  4. b = 2:对象没有该属性时,即对应的属性值为undefined,赋值默认值

2. 数组解构赋值

解构赋值同样可用于数组,或者具有Iterator 接口的数据结构如 Set。

let [a, [b]] = [1, [2]]
a // 1
b // 2

let [x, y, z = 'c'] = new Set(['a', 'b'])
x // a
z // c
  1. 数据类似对象解构赋值,只是根据索引位置取赋值
  2. 对象和数组解构赋值都可以设置默认值,当匹配不到时,变量会赋值默认值

实战总结:实用性比较强,虽然只是取对象或者数组的属性值,但可以用地方很多。

let x = 1, y=2;
[x, y] = [y, x] // 用于交换属性值
x // 2
y // 1

let params = {a: 1, b: 2}
function test({a, b, c = 3}, d = 4) { // 方法参数的解构赋值
  return { 
    a, // 1
    b, // 2
    c, // 3
    d // 4
  }
}
let {d} = test(params) // 解构赋值直接取值

模板字符串

这个也是比较常用的语法,比如使用echarts的tooltips经常会返回dom结构的字符串,内部拼接多个参数动态渲染。

let a = 'jack'
let b = `My name is ${a}` // 'My name is jack'

let c = `
  <ul>
    <li>text</li>
  </ul>
`
  1. 模板字符串内可以做用变量、表达式、函数等。非常方便。
  2. 空格和换行会被保留。这种拼接结构会很清晰,不需要用 '+' 号做换行的拼接。

对象相关

1. Object.is() 比较两个值是否相等

Object.is('foo', 'foo')
// true
Object.is({}, {})
// false

+0 === -0 //true
NaN === NaN // false

Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
  1. 与严格比较运算符(===)的行为基本一致。
  2. 不同之处只有两个:一是+0不等于-0,二是NaN等于自身。

2. Object.assign()

用于将源对象可枚举属性复制到目标对象

let target = {a: 1, b: 2}
let source = {b: 3, c: {key: 'A'}}
Object.assign(target, source)
target // {a: 1, b: 3, c: {key: 'A'}} a,b覆盖,c新增
source // {b: 3, c: {key: 'A'}}

target.c.key = 'B'
source // {b: 3, c: {key: 'B'}} key也改变
  1. source的属性复制到target,如果没有属性,则新增c,如果有相同属性,则覆盖如b
  2. Object.assign属于浅拷贝,如ctargetsourcec是相同的指针,指向相同的地址。

实战总结:给对象添加多个属性时可以使用,清晰简洁。取多属性给一个新对象时Object.assign({}, {a, b, c}, {d, e})

3.Object.keys(),Object.values(),Object.entries()

这几个用于将对象的key或value转数组

let Jack = {name: 'Jack', age: 18}
Object.keys(Jack) // ['name', 'age']
Object.values(Jack) // ['Jack', 18]
Object.entries(Jack) // [['name', 'Jack'], ['age', 18]]

... 更多知识点待补充

不熟悉ES6的请直接访问阮一峰的教程,强烈推荐。博客很多地方取自该教程。

阮一峰的ES6入门