ECMAScript基础

定义变量

var定义的是全局变量,定义之后所有的地方都能引用.let声明的是局部变量,只在代码块范围内有效

var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。let声明的变量一定要在声明后使用,否则报错。

const声明一个只读的常量。一旦声明,常量的值就不能改变。const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

变量赋值

直接赋值

let a = 1;

或者从数组中提取值,赋值给变量

let [a, b, c] = [1, 2, 3];

可以对对象进行解构赋值

let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"

变量的解构赋值用途

交换变量的值

let x = 1;
let y = 2;

[x, y] = [y, x];

从函数返回多个值

// 返回一个数组
function example() {
return [1, 2, 3];
}
let [a, b, c] = example();

// 返回一个对象
function example() {
return {
    foo: 1,
    bar: 2
};
}
let { foo, bar } = example();

遍历Map结构

const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');

for (let [key, value] of map) {
console.log(key + " is " + value);
}

Set

类似于数组,但是成员的值都是唯一的,没有重复的值。

const s = new Set();

操作方法

  • add(value):添加某个值,返回 Set 结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • has(value):返回一个布尔值,表示该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。

遍历操作

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员

    for (let item of set.keys()) { console.log(item); }

转换成数组

let arr = Array.from(thisMap);

Map

遍历方法

Map 结构原生提供三个遍历器生成函数和一个遍历方法。

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回所有成员的遍历器。
  • forEach():遍历 Map 的所有成员。

forEach遍历

map.forEach(function(value, key, map) {
    console.log("Key: %s, Value: %s", key, value);
});

Proxy

Proxy用于对对象的操作进行拦截,修改默认行为

var proxy = new Proxy(target, handler);

target: 目标对象 handler: 对象的操作函数

handler对象

定义需要被拦截的操作方法

var handler = {
    get: function(target, name) {
        return target[name];
    },
    ...
};

get方法,用于拦截对象属性的读取,属性分别是目标对象,属性名

var person = {
    name: "张三"
};

var proxy = new Proxy(person, {
get: function(target, property) {
    return target[property];
}
});

proxy.name // "张三"

set方法用来拦截某个属性的赋值操作,参数依次为目标对象、属性名、属性值

set: function(obj, prop, value) {
    if (prop === 'age') {
        return;
    }
    if (value > 200) {
        return;
    }
    obj[prop] = value;  //赋值操作
}

apply方法拦截函数的调用

construct方法用于拦截new命令


Promise 对象

Promise是用来完成异步访问的方案.传入操作成功,失败的回调方法.异步操作结束之后进行调用

const promise = new Promise(function(resolve, reject) {
// ... some code

// 根据操作是否成功调用成功或者失败的回调方法
if (statement){
    resolve(value);
} else {
    reject(error);
}
});

// 指定操作完成后的回调方法(成功或者失败)
promise.then(function(value) {
    // success
}, function(error) {
    // failure
});

Promise新建完成后就会立即执行,然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行

下面是一个用Promise对象实现的 Ajax 操作的例子
function返回了一个promise对象,返回值之后链式调用then方法

const getJSON = function(url) {
    const promise = new Promise(function(resolve, reject){
        const handler = function() {
            if (this.readyState !== 4) {
                return;
            }
            if (this.status === 200) {
                resolve(this.response);
            } else {
                reject(new Error(this.statusText));
            }
        };
        const client = new XMLHttpRequest();
        client.open("GET", url);
        client.onreadystatechange = handler;
        client.responseType = "json";
        client.setRequestHeader("Accept", "application/json");
        client.send();
    });

return promise;
};

getJSON("/posts.json").then(function(json) {
    console.log('Contents: ' + json);
}, function(error) {
    console.error('出错了', error);
});

类和对象

类使用class关键字

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }

    toString() {
        return '(' + this.x + ', ' + this.y + ')';
    }
}

构造方法的名称为constructor。

实例化类使用new关键字

var point = new Point(123, 456);

取值函数(getter)和存值函数(setter)

class MyClass {
    constructor() {
        // ...
    }
    get prop() {
        return 'getter';
    }
    set prop(value) {
        console.log('setter: '+value);
    }
}

let inst = new MyClass();

inst.prop = 123;
// setter: 123

inst.prop
// 'getter'

使用get和set方法重写类对象的赋值和取值操作。

Class 可以通过extends关键字实现继承。

class Point {
}

class ColorPoint extends Point {
    constructor(x, y, color) {
        super(x, y); // 调用父类的constructor(x, y)
        this.color = color;
    }

    toString() {
        return this.color + ' ' + super.toString(); // 调用父类的toString()
    }
}

箭头函数

函数的定义就是用一个箭头

x => x * x;

或者写成

x => {
    return x * x;
}

就相当于

function (x) {
    return x * x;
};

import,export引用

utils.js

export const param1 = "Test Param from utils";
export function plus(x, y) {
    return x + y;
}

App.js

import * as utils from './utils.js'
console.log('utils.add:', utils.plus(123, 456));
console.log('utils.param:', utils.param1);

箭头左边是参数, 右边是单行的表达式,表达式的结果作为函数返回值. 如果是多行的话用{}包裹函数体并用return返回结果