提示
本文主要介绍 ES6 的语法。@ermo
# ES6
ECMAScript 2015 也成为 ECMAScript 6 或者 ES6。
主流浏览器对 ES6 的支持:
| Chrome | Edge | FireFox | Safari | Opera | 
|---|---|---|---|---|
| Chrome 58 | Edge 14 | Firefox 54 | Safari 10 | Opera 55 | 
| 2017.1 | 2016.8 | 2017.3 | 2016.7 | 2018.8 | 
# let
可以使用 let 关键字在代码块内申明变量,作用域也只在该代码块内。
var x = 10
console.log(x) // 10
{
    let x = 2
    console.log(x) // 2
}
console.log(x) // 10
# const
const 关键字与 let 关键字意义相同,也可以在代码块中声明变量,区别是 const 声明的变量不能重新赋值。一般用定义常量字段。
var x = 2
console.log(x) // 2
{
    const x = 10
    console.log(x) // 10
}
console.log(x) // 2
# 箭头函数
箭头函数是函数表达式的简写语法。
使用箭头函数无需原来的 function 和 return 关键字,也不需要包裹代码块的花括号 {}。
// ES5 语法
var add = function(x, y) {
    return x + y
}
var num = add(1, 2)
console.log(num)
// ES6 语法
var addPro = (x, y) => x + y
var num1 = addPro(1, 2)
console.log(num1)
箭头函数没有自己的 this 变量,因此这种简写对对象方法(getter/setter)不适用。
箭头函数必须先定义,后使用。
推荐使用 const 关键字声明箭头函数,比 var 更加安全,函数一般都是一个常量值。
定义箭头函数时,在函数代码块只有一行的情况下可以省略花括号 {} 和 return 关键字。
const a = (a, b) => { return a + b }
// 等同于
// const a = (a, b) => a + b
console.log(a(2, 2)) // 4
# 扩展运算符(...)
扩展运算符就是取出参数对象中的所有可遍历属性,拷贝到当前对象中。
const a1 = ['a', 'b', 'c']
const a2 = ['e', 'f', ...a1]
console.log(a2.length) // 5
let b1 = {a : 1, b: 2}
let b2 = {...b1}
console.log(b2.a)
console.log(b2.b)
# for/of 循环
for/of 语句可以变量任何可迭代对象的值,比如有 Arrays、Strings、Maps、NodeLists 等。
语法为:
for(变量名 of 迭代对象) {
    // 循环代码块
}
迭代对象为数组,参考示例:
const languages = ['java', 'js', 'php', 'python']
let str = ''
for (const lan of languages) {
    str = str + ',' + lan
}
console.log(str) // ,java,js,php,python
迭代对象为数组,参考示例:
const js = "JavaScript"
let text = ''
for (const s of js) {
    text += s + ''
}
console.log(js) // JavaScript
# Map
可以使用对象作为 Map 的 key。
const codeMap = new Map([
    ["js", 1],
    ["java", 2],
    ["c++", 3]
])
console.log(codeMap)
# Set
Set 是一组不重复的集合。
const letters = new Set()
letters.add('a')
letters.add('a')
letters.add('b')
letters.add('c')
console.log(letters)
# 类 class
使用关键字 class 创建一个类的模板。并且需要在模板中添加一个名为 constructor 的方法。
class User {
    constructor(name, age) {
        this.name = name
        this.age = age
    }
}
上例中创建一个名为 User 的类,并且这个类有 name 和 age 2个属性。
类定义完成后可以进行使用:
const user1 = new User('Lily', 18)
const user2 = new User('Tom', 19)
console.log("name: " + user1.name + ", age: " + user1.age)
# Promise
Promise 是 ES6 的一个内置类,用于解耦回调函数,可以将多个串联的异步函数链式的串联起来。
下例中,将当前页面在浏览器打开,3秒后页面将出现内容。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="demo"></div>
    <script>
        const p = new Promise(function(myResolve, myReject) {
            setTimeout(function() {
                myResolve('等待3秒后执行完成')
            }, 3000)
        })
        p.then(function(value) {
            document.getElementById('demo').innerHTML = value
        })
    </script>
