Skip to content

第3章 ECMAScript6语法简介

ES6与ES2015等价,ES6也泛指ES5.1之后的下一代javascript标准。

3.1 块作用域构造let和const

全局声名的属性,将成为window对象一部分。

let:块级声明,块内有效果,重复声明会报错。

const:声明常量,声明时需要赋值,后续不能更改。(如果是对象,引用不能改,但对象本身可以改)

var:变量提升,全局有效。在全局作声明时,将成为浏览器window对象的一部分,可能会覆盖原windows字段,而let、const不会。

3.2 模板字面量

多行字符串

反引号 ` 替代单引号、双引号,单引号、双引号不用转义,另外支持真正的多行字符串,但内容中反引号本身需要加 \ 转义一下。

字符串占位符

javascript
console.log(`hello, ${name}`);

3.3 默认参数 & 3.4 rest参数

javascript
// 示例中,name为默认参数;restdata是rest参数,传入后是一个数组。
function test1(name = 'lichengbei', ...restdata) {
    console.log(`hello, ${name}`);
    console.log(restdata);
}

3.5 展开运算符

javascript
// 可以用来复制数组、合并数组、合并对象等
let arr1 = ['a', 'b', 'c'];
let obj1 = {
    name: 'lichengbei',
    age: 28
}

let arr2 = [...arr1, 'd']
console.log(arr1);
console.log(arr2);
let obj2 = { ...obj1, school: 'DLU'}
console.log(obj1)
console.log(obj2)

3.6 对象字面量语法扩展

javascript
let obj3 = {
    name, // 同名属性的简写
    name2: name,
    print() { // 方法的简写
        console.log('obj3 print executed.')
    }
};

obj3.a1 = 1;
obj3['a2'] = 2;
obj3['a' + 3] = 3; // 可计算的属性名
console.log(obj3);
obj3.print();

3.7 解构赋值

对象解构

javascript
let {
    name: name2, // 使用与对象属性名不同的局部变量名
    age, // 普通对象解构
    school, // 普通对象解构
    info = 'No thing' // 默认值
} = obj2;

console.log(`My name is ${name2}, My school is ${school}, I am ${age} years old.Info: ${info}`)

// 已声明变量的解构赋值
let name3;
({
    name3
} = obj3);
console.log(`name3=${name3}`);

数组解构

javascript
// 数组解构
let [d, e, f, g = 888] = arr1; // 普通数组解构
let [...def] = arr1; // 复用数组解构复制数组
console.log(`d=${d},e=${e},f=${f},g=${g}`);
console.log(def);

3.8 箭头函数

javascript
let getmsg = (msg) => `[INFO] ${msg}`; // 普通箭头函数 
let getmsg2 = ({
    level,
    msg
}) => `[${level}] ${msg}`; // 箭头函数与对象解构结合

function test3() {
    console.log(getmsg('abc'));
    console.log(getmsg2({
        level: 'WARNING',
        msg: 'warning to do something.'
    }));
}

this

javascript中的this指向上下文,随着上下文改变。

  • 全局声明的方法,方法中的this指向windows对象。

  • 对象中声明的方法,方法中this指向对象本身。

  • 但如果把对象中声明的方法,赋值给全局声明的变量,则方法中的this又会指向window对象。

  • 匿名函数的上下文是window对象。可以通过bind绑定对象,实际上会创建一个新的函数,称作绑定函数。

  • 箭头函数没有this绑定,如果被非箭头函数包含,则this绑定的是最近一层非箭头函数的this,否则是全局对象。

3.9 Symbol

javascript
let s1 = Symbol('s3');
let s2 = Symbol('s3');
console.log(typeof s1);
console.log(s1 == s2);
console.log(s1);

3.10 类

ES6引入了类的概念,之前只能用构造函数与原型模拟类。

涉及知识点:类的定义、只读属性、静态方法、类的继承

javascript
class Car {
    constructor(sColor, sDoors) {
        // 对象属性
        this.color = sColor;
        this.doors = sDoors;
    }

    // 只读属性
    get desc() {
        return `color=${this.color}, doors=${this.doors}`;
    }

    // 对象方法
    showColor() {
        console.log(this.color);
    }

    // 类方法
    static showDoors() {
        console.log('static method');
    }
}

// 类的继承
class Honda extends Car{
    constructor(sColor, sDoors, sBrand){
        super(sColor, sDoors);
        this.brand = sBrand;
    }

    showBrand(){
        console.log(`brand is ${this.brand}`);
    }
}

let car = new Car('red', 4);
car.showColor();
console.log(car.desc);
console.log(car.doors);
Car.showDoors();

// car.showDoors(); 方法只能通过类名调用,不能通过对象调用
let honda = new Honda('1','2','3');
console.log(honda);
honda.showBrand();

3.11 模块

ES6引入模块,一个模块通常为一个JS,JS内定义的变量与函数只有被export,才可以被外部使用。

资料:

Uncaught SyntaxError Cannot use import statement outside a module的解决方法 https://blog.csdn.net/m0_67392409/article/details/123352598

ES6 模块:导入后未定义的 on click 函数 https://segmentfault.com/q/1010000043039947

3.12 Promise

待学习

3.13 async函数

待学习