ECMAScript6(2)

三、ES6基础

1.新增命令

ES6新增了let命令,用来声明变量。它的用法类似于var,但存在不同的新特性。首先,let所声明的变量,只在let命令所在的代码块内有效。let不存在变量提升,在代码块内,使用let命令声明变量之前,该变量都是不可用的。

不允许用let在同一作用域内重复声明相同的变量,let实际上为Javascript新增了块级作用域。外层作用域无法读取内层作用域的变量,内层作用域可以定义外层作用域的同名变量。

 

const声明一个只读的常量一旦声明,常量的值就不能改变,所以必须在声明时初始化常量。const常量也存在块级作用域,且不允许重复声明。

 

2.解构赋值

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。如:

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

本质上,这种写法属于模式匹配,只要等号两边的模式相同,左边的变量就会被赋予对应的值。如果解构不成功,变量的值就等于undefined

另一种情况是不完全解构,即等号左边的模式,只匹配一部分等号右边的数组。这种情况下,解构(对应变量的赋值)依然可以成功。

 

数组的解构例:

let [a, [b], d] = [1, [2, 3], 4];        //a = 1; b = 2; d = 4,属于不完全解构
let [head, ...tail] = [1, 2, 3, 4];     //head = 1; tail = [2, 3, 4],属于集合解构
let [x, y = 'b'] = ['a'];                // x='a', y='b’,默认值(当匹配值严格等于undefined时,默认值生效)
let [x = f()] = [1];                 //默认值也可以为函数
function f() { console.log('aaa'); } 

 

对象的解构例:

对象的属性没有次序,变量必须与属性同名,才能取到正确的值

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

如果变量名与属性名不一致,必须写成下面这样

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

这实际上说明,对象的解构赋值是下面形式的简写

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

嵌套解构

let obj = { p: [ 'Hello', { y: 'World' } ] };

let { p: [x, { y }] } = obj; //x = "Hello”; y = "World”

默认值(默认值生效的条件是,对象的属性值严格等于undefined

let {x: y = 3} = {}; y // 3

 

字符串的解构例:

解构时,字符串被转换成了一个类似数组的对象

const [a, b, c, d, e] = ‘hello’; //a=h;b=e;c=l;d=l;e=o

可以对数组的属性解构

let {length : len} = ‘hello’; //len = 5

 

数值和布尔值解构例:

解构时,如果等号右边是数值和布尔值,则会先转为对象

let {toString: s} = 123;

s === Number.prototype.toString //true

let {toString: s} = true;

s === Boolean.prototype.toString //true

 

函数参数的解构例:

function add([x, y]){ return x + y; }

add([1, 2]); //3

带默认值

function move({x = 0, y = 0}){ return [x, y]; } 
move({x: 3, y: 8});            //等价于参数为[3, 8] 
move({x: 3});                //等价于参数为[3, 0] 
move({});                    //等价于参数为[0, 0]
move();                    //等价于参数为[0, 0]

 

解构赋值用途例:

 

交换变量的值

let x = 1;
let y = 2;
[x, y] = [y, x];

 

接收从函数返回多个值

function example(){ return [1, 2, 3]; }

let [a, b, c] = example();

 

函数参数的定义

function f([x, y, z]){ ... }

f([1, 2, 3]);

 

提取JSON数据

let jsonData = { id: 42, status: "OK", data: [867, 5309] };

let { id, status, data: number } = jsonData;

 

输入模块的指定方法

const { SourceMapConsumer, SourceNode } = require("source-map");

 

函数参数的默认值

jQuery.ajax = function(url, { 
    async = true, 
cache = true,
 global = true, 
    beforeSend = function(){}, 
    complete = function(){},     
    // ... more config 
}) { // ... do stuff };

指定参数的默认值,就避免了在函数体内部再写var foo = config.foo或者'default foo';这样的语句

 

遍历map结构

let map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map){ console.log(key + " is " + value); }
posted @ 2019-10-10 21:38  我的祈愿  阅读(133)  评论(0编辑  收藏  举报