ES6简介

前言

网上有很多关于ES6的文章教程,但是总觉得比较教科书话,繁琐难懂,因此特意在此对ES6常用的新特性,做了一些简化概述,以帮助新人理解。

一、箭头函数

let fn = () => {
  console.log('箭头函数');
}
// 回调函数中的运用
let arr = [1, 2];
let increaseArr = arr.map((item, index) => {
  return item + 1;
});

1、参数只有一个,那么()可以不要;如果函数主体只有return,那么{}可以不要;下面是个例子:

let arr = [1, 2];
let increaseArr = arr.map(item => item + 1);

2、如果箭头函数是对象中的属性值,那么this作用域会跳出对象

window.color = 'blue';
let obj = {
  color: 'red',
  sayColor: () => {
    console.log(this.color);
  }
 };
obj.sayColor(); // blue

二、函数参数

1、参数扩展

let showArg = (a, b, ...args) => {
  console.log(...args);
}
showArg(1, 2, 3, 4, 5); // 3 4 5

2、默认参数

let sum = (a=2, b=5) => {
  return a + b;
}
sum(); // 7
sum(5); // 10
sum(5, 10); // 15

三、解构赋值

1、左右两边的数据结构必须一致

let [a, b, c] = [1, 2, 3];
let {a, b, c} = {a: 1, b: 2, c:3};
let [{a, b}, c] = [ {a: 1, b: 2}, 3];
// 以上任何一种赋值方式:console.log(a, b, c); // 1 2 3

2、右边必须是一种有效的JavaScript数据类型

// 这样会报错,因为右边{1, 2},不是JavaScript中6种数据类型中的任何一种
let {a, b} = {1, 2};

3、申明和赋值不能分开

// 这样会报错
let [a, b];
[a, b] = [1, 2];

四、字符串模板

过去ES5字符串拼接写法

let data = {
  title: '标题',
  content: '内容文字'
};
let divHtml = '<div>'
    +'<span class="title">' + data.title + '</span>'
    +'<span class="content">' + data.content + '</span>'
  +'</div>';

ES6新字符串模板,新增特性:支持换行、${变量}

let data = {
  title: '标题',
  content: '内容文字'
};
let divHtml = `<div>
        <span class="title">${data.title}</span>
        <span class="content">${data.content}</span>
    </div>`;

五、对象简写

键和值,如果值是个变量,并且变量名和键同名,可以这样写:

let name = 'Dave',
    age = 26;
let person = {
  name,
  age
}

如果值是函数,可以这么简写

let name = 'Dave',
    age = 26;
let person = {
  name,
  age,
  sayName() {
    console.log(this.name)
  }
}

六、面向对象

1、类(构造函数)
回往ES5过去的写法

function User(name, age) {
  this.name = name;
  this.age = age;
  this.sayName = function () {
    console.log(this.name);
  }
}

ES6模仿JAVA的写法

class User{
  // 这是类的写法,不是ES6函数简写
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  
  sayName() {
    console.log(this.name);
  }
}

2、继承
回往ES5过去的写法

function VipUser(vipCode) {
  this.vipCode = vipCode;
  this.showVipCode = function() {
    console.log(this.vipCode);
  }
}
VipUser.prototype = new User(name, age);
VipUser.prototype.constructor = VipUser;

ES6模仿JAVA的写法

class VipUser extends User{
  constructor(name, age, vipCode) {
    // super方法是ES6类写法内部自带的,相当于User.call(this, name, age);
    super(name, age);
    this.vipCode = vipCode;
  }

  showVipCode() {
    console.log(this.vipCode);
  }
}

七、Promise

let p = () => {
  return new Promise((resolve, reject) => {
    $.ajax({
      url: '/login?username=xxx&pass=xxx',
      success(data) {
        resolve(data);
      },
      error(data) {
        reject(data);
      }
    });
  });
}
p().then(data => {
  console.log(`success返回的data:${data}`);
}).catch(data => {
  console.log(`error返回的data:${data}`);
});

上面看起来,就是两个普通的回调函数,简直就是多此一举。是的!但是有一些些区别;Promise承诺,会记住数据,任何时候去调用,都可以拿到想要的数据:

let res = p();
// 下面任何时候调用,都可以拿到返回的数据。
res.then(data => {
  console.log(`success返回的data:${data}`);
}).catch(data => {
  console.log(`error返回的data:${data}`);
});
function p1(flag) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      flag ? resolve('1') : reject();
    }, 1000)
  })
}
function p2(flag) {
  new Promise((resolve, reject) => {
    if (flag) {
      return p1(flag);
    } else {
      reject();
    }
  })
}
p2(true).then(res => {
  console.log(res)
}).catch(err => {
  console.log(err)
})
async function  fn() {
  var result = await new Promise((resolve, reject) => {
    setTimeout(() => {
     resolve('1');
    }, 1000)
  })
  console.log(result);  // '1'
}
fn();

