# ES6基础

# let和const

let 和 var相比,有块作用域,存在暂时性死区,没有变量提升,不能提前使用,不允许重复声明。

const 声明一个只读的常量,声明后不允许被改变,基础类型是不能被改变,但是如果声明了一个引用类型,其值是可以被改变的,因为只声明了它的指针,指针是基础类型,指针所指的实际地址改变是不影响的。

# 解构赋值

解构赋值可以用来解构数组、对象、函数等。

let [a, b, c] = [1, 2, 3];
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };

默认值,只有右边的值为underfind时才取默认值。

let [a = 0, b = 2, c = 3] = [1, null, underfind]
a // 1
b // null
c // 3

解构对象:

// 重命名
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"

// 默认值
var {x = 3} = {x: undefined};
x // 3

var {x = 3} = {x: null};
x // null

解构函数参数:

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]

# 模板字符串

let name = 'world';
let str = `hello, ${name}`;

// 标签模板

let a = 5;
let b = 10;

tag`Hello ${ a + b } world ${ a * b }`;
// 等同于
tag(['Hello ', ' world ', ''], 15, 50);

# 函数扩展

默认值

function log(x, y = 'World') {
  console.log(x, y);
}

获取参数

arguments对象
function log(x, y) {
  console.log(arguments); // 类数组参数列表
}

rest 参数 
// 获取多余参数,不必再为定义参数而定义多个参数,使用时直接传入参数,统一接收多余参数
function log(...arg) {
  console.log(arg);
}
log(1, 2, 3) // [1, 2, 3] 参数数组

function log(arr, ...arg) {
  console.log(arr);
  console.log(arg);
}
log([1, 2], 1, 2, 3) // [1, 2] [1, 2, 3]

name属性获取函数名

function log() {}
log.name // log

var f = function () {};
// ES5
f.name // ""
// ES6
f.name // "f"

箭头函数

箭头函数代码块多条语句必须加大括号,不加大括号是直接return返回,返回对象可以使用大括号加return或者直接使用括号包括。

// 箭头函数没有自己的this对象
// 不可以使用arguments对象,该对象在函数体内不存在。可以用 rest 参数代替。
// 对象的函数不要使用箭头函数

const fun = function(a, b) {
    return a + b
}
const fun = (a, b) => a + b
// 相当于
const fun = (a, b) => { return a + b}

// 返回对象
const fun = (a, b) => ({a: a, b: b})
// 相当于
const fun = (a, b) => {
    return {a: a, b: b}
}

[1, 2, 3, 4].map(item => ({a: item * 2, b: item + 1}))
[1, 2, 3, 4].map(item => {
    return {a: item * 2, b: item + 1}
})

尾调用

尾递归

函数柯里化