原文:The 10 min ES6 course for the beginner React Developer
译者:Jim Xiao

著名的80/20定律可以用来解释React和ES6的关系。因为ES6增加了超过75个新特性,但是根据我自身学习React经验,只使用了不到20%的ES6新特性。

注意: 在这篇文章中,为了避免引起混淆,我把JavaScript近似等同于ECMAScript(ES), 而ES6 = ES5 + 新特性,所以ES6和ES5都相当于JavaScript。他们之间的区别就是支持不同的语法以及ES6新加了一些功能。

当我从Angular 1和纯ES5转到React时,我看了一些教程,当了解到箭头函数和解构语句时,我十分迷惑,不知道哪些语法来自React, 哪些语法来自ES6。

但是在大概一周之后,我基本上确定了,像{name}这样的语法只能写在React中(说明该语法不是来自ES6)。

这并不是一个完整的教程,只是我在React代码中使用ES6的小结。那我们开始吧。

Let和const

在旧版的JavaScript (ES5)中,我们使用关键字var来声明变量, 利用JavaScript变量提升的黑魔法, 我们甚至可以在没有声明变量前,就使用该变量:

// ES5
console.log(myVar); // undefined
var myVar = 10;

这种变量提升可能带来一些难以预见的结果。但是在ES6就不会存在了。通过使用let或者const关键字,你必须先声明变量,才能使用它:

// ES6
console.log(myVar) // ReferenceError: myVar is not defined
let myVar = 10

从下面的结果可以看出,constlet的不同在于,用const声明变量,该变量值是不能更改的,而let可以更改:

// ES6
let x = 10
const y = 20
x = 25 // Ok
y = 30 // TypeError: Assignment to constant variable.

不再使用分号

ES6以及所有相关的工具都很好地支持了自动分号插入。所以,ES6的代码中可以几乎去掉所有的分号, 使代码看起来更加简洁:

//ES5
var theNumber = 10;
console.log(theNumber);//ES6 - 可以去掉分号
let theNumber = 10
console.log(theNumber)

这并不是一个很大的改动,但确实是让代码看起来更舒服,尤其当你是CoffeeScript代码风格的粉丝。

箭头函数

在ES5语法中,如果声明一个函数,需要这样写:

// ES5
var sum = function(a, b) {return a + b
}

在ES6中,你可以通过箭头函数快速声明函数:

// ES6
const sum = (a, b) => {return a + b} 

并且,如果你只需要简单的一行函数,甚至可以去掉return关键字

// ES6
const sum = (a, b) => a + b // 一行箭头函数会自动返回结果

还有非常重要的一点,就是箭头函数的this是绑定了父级作用域的上下文:

function DogWorldContext() {this.age = 0setInterval(function growUp() {this.age++console.log(this.age)}, 1000)
}
var worldWithStandardFunction = new DogWorldContext()
// 将会每秒打印NaN,因为growUp是普通函数,它有自己this关键字的指向
function DogWorldContext() {this.age = 0setInterval(()=> {this.age++console.log(this.age)}, 1000)
}
var worldWithArrowFunction = new DogWorldContext()
// 将会每隔1s打印出1,2,3...

箭头函数没有自己的this绑定。该this上下文就是父级作用域的上下文,本例子中,就是DogWorldContext

解构

知名开发者网站Developer.mozillar.org对解构的定义是: 从数组和函数中提取值,并存储为变量。

提取对象的属性值是非常常见的做法。比如下面的代码:

// ES5; this.props.user = {name: "Daniel", age : 32}
alert(this.props.user.name + " " + this.props.user.age);

为了使之更易读, 我们把属性值赋给变量:

// ES5; this.props.user = {name: "Daniel", age : 32}
var name = this.props.user.name;
var age = this.props.user.age;
alert(name + " " + age);

在ES6中,我们可以使用对象解构:

// ES6; this.props.user = {name: "Daniel", age : 32}
const {name} = this.props.user
const {age} = this.props.user
alert(name + " " + age)

我们甚至可以简写为一行:

// ES6; this.props.user = {name: "Daniel", age : 32}
const {name, age} = this.props.user
alert(name + " " + age)

对象字面量