下面两种倒是有用的方法:

let p1 = new Promise(resolve => {
  $.get('/xxx1', (data1) => {
     resolve(data1);
  });
});
let p2 = new Promise(resolve => {
  $.get('/xxx2', (data2) => {
     resolve(data2);
  });
});
// 批量请求;获取到所有请求数据,组成数组返回
Promise.all([p1, p2]).then(arr => {
  // arr: [data1, data2]
  console.log(arr);
});
// 竞赛请求;获取到请求最快的数据
Promise.race([p1, p2]).then(data => {
  console.log(data);
});

八、set数据结构

// 实例化set,参数是个可选参数,类型为数组 | set实例化对象
let set = new Set(); 
let set = new Set([1, 2]);
// 添加成员
set.add(3).add('abc').add({name: 'Dave'});
// 删除成员
set.delete('abc');
// 查找是否存在某个成员
set.has('abc');
// 清空
set.clear();
// 长度
set.size
// 遍历
set.keys();
set.value();
set.entries();
for (let i of set.keys()){}
for (let i of set.value()){}
for (let [key, value] of set.entries()){}
for (let i of set){}
set.forEach((item, index) => {})

下面是一种数组去重常用技巧

let arr = [1,3,5,4,5,2,3];
let newArr = [...new Set(arr)];

set如何使用数组方法(Set原型对象本身没有的方法),例如map、filter

let set = new Set([1, 2]);
set = new Set([...set].map(item => item * 2));
set = new Set([..set].filter(item => item < 2));

九、map数据结构

map类似对象,但对象属性只能是字符串,而map可以是其他6中数据类型

let map = new Map();
map.set('key', 'value');
map.get('key');
map.delete('key');
map.has('key');
map.clear();
// 遍历
map.keys();
map.value();
map.entries();
for (let i of map.keys()){}
for (let i of map.value()){}
for (let [key, value] of map.entries()){}
for (let i of map){}
map.forEach((item, index) => {})

十、模块化import用法

被引入的modules.js;下面介绍三种导出方法:

// 可以直接申明赋值导出
exports let a = 3;
// 可以先申明赋值,然后再导出;分开来写
let b = 4;
let person = {name: 'Dave'}
exports {
  b,
  person
}
// 还可以匿名导出,但一个模块只能有一个匿名导出
exports default{
  b,
  person
}
// 导出从(from)其他模块引入的变量【重定向功能】
export * from …;
export { name1, name2, …, nameN } from …;
export { import1 as name1, import2 as name2, …, nameN } from …;
export { default } from …;

需要引入的imports.js

// 匿名的导入需要给它取一个变量名,名字任意但一定要放在最前面
import mod, {b, person} from 'modules.js';
// 给在modules.js指定变量名导出的变量,取别名
import mod, {b as a, person as dave} from 'modules.js';
// 统一导入到一个变量(对象)
import * as modules from 'modules.js';

十一、generator中的异步函数async

// generator函数写法
function *ye() {
  console.log(1);
  yield;
  console.log(2);
  yield;
  console.log(3);
  return;
}
// 调用
let yeObj = ye();
ye.next();
ye.next();

这样看起来,没什么用。重点说下:异步函数async

// async需要await配合,await需要Promise配合;三者结合起来使用
async function getDatas() {
  await new Promise(resolve => {
    $.get('/xxx1', function (data1) {
      // 这里的resolve是必须的,不执行resolve,await将不起作用
      resolve(data1);
    });
  }).then(data1 => {});
  await new Promise(resolve => {
    $.get('/xxx2', function (data2) {
      // 这里的resolve是必须的,不执行resolve,await将不起作用
      resolve(data2);
    });
  }).then(data2 => {});
}
getDatas();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容

  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,781评论 0 1
  • 参考ECMAScript6入门ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准...
    荞叶阅读 660评论 0 0
  • 异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本...
    呼呼哥阅读 7,308评论 5 22
  • title: promise总结 总结在前 前言 下文类似 Promise#then、Promise#resolv...
    JyLie阅读 12,239评论 1 21
  • --------被抱着走还是自己走 1. 二宝一岁半开始,白天我基本就不再抱他. 我很愿意带宝宝出去,不过每一次我...
    小H嗨皮阅读 307评论 3 2