</body>
</html>
# 基本类型 Symbol
Symbol 和 Number、String、Boolean 类型相同,也是一种新增的基本类型。
Symbol 代表其他代码无法访问的隐藏唯一标识。
const person = {
    firstName: 'John',
    lastName: 'Sam',
    age: 18
}
let id = Symbol('id')
person[id] = 12345
console.log(person)
console.log(Symbol('name' === Symbol('name'))) // Symbol(false)
# 参数默认值
ES6 允许参数添加默认值:
function fun(x, y = 12) {
    return x + y
}
let n = fun(1)
console.log(n) // 13
# 可变参数 ...
ES6 可以在函数参数定义中添加可变数组:
function sum(...arr) {
    let n = 0
    for (const i of arr) {
        n += i
    }
    return n
}
console.log(sum(1, 2, 3, 4, 5, 6, 7, 8, 9))
# String.includes()
includes 方法用于判断一个字符串中是否包含另一个字符串:
let website = 'https://ermo.cc'
let isInclude = website.includes('ermo')
console.log(isInclude) // true
# String.startsWith()
startsWith 方法用于判断当前字符串是否以另一个字符串开头:
let str = 'hello world'
console.log(str.startsWith('hello')) // true
console.log(str.startsWith('Hello')) // false
# String.endsWith()
endsWith 用于判断当前字符串是否以另一个字符串结尾:
let str = 'hello world'
console.log(str.endsWith('world')) // true
console.log(str.endsWith('World')) // false
# Array.from()
Array.from 可以将一个可迭代对象转换为一个数组:
let str = 'ABCDEFG'
let strArr = Array.from(str)
console.log(strArr)
# Array.keys()
Array.keys 可以收集可迭代对象的 key 并返回:
// 例1
let languages = ['java', 'js', 'php']
let keys = languages.keys()
let text = ''
for (const x of keys) {
    text += x + ','            
}
console.log(text) // 0,1,2,
// 例2
let letterMap = new Map([
    ['js', 1],
    ['java', 2],
    ['php', 3],
])
let letterKey = letterMap.keys()
let keyStr = ''
for (const l of letterKey) {
    keyStr += l + ','
}
console.log(keyStr) // js,java,php,
# Array.find()
Array.find() 接收一个函数条件,返回数组中符合函数条件的第一个元素,
条件函数有三个参数:
- value,数组遍历值
 - index,数组索引
 - array,数组本身
 
let numbers = [10, 20, 30, 40]
let first = numbers.find(fun)
function fun(value, index, array) { 
    return value > 20
}
console.log(first) // 30
# Array.findIndex()
findIndex() 属于一个测试方法,返回数组满足函数条件的第一个元素索引:
let numbers = [1,2,3,4,5,6]
function fun(value, index, array) {
    return value > 2
}
console.log(numbers.findIndex(fun)) // 2
# Math 新增方法
ES6 新增了几个 Math 对应的方法:
Math.trunc() 返回小数对应的整数部分
console.log(Math.trunc(4.2)) // 4
console.log(Math.trunc(0)) // 0
console.log(Math.trunc('abc')) // NaN
Math.sign() 判断是正数还是负数
返回值有5个:
- 1; // positive number
 - -1; // negative number
 - 0; // positive zero
 - -0; // negative zero
 - NaN; // not a number
 
console.log(Math.sign(1)) // 1
console.log(Math.sign(-1)) // -1
console.log(Math.sign(0)) // 0
console.log(Math.sign(-0)) // -0
console.log(Math.sign('abc')) // NaN
Math.cbrt() 返回立方根:
console.log(Math.cbrt(8)) // 2
console.log(Math.cbrt(64)) // 4
console.log(Math.cbrt(125)) // 5
Math.log2() 返回以2为底的对数:
console.log(Math.log2(2)) // 1
Math.log10() 返回以10为底的对数:
console.log(Math.log10(10)) // 1
# Number 新增方法
Number.isInteger() 判断是否为整数
Number.isSafeInteger() 判断是否为安全整数,安全整数的范围在 -(2的53次 - 1) ~ (2的53次 - 1)
# 新增全局方法
isFinite() 判断数字是否为有限
isNaN() 判断值是否为 NaN
# entries()
entries() 方法返回一个键值对数组:
    <div id="demo"></div>
    <script>
        let languages = ['java', 'js', 'php']
        let entries = languages.entries()
        for (const e of entries) {
            document.getElementById('demo').innerHTML += e + '<br>'
        }
        // return value
        // 0,java
        // 1,js
        // 2,php
    </script>
# 模块
模块新增两种导入方式。
导入命名模块:
import { name, age } from "./person.js"
导入默认模块:
import message from "./message.js"
← 数学对象