ES6语法和功能概述

ECMAScript 2015, 也称 ES6, 在JavaScript中引入了很多改动. 以下是与ES5相比一些常见的功能和语法的差异。

注意: 普遍被接受的最佳实践是尽量使用const关键词,在循环和需要重新赋值的场景下使用let,下面文章所有ES6的例子中我将用let替换var

目录

  • 变量声明
  • 常量声明
  • 箭头函数语法
  • 模板字符串
  • 隐式返回
  • 键/值简写
  • 方法定义简写
  • 解构 (对相匹配)
  • 数组迭代 (循环)
  • 默认参数
  • 展开语法
  • 类/构造 函数
  • 继承
  • 模板- 导出/导入
  • 承诺/回调

变量和常量的特征比较

下面表格提供简要概述。

关键词 作用域 提升 可以被重新赋值 可以被重新声明
var 函数作用域 Yes Yes Yes
let 块作用域 No Yes No
const 块作用域 No No No

变量声明

ES6引入了let关键字,该关键字声明了无法提升或重新声明的块范围变量。

ES5

var x = 0

ES6

let x = 0

常量声明

ES6引入了const关键词,它不可以被重新声明和重新赋值,但是它不是不变的。

ES6

const CONST_IDENTIFIER = 0 // constants are uppercase by convention

箭头函数

箭头函数表达式语法是创建函数表达式的简洁方法。箭头函数没有自己函数的this,没有原型,不能用于构造函数,也不应该被用于对象方法。

ES5

function func(a, b, c) {} // function declaration
var func = function(a, b, c) {} // function expression

ES6

let func = a => {} // 一个参数
let func = (a, b, c) => {} // 多个参数

模板字符串

字符串插值

表达式可以嵌入模板文字字符串中。

ES5

var str = 'Release date: ' + date

ES6

let str = `Release Date: ${date}`

多行字符串

使用模板文字语法,JavaScript字符串可以跨越多行而无需串联。

ES5

var str = 'This text ' + 'is on ' + 'multiple lines'

ES6

let str = `This text
            is on
            multiple lines`

注意: 空白保留在多行模板文字中。请参阅删除ES6模板字符串中的前导空白

隐式返回

如果使用不带块体的箭头功能,则暗指return关键字,可以将return省略。

ES5

function func(a, b, c) {
  return a + b + c
}

ES6

let func = (a, b, c) => a + b + c // curly brackets must be omitted

键/值 简写

ES6引入了一种较短的表示法,当键值名称相同,简写如下。

ES5

var obj = {
  a: a,
  b: b,
}

ES6

let obj = {
  a,
  b,
}

注意: 这个vue中经常看到components中组件定义,等等。

方法定义简写

当给一个对象分配一个方法时,function关键词可以被忽略。

ES5

var obj = {
  a: function(c, d) {},
  b: function(e, f) {},
}

ES6

let obj = {
  a(c, d) {},
  b(e, f) {},
}
obj.a() // call method a

解构(object matching)

使用大括号将对象的属性分配给它们自己的变量。

var obj = { a: 1, b: 2, c: 3 }

ES5

var a = obj.a
var b = obj.b
var c = obj.c

ES6

let { a, b, c } = obj

数组迭代 (循环)

为了通过数组和其他可迭代对象进行迭代,引入了更简洁的语法。

var arr = ['a', 'b', 'c']

ES5

for (var i = 0; i < arr.length; i++) {
  console.log(arr[i])
}

ES6

for (let i of arr) {
  console.log(i)
}

默认参数

可以使用默认参数初始化函数。

ES5

var func = function(a, b) {
  b = b === undefined ? 2 : b
  return a + b
}

ES6

let func = (a, b = 2) => {
  return a + b
}
func(10) // returns 12
func(10, 5) // returns 15

展开语法

展开语法可用于扩展数组。

ES6

let arr1 = [1, 2, 3]
let arr2 = ['a', 'b', 'c']
let arr3 = [...arr1, ...arr2]

console.log(arr3) // [1, 2, 3, "a", "b", "c"]

展开语法可用于扩展函数参数。

ES6

let arr1 = [1, 2, 3]
let func = (a, b, c) => a + b + c

console.log(func(...arr1)) // 6

类/构造函数

ES6 class在基于原型的构造函数之上引入了语法

ES5

function Func(a, b) {
  this.a = a
  this.b = b
}

Func.prototype.getSum = function() {
  return this.a + this.b
}

var x = new Func(3, 4)

ES6

class Func {
  constructor(a, b) {
    this.a = a
    this.b = b
  }

  getSum() {
    return this.a + this.b
  }
}

let x = new Func(3, 4)
x.getSum() // returns 7

继承

extends关键词创建一个子类。

ES5

function Inheritance(a, b, c) {
  Func.call(this, a, b)

  this.c = c
}

Inheritance.prototype = Object.create(Func.prototype)
Inheritance.prototype.getProduct = function() {
  return this.a * this.b * this.c
}

var y = new Inheritance(3, 4, 5)

ES6

class Inheritance extends Func {
  constructor(a, b, c) {
    super(a, b)

    this.c = c
  }

  getProduct() {
    return this.a * this.b * this.c
  }
}

let y = new Inheritance(3, 4, 5)
y.getProduct() // 60

模块-导出/导入

模块可以通过导出和导入符号在文件间传递代码

index.html

<script src="export.js"></script>
<script type="module" src="import.js"></script>

export.js

let func = a => a + a
let obj = {}
let x = 0

export { func, obj, x }

import.js

import { func, obj, x } from './export.js'

console.log(func(3), obj, x)

承诺/回调

承诺表示异步功能的完成。它们是链接功能的替代方法。

ES5 callback

function doSecond() {
  console.log('Do second.')
}

function doFirst(callback) {
  setTimeout(function() {
    console.log('Do first.')

    callback()
  }, 500)
}

doFirst(doSecond)

ES6 Promise

let doSecond = () => {
  console.log('Do second.')
}

let doFirst = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('Do first.')

    resolve()
  }, 500)
})

doFirst.then(doSecond)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容