ECMAScript 6 语法说明

前言

ECMAScript6相对于以前的JS来说是一个重要的版本更新,以下内容只节选了其中比较常用的语法更新

let、const、global

let用来申明变量,只在申请的代码块中生效,且在使用时必须先声明.
const为常量申明,申明后不可改变
global浏览器中,顶层对象是window,但 Node环境下为global(window为undefine).

解构语法

只要是可遍历(Iterator)对象,就可对其解构

let arr = [1,2,3]
let [a, b, c, d=2] = arr  // a= 1, b = 2,c = 3 .d = 2
let dict = { 'age': 123, 'name': 112 }
let { name, age } = dict //name = 112 , age = 123
let str = '1df32sdfs'
let [a, b, c] = str //a = 1 b = d c = f 

函数扩展

默认参数

function (a, b = 3) {
}

rest参数

function add(...values) {
  let sum = 0;
  for (var val of values) {
    sum += val;
  }
  return sum;
}
add(2, 5, 3) // 10

箭头函数
箭头函数中的this为定义时所在的对象,不可使用yield命令

let add = ( x, y ) => {  return x + y  } 
add(2, 3) //5

对象扩展

方法简写

var o = {
  method() {
    return "Hello!";
  }
};
// 等同于
var o = {
  method: function() {
    return "Hello!";
  }
};

导出模块和导入模块

module.exports = { getItem, setItem, clear };
// 等同于
module.exports = {
  getItem: getItem,
  setItem: setItem,
  clear: clear
};

Set & Map

set

可以理解为值唯一的数组

let a = new Set([1,2,3,4,1,'1']) //a 含有 1 2 3 4 '1'

Map
相对于对象,其中的key不止用字符串

let a = ['1']
let map1 =new Map()
map.set(a:'value') 
map.get(a)

size

let map1 =new Map()
let b = map1.size  // 0
map.set('a':'value') 
let c = map1.size  // 1
let isHas = map1.has('a') //true

添加属性

for ( let a in dict)
obj[a] = dict[a]

Proxy

外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写,但是不适用箭头函数时 this会指向代理对象,所以可以将proxy指向对象自身. new Proxy(obj, obj)

obj对象在调用set get has时会打印详情

var obj = new Proxy({}, {
  get: function (target, key, receiver) {
    console.log(`getting ${key}!`);
    return Reflect.get(target, key, receiver);
  },
  set: function (target, key, value, receiver) {
    console.log(`setting ${key}!`);
    return Reflect.set(target, key, value, receiver);
  }
  has: function (target, propKey){
console.log('has$(propKye)')
  return Reflect.has(target,proKey)
}
});

Reflect

提供函数,使得对于对象的属性或方法的的操作都变成函数行为

old
name in obj
delete obj[name]

new
Reflect.has(obj, name)
Reflect.deleteProperty(obj, name)

提供方法

Reflect.get(target, name, receiver) //get属性/方法
Reflect.set(target, name, value, receiver)  //set属性/方法
Reflect.has(obj, name) //判断属性方法
Reflect.construct(target, args) //new方法
Reflect.getPrototypeOf(obj) //get属性
Reflect.setPrototypeOf(obj,value) //set 属性
Reflect.apply(func, thisArg, args) //调用方法

Promise

Promise 是异步编程的一种解决方案,创建一个Promise对象,然后在对应操作完成时return resolve或者reject来回调结果

function getData () {
  return new Promise(resolve, reject) {
      //get date
       if (isSuccess){
      return resolve(data)
    } else {
       return reject(err)
      }
    }
  }
});

getDate().then((data)=>{}).catch((err)=>{})

Iterator

js可遍历的类型主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.
Iterator 的遍历过程是这样的。

  • 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
  • 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
  • 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
  • 不断调用指针对象的next方法,直到它指向数据结构的结束位置。

自定义对象只需要实现next方法,返回值或者终止判定(如:undefine,-1,null)则可具有遍历属性,return throw可以在遍历完成/错误时进行操作(清空资源,输出错误信息)

Generator

Generator 函数是 ES6 提供的一种异步编程解决方案,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。

function* helloWorldGenerator() {
  yield 'hello';
  let c =  yield 'world';
  return 'ending';
}
var func = helloWorldGeneratot() //在定义时不实行任何代码
let step1 =  func.next() //'hello'
let step2 = func.next('!') // 'world'  c = '!'
let step3 = func.next() //'ending'

推荐阅读更多精彩内容

  • 概况 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细先容...
    呼呼哥阅读 595评论 0赞 4
  • 本文为阮一峰大神的《ECMAScript 6 入门》的个人版提纯! babel babel负责将JS高级语法转义,...
    Devildi已被占用阅读 1,178评论 0赞 4
  • 在此处先列下本篇文章的主要内容 概况 next方法的参数 for...of循环 Generator.prototy...
    醉生夢死阅读 888评论 1赞 8
  • 异步编程对JavaScript语言太重要。Javascript语言的实行环境是“单线程”的,如果没有异步编程,根本...
    呼呼哥阅读 4,771评论 5赞 22
  • 一、let 和 constlet:变量声明, const:只读常量声明(声明的时候赋值)。 let 与 var 的...
    dadage456阅读 438评论 0赞 0