ES6个人总结

网上杂七杂八的ES6语法看的眼花缭乱,今天没事自己总结下一些常用的,加深下印象。
ES6是什么东东呢,其实就是JavaScript的下一代标准。全称ECMAScrpt 6.0。大家常说的ES2015其实就是ES6的第一个版本。其实不必纠结这些。它们俩没啥区别,都指下一代JS标准。
下面列举下常见的新功能。

1. let和const

这个算是高频使用的了,ES6里代替var,let定义变量,const定义常量。

  • let

跟ES5相比,有两点不同.
一是不存在变量提升:

console.log(a)   // undefined
console.log(b)   // 报错:b未定义
var a = 1
let b = 1

因为let不存在变量提升,所以会有所谓的暂时性死区(这个区块中变量未声明之前,对该变量的一切调用都会报错)。其实ES6这样设计的目的就是为了让我们养成规范的代码习惯,先声明再调用。这一点一定要注意。

二是let声明的变量不能重复声明,否则会报错

var i = 1;
var i = 2;
console.log(i)//2
let i = 1;
let i = 2;
console.log(i)//报错

当然在不同的区块内重复声明就可以,比如for循环其实就是2个区块,()的可以理解为父作用域,{}里的为子作用域。

for(let i = 0; i < 5; i++){
  let i = 7;
  console.log(i)
}
// 输出结果是5个7

这里没有报错,说明()和{}其实是2个作用域。

三是新增了块级作用域。

for(var i = 0; i < 5; i++){
}
console.log(i) // 5
for(let i = 0; i < 5; i++){      // 这个i只能在这个for循环内使用
}
console.log(i) // 报错:i is not defined

一个常见的闭包问题就可以用let来解决。

for(var i = 0; i < 5; i++){
  setTimeout(function(){
      console.log(i)
  }, 1000)
}

这个可谓是经典的闭包题了,结果是一次性输出5个5。如何让它输出01234呢,ES5我们用IIFE来解决。

for(var i = 0; i < 5; i++){
  (function(e){
      setTimeout(function(){
          console.log(e)
      }, 1000)        
  })(i)
}

将代码放在一个IIFE中创建了一个独立的作用域,传入i,这样就实现了对i的暂存。(详细可参看我的另一篇关于闭包的文章。)
ES6就可以用let来解决了。

for(let i = 0; i < 5; i++){
  setTimeout(function(){
      console.log(i)
  }, 1000)
}

其实JS引擎解析上述代码中的let,就是按照ES5的规范来解析的。即创建一个IIFE传入i.

  • const
    1.声明的时候就要初始化,否则会报错
const a ;//报错

2.声明的值不能改变,不能重复声明,不存在变量提升。

const a = 1;
let a = 2//报错
var a = 2//报错
a = 2//报错

想到的就这么多,随时补充。

2. 箭头函数

这尼玛是巅峰了js的编码习惯,一点都不适应好嘛!!还是超喜欢以前笨笨的写法。。
废话不多说,用法如下:

var fn = function(a, b) {
    return a + b;
}//es5
var fn = (a, b) => a + b//es6

总结下几种情况下的写法:
() => { … } // 零个参数用 () 表示
x => { … } // 一个参数可以省略 ()
(x, y) => { … } // 多参数不能省略 ()
箭头函数最直观的特点就是:不需要function关键字创建函数,省略return关键字,继承上下文的this关键字。

重点来了!重点来了!这里着重说一下this,这个可谓是箭头函数里最重要的也是面试中最容易考察的问题。
我们都知道在普通函数里。this的使用情况如下:

  • this指代它的直接调用者。比如a.fn()。fn()里的this指向a。
  • 使用call,apply,bind时,this指向绑定的对象。a.call(b,..) this指向b。比如:
var sayName = function () {  
    console.log(this.name);
}

var peter = {  
    name: "peter"
}

sayName.call(peter);//peter

使用了call,this就指向了peter,peter继承了sayName方法。this.name即为peter.name。

  • 非严格模式下,没直接调用者,this即指向window。
  • 严格模式下('use strict'),没直接调用者,this是undefind。

那么在箭头函数中。它没有自己的this,它的this继承而来,即定义时所在的上下文的this。
普通函数中:

var x=11;
var obj={
 x:22,
 say:function() {
    console.log(this.x)
 }
}
obj.say();//22 this指向obj

箭头函数中:

var x=11;
var obj={
 x:22,
 say:()=>{
   console.log(this.x);
 }
}
obj.say();//11 this指向window

此时this在obj内定义的,指代window。

3. 模板字符串

模板字符串就是为了解决使用+拼接字符串的不便利而出现的。它有三个用法

  • 多行文本
var str = '<html>'
+ '<div>啦拉拉</div>'
+ '<div>xixixi</div>'
+ '</html>';
console.log(str);// <html><div>啦拉拉</div><div>xixixi</div></html>