ES6允许我们用更少的代码表示对象键值对。

// ES5
str = "HELLO"
number = 20
obj = {str: str,number: number
}

在ES6中,上面的代码可以变为:

// ES6
str = "HELLO"
number = 20
obj = { str, number} //  obj = {str: "HELLO", number: 20}

类,构造器和方法

以前的JavaScript没有class这个关键字,为了创建一个简单的Dog类,需要使用构造函数来模拟这个类:

// ES5
function Dog(name, weight){this.name = name;this.weight = weight;
}Dog.prototype.speak = function(){alert("Woof, woof … my name is: " + this.name);
};// 用new关键字初始化对象
var dog = new Dog("Spike", 25);// 调用方法
dog.speak(); // alerts “Woof, woof … my name is: Spike”

你可以通过ES5的构造函数得到一个基本的对象和该对象的方法,但是并没有得到”开箱即用”的类。那么看看ES6的class是怎么做的:

//ES6
class Dog {constructor(name, weight) {this.name = namethis.weight = weight}speak() {alert("Woof, woof … my name is: " + this.name)}
}
const dog = new Dog("Spike", 25)
dog.speak()

类的继承和React

ES5中可以通过原型链继承的方式实现继承。但是在ES6中,可以通过关键字extends来实现类的继承:

var Greeting = createReactClass({render: function() {return <h1>Hello, {this.props.name}</h1>;}
});

ES6 extends的使用可以使得继承意义更加明确:

class Greeting extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;}
}

并且值得一提的是,如果你使用extends来定义React的组件,那么可以在类的构造器里面,用简单的this.state =...的声明方式来替代getInitialState()方法。

Filter函数

比如我们有以下的数组:

const numbers = [5,1, 20, 90, 8, 22, 33, 9]

如果想通过上面的数组来创建一个新的数组,而里面的值都是大于10的。在ES5的语法下,你可能需要一个for循环,或者一些相似的操作(比如: jQuery的each())。

现在,我们有了ES6,就可以使用filter函数来遍历数组中的所有值,并且留下那些满足条件的值。

