❤会了ES6你用了吗?

119 阅读5分钟

我正在参加「掘金·启航计划」

ES6新特性的学习

ES6之中新增了10个新特性

  • 1、类
  • 2、模块化
  • 3、箭头函数
  • 4、函数参数默认值
  • 5、模板字符串
  • 6、解构赋值
  • 7、延展操作符
  • 8、对象属性简写
  • 9、Promise
  • 10、Let与Const

1、类(class)

ES6 引入了class(类),让JavaScript的面向对象编程变得更加简单和易于理解

2.模块化(Module)

ES6中模块作为重要的组成部分被添加进来。模块的功能主要由 export 和 import 组成。每一个模块都有自己单独的作用域,模块之间的相互调用关系是通过 export 来规定模块对外暴露的接口,通过import来引用其它模块提供的接口。同时还为模块创造了命名空间,防止函数的命名冲突

导出(export)

ES6允许在一个模块中使用export来导出多个变量或函数。

ES6不仅支持变量的导出,也支持常量的导出

//test.js
export var name = 'Rainbow'

export const sqrt = Math.sqrt;//导出常量

ES6将一个文件视为一个模块,上面的模块通过 export 向外输出了一个变量。一个模块也可以同时往外面输出多个变量。

 //test.js
 var name = 'Rainbow';
 var age = '24';
 export {name, age};
 

导出函数

// myModule.js
export function myModule(someArg) {
  return someArg;
}  

导入(import)

定义好模块的输出以后就可以在另外一个模块通过import引用。

import {myModule} from 'myModule';// main.js
import {name,age} from 'test';// test.js

3.箭头(Arrow)函数

这是ES6中最令人激动的特性之一。=>不只是关键字function的简写,它还带来了其它好处。箭头函数与包围它的代码共享同一个this,能帮你很好的解决this的指向问题。有经验的JavaScript开发者都熟悉诸如var self = this;或var that = this这种引用外围this的模式。但借助=>,就不需要这种模式了。

箭头函数的结构

箭头函数的箭头=>之前是一个:

空括号、单个的参数名、或用括号括起的多个参数名

箭头之后:

可以是一个表达式(作为函数的返回值),或者是用花括号括起的

函数体(需要自行通过return来返回值,否则返回的是undefined)。

不论是箭头函数还是bind,每次被执行都返回的是一个新的函数引用,因此如果你还需要函数的引用去做一些别的事情(譬如卸载监听器),那么你必须自己保存这个引用。

4.函数参数默认值

ES6支持在定义函数的时候为其设置默认值:

函数参数默认值不仅能是代码变得更加简洁而且能规避一些问题。

5.模板字符串

ES6支持模板字符串,使得字符串的拼接更加的简洁、直观。

ES6中通过${}就可以完成字符串的拼接,只需要将变量放在大括号之中

6.解构赋值

解构赋值语法是JavaScript的一种表达式,可以方便的从数组或者对象中快速提取值赋给定义的变量

7.延展操作符(Spread operator)

延展操作符...可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造对象时, 将对象表达式按key-value的方式展开。

  • 展开语法和 Object.assign() 行为一致, 执行的都是浅拷贝(只遍历一层)。

在React中的应用 通常我们在封装一个组件时,会对外公开一些 props 用于实现功能。大部分情况下在外部使用都应显示的传递 props 。但是当传递大量的props时,会非常繁琐,这时我们可以使用...(延展操作符,用于取出参数对象的所有可遍历属性)来进行传递。

  • 一般情况下我们应该这样写
<CustomComponent name ='Jine' age ={21} />

使用 ... ,等同于上面的写法

const params = {
    name: 'Jine',
    age: 21
}
<CustomComponent {...params} />
  • 配合解构赋值避免传入一些不需要的参数
var params = {
    name: '123',
    title: '456',
    type: 'aaa'
}

var { type, ...other } = params;

<CustomComponent type='normal' number={2} {...other} />
//等同于
<CustomComponent type='normal' number={2} name='123' title='456' />

8.对象属性简写

  • 在ES6中允许我们在设置一个对象的属性的时候不指定属性名。

不使用ES6

const name='Ming',age='18',city='Shanghai';
   
const student = {
    name:name,
    age:age,
    city:city
};
console.log(student);//{name: "Ming", age: "18", city: "Shanghai"}
  • 对象中必须包含属性和值,显得非常冗余。

使用ES6

const name='Ming',age='18',city='Shanghai';
  
const student = {
    name,
    age,
    city
};
console.log(student);//{name: "Ming", age: "18", city: "Shanghai"}

对象中直接写变量,非常简洁。

9.Promise

Promise异步编程的一种解决方案,比传统的解决方案callback更加的优雅。它最早由社区提出和实现的,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

  • 不使用ES6

嵌套两个setTimeout回调函数

setTimeout(function()
{
    console.log('Hello'); // 1秒后输出"Hello"
    setTimeout(function()
    {
        console.log('Hi'); // 2秒后输出"Hi"
    }, 1000);
}, 1000);
  • 使用ES6
var waitSecond = new Promise(function(resolve, reject)
{
    setTimeout(resolve, 1000);
});

waitSecond.then(function(){
      console.log("Hello"); // 1秒后输出"Hello"
      return waitSecond;
    }).then(function(){
        console.log("Hi"); // 2秒后输出"Hi"
    });

上面的的代码使用两个then来进行异步编程串行化,避免了回调地狱:

10.支持let与const

在之前JS是没有块级作用域的,constlet填补了这方面的空白,const与let都是块级作用域。

区别与不同

var存在着变量提升,但是let和const不存在变量提升

  • 使用var定义的变量为函数级作用域:
{
  var a = 10;
}

console.log(a); // 输出10
  • 使用let与const定义的变量为块级作用域:
{
  let a = 10;
}

console.log(a); //-1 or Error“ReferenceError: a is not defined”