ES6中就可以这样写

let str = `<html>
    <div>啦拉拉</div>
    <div>xixixix</div>
</html>`;

console.log(str);
  • 插入变量或表达式
    可在${}中插入变量或表达式。
    ES5中用+来拼接字符串。
var name =  'sean';
var age = 26;
var info = 'my name is ' + name + ',age is ' + age;
console.log(info)//my name is sean,age is 26

ES6中就可以这样写

let name =  'sean';
let age = 26;
let info = `my name is ${name},age is ${age},like ${age+1}`;
console.log(info)//my name is sean,age is 26,like 27

很方便的样子哦。刚开始是有点别扭,多用用就熟练了。

4. 解析结构

所谓解构就是ES6中新增的功能,它可以从数组或对象中取出数据保存为变量。
ES5中我们是这样提取信息的:

const people = {
        name: 'sean',
        age: 20
    }
    const name = people.name
    const age = people.age
    console.log(name + ' --- ' + age)

ES6中这样使用:

//对象
    const people = {
        name: 'sean',
        age: 20
    }
    const { name, age } = people//保存数据为变量
    console.log(`${name} --- ${age}`)//用模板字符串方式打印出来
//数组
    const color = ['red', 'blue']
    const [first, second] = color
    console.log(first) //'red'
    console.log(second) //'blue'

5. 函数的默认参数

ES5中是这样定义函数的默认参数的

    function action(num) {
        num = num || 200
        //当传入num时,num为传入的值
        //当没传入参数时,num即有了默认值200
        return num
    }

ES6为参数提供了默认值。在定义函数时便初始化了这个参数,以便在参数没有被传递进去时使用。

    function action(num = 200) {
        console.log(num)
    }
    action(0) // 0
    action() //200
    action(300) //300

6. 展开运算符

可以用来组装数组或者对象

//数组
    const color = ['red', 'yellow']
    const colorful = [...color, 'green', 'pink']
    console.log(colorful) //[red, yellow, green, pink]
    
    //对象
    const alp = { fist: 'a', second: 'b'}
    const alphabets = { ...alp, third: 'c' }
    console.log(alphabets) //{ "fist": "a", "second": "b", "third": "c"
}

有时候我们想获取数组或者对象除了前几项或者除了某几项的其他项

//数组
    const number = [1,2,3,4,5]
    const [first, ...rest] = number
    console.log(rest) //2,3,4,5
    //对象
    const user = {
        username: 'lux',
        gender: 'female',
        age: 19,
        address: 'peking'
    }
    const { username, ...rest } = user
    console.log(rest) //{"address": "peking", "age": 19, "gender": "female"
}

7. import和export

历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。

在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
使用export命令定义了模块的对外接口,其他 JS 文件就可以通过import命令加载这个模块。

8. 对象字面量 和 类(class)

其实这两个都是为了使代码更加简洁清晰。

  • 对象字面量简写

在对象中,如果属性和值同名时,可以这样写:

// es6
const person = {
  name,
  age,
  getName() { // 只要不使用箭头函数,this就还是我们熟悉的this
    return this.name
  }
}

// es5
var person = {
  name: name,
  age: age,
  getName: function getName() {
    return this.name;
  }
};
  • class
    ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
// ES5
// 构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 原型方法
Person.prototype.getName = function() {
  return this.name
}

// ES6
class Person {
  constructor(name, age) {  // 构造函数
    this.name = name;
    this.age = age;
  }

  getName() {  // 原型方法
    return this.name
  }
}

是不是很简单明了。

9. Promise

在promise之前代码过多的回调或者嵌套,可读性差、耦合度高、扩展性低。通过Promise机制,扁平化的代码机构,大大提高了代码可读性;用同步编程的方式来编写异步代码,保存线性的代码逻辑,极大的降低了代码耦合性而提高了程序的可扩展性。

其实就是用同步的方式去写异步代码。
下面代码创造了一个Promise实例

const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。resolve即成功时调用,resolve失败时调用。
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

随时补充。。
相关链接:

  1. http://es6.ruanyifeng.com/
  2. https://www.cnblogs.com/libin-1/p/6716470.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,767评论 0 1
  • 第一章:块级作用域绑定 块级声明 1.var声明及变量提升机制:在函数作用域或者全局作用域中通过关键字var声明的...
    BeADre_wang阅读 802评论 0 0
  • 1、新的声明方式 以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种...
    令武阅读 976评论 0 7
  • 个人公众号:军人九条命 一、 说到服从命令,没有哪个国比中国更了解这一概念了。中国古代讲“三纲五常”,“三纲”指的...
    eb17c23ebdf5阅读 4,936评论 0 0
  • 又画了一张,这牛油果画的有点歪是吧,相比较这个画的还强点,一点一点进步,幸亏好友的鼓励。谢谢!
    宛茹阅读 339评论 -1 3