ES 6

Posted by 松一老贼 on March 4, 2018

let 与 const

let

  1. 不变量提升
  2. 存在块级作用域
  3. 当前作用域不允许重复声明

const

  1. 没有变量提升
  2. 不能在同一作用域重复声明
  3. 只在当前块级作用域有效

解构赋值

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

ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。

函数参数的解构赋值:如果执行时,传了实参,解构的是实参,如果没传参数,解构的是形参中表达式等号右侧,举例:

//有默认值的情况
function move({x=1, y=1} = { x: 0, y: 0 }) {
    return [x, y];
}
move();//[0,0]
move({x:3,y:4});//[3,4]
move({x:3});//[3,1]
//没有默认值的情况
function move2({x,y}={x:0,y:0}) {
    return [x,y];
}
console.log(move2({x:3,y:5}));//[3,5]
console.log(move2({x:3}));//[3,undefined]
console.log(move2({y:4}));//[undefined,4]

箭头函数

  1. 箭头函数中没有this, 箭头函数this指向上级作用域中的this
  2. 箭头函数不可以构造函数,不能new;
  3. 箭头函数中没有arguments

Symbol

概述

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

  • Symbol 函数的参数如果是一个对象,会先调用该对象的 toString 方法,然后生成 Symbol 类型的值:

    const obj = {
        toString(){
            return 'hello';
        }
    }
    const sym = Symbol(obj);
    console.log(sym);//Symbol(hello)
    
  • Symbol 值不能参与运算,会报错

  • Symbol 值可以转换为 String/Boolean,不可转化为 Number,且 Symbol 的值不可修改

    let sym = Symbol('hello');
    console.log(sym);//Symbol(hello)
    String(sym)===sym.toString();//true 值为"Symbol(heloo)"
    //但是sym的值还是Symbol(hello)并没有发生变化
    console.log(sym);//Symbol(hello)
    //===============================
    let sym = Symbol(1);
    console.log(sym);//Symbol(1)
    Boolean(sym);//true
    !sym;//false
    console.log(sym);//Symbol(1) 值并没有发生变化
    Number(sym);//报错
    

作为属性名的 Symbol

由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

三种写法:

let sym = Symbol();
//第一种写法
let a={};
a[sym] = 'Hello';

//第二中写法
let a={
    [sym]='Hello'
};

//第三种写法
let a = {};
Object.defineProperty(a,sym,{value:'Hello'});

//三种写法得到同样的结果
a[sym];//'Hello'
a;//{Symbol(): "hello"}
  • Symbol 值作为属性名时,只能用[],不能用.,因为.后总是字符串,导致取不到 Symbol 的值
  • Symbol 值作为属性名时,该属性还是公开属性,不是私有属性。

属性名的遍历

Symbol 作为属性名,该属性不会出现在for...infor...of循环中,也不会被Object.keys()Object.getOwnPropertyNames()JSON.stringify()返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。

Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。

Object.getOwnPropertySymbols 返回的属性名只能是 Symbol 类型,所以有一个新的 API:

Reflect.ownkeys 返回的也是一个数组,并且常规属性和 Symbol 属性都可返回

Symbol.for(‘string’) Symbol.keyFor(symbol)

Symbol.for() 接收一个字符串作为参数,如果有该字符串对应的 Symbol 值,则返回,否则,以该字符串为参数调用 Symbol() 创建一个新的 Symbol 值返回,经过 Symbol.for 创建的 Symbol 称为 被登记过

另外,Symbol.for() 登记过的 Symbol 是全局的。

Symbol.keyFor() 接收一个 Symbol 值作为参数,如果这个 Symbol 值被登记过,则返回描述字符串(调用 Symbol(key) 创建时的 key),否则,返回 undefined(undefined 数据类型而不是字符串 “undefined”)