//ES6const notDigits = numbers.filter( function(value) {return value > 9})
console.log(notDigits) // 打印出 [20,90,22,33]// 或者使用箭头函数:
const notDigits1 = numbers.filter( (value) =>  {return value > 9}
// 或者使用箭头函数默认返回的形式去掉return关键字:
const notDigits2 = numbers.filter( (value) => value > 9 )

Map函数

Map函数可能是JavaScript最不被人重视的函数之一,即使它在ES5语法就有了。基本上,如果你需要遍历一个数组,你就可以使用map函数。

比如我们有跟上面例子一样的数组:

const numbers = [5,1, 20, 90, 8, 22, 33, 9]

如果想操作数组,就可以使用map函数:

numbers.map( (n) => console.log(n))
// 还可以加第二个参数, index
numbers.map( (n, index) => console.log(n + ' is the ' + index + ' value from the array ') )
// 或者我们想创建新的数组
const double= numbers.map( (n) => n*2 )

你将会在React中经常看到map(), 很多时候它会用来显示一个项目列表:

render() {return(this.props.items.map( (item, key) =>  <p key={key}>{item}</p>)
} 

以上就是我在写React代码中使用最多的ES6特性,可能会有一些偏颇以及带有主观性,但是我绝没有贬低ES6其他新功能实用性的想法。如前所述,还有许多其他ES6在这里没有涉及,但这些概念允许你轻松地从ES5 React升级到新的ES6语法,并了解来自React以及来自新ES6功能的内容。Cheers and happy coding!

给React初学者的10分钟ES6教程相关推荐

  1. python的spider程序下载_PHPspider爬虫10分钟快速教程(内附python教程分享)

    说到做爬虫,大家都可能第一时间想到的是python,其实php也是可以用来写爬虫程序的.php一贯简洁.易用,亲测使用PHPspider框架10分钟就能写出一个简单的爬虫程序. 一.PHP环境安装 和 ...

  2. python爬虫十分钟速学教程_PHPspider爬虫10分钟快速教程

    说到做爬虫,大家都可能第一时间想到的是python,其实php也是可以用来写爬虫程序的.php一贯简洁.易用,亲测使用PHPspider框架10分钟就能写出一个简单的爬虫程序. 一.PHP环境安装 和 ...

  3. 10分钟pandas教程

    https://blog.csdn.net/Yan_Joy/article/details/78095115

  4. ECharts实现数据可视化 “ 10分钟入门 “ 教程(超详细)

    (起源!)ECharts介绍 官网链接:

  5. Python10分钟入门教程,Python入门神图一张

    这篇文章主要介绍了Python 10分钟入门教程,分享一张Python入门神图一张,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 | 初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个 ...

  6. python搞笑教程_Python10分钟入门教程,Python入门神图一张

    这篇文章主要介绍了Python 10分钟入门教程,分享一张Python入门神图一张,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 | 初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个 ...

  7. es6 ... 添加属性_如何在10分钟内免费将HTTPS添加到您的网站,以及为什么您现在不止需要这样做......

    es6 ... 添加属性 by Ayo Isaiah 通过Ayo Isaiah 如何在10分钟内免费将HTTPS添加到您的网站,以及为什么现在比以往更需要这样做 (How to add HTTPS t ...

  8. 百度贴吧自动发帖_引流网赚之百度贴吧引流窍门:实操引流教程百度贴吧零成本自动顶帖+10分钟学会豆瓣顶帖引流...

    引流网赚之百度贴吧窍门:实操引流教程<百度贴吧零成本自动顶帖>+<10分钟学会豆瓣顶帖引流> 关于百度贴吧的引流方式有很多,像常见的关键词排名引流,比如,百度贴吧引流效果好不好 ...

  9. 10分钟带你了解python_10分钟Python入门系列教程及学习资源分享

    本期分享笔记内容 归档此前入门教程文章,方便查看 10分钟带你Python入门的特点 简单谈下如何寻找Python学习资源 关于分享Python学习资源的分享问题 本人对于Python学习创建了一个小 ...

最新文章

  1. Resin install document
  2. 蓝桥杯: 基础练习 数列排序
  3. 【面试】2018大厂高级前端面试题汇总
  4. python第一章笔记_head first python(第一章)–学习笔记
  5. ~~朴素dijkstra算法
  6. 可交互绘图——鼠标移到点的上方会显示该点的标签[jupyter notebook]
  7. 如何通过yum安装mysql数据库_CentOS 7通过yum安装MySQL数据库例子
  8. C#使用Newtonsoft.Json读写json、读写Base64图像
  9. MUSIC算法及MATLAB实现
  10. 练手python_在图像上增加数字
  11. 【友元、异常和其他】——C++ Prime Plus CH15
  12. 数据结构-单链表LNode,*LinkList
  13. OpenCV——图像距离变换
  14. bzoj 4816 [Sdoi2017]数字表格——反演
  15. 百度网盘 linux 上传文件大小限制,Linux 下载百度网盘大文件的方法
  16. python实现排序算法lowb三人组之冒泡排序
  17. 毕业设计 基于单片机的万能红外遥控器 - 物联网 嵌入式
  18. mysql sql 列变成横向_mysql怎么更改纵向变横向排列
  19. f15_Trading Strategies2_sma_AAPL_Log return_EUR_OLS regress_df highlight_Lagrang_GaussianNB_DNNClass
  20. word提示 由于宏安全设置,无法找到宏或宏被禁用 隐藏的模块中的编译错误Declaration32 解决方法

热门文章

  1. JQuery中append()和appendTo()方法
  2. scratch编程模板介绍及要点
  3. 中国医用全脸面膜行业市场供需与战略研究报告
  4. Error:(9, 22) java: InetAddress()在java.net.InetAddress中不是公共的; 无法从外部程序包中对其进行访问
  5. 【通用大语言模型】GLM-130B:一个开放的双语预训练模型
  6. 北京石景山中央空调维保,写字楼中央空调维保注意要点
  7. MyBatis-Plus实战
  8. 单片机+c语言+运算符,单片机C语言编程常用的运算符介绍
  9. 好工具推荐系列:Qt多国语言翻译国产软件digital translate
  10. 拼多多2022年研发费用破百亿,重投农业科技,满足用户品质需求