react新手必须懂得es6的基础知识

图片发自简书App

笔者这两天在整理react知识点的时候,顺便对es6的基础知识也进行了一些整理,其实es6出来已经很久了,也不算是一个新的技术了,现在也已经很普及了,所以是时候将它掌握起来了。

一,es6是什么以及为什么要学习它

ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

标准的制定者有计划,以后每年发布一次标准,使用年份作为标准的版本。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。也就是说,ES6就是ES2015,下一年应该会发布小幅修订的ES2016。

虽然现在的浏览器还不能支持es6,但是我们能通过babel语法转化器,将es6转化为能被大多数浏览器能够支持的es5。

流行的库基本都基于es6构建,React默认使用es6新语法开发,现在React16.0中。

es6出来已经很久了,笔认为它已经算不上是一个新技术,而且现在已经很普及,将来必定也是一个趋势,而且现在前端这个领域的技术更新迭代特别的快,因此掌握es6显得尤为重要。

二,环境准备,使用react官方推荐的脚手架create-react-app

  1. 安装nodejs

  2. npm install -g create-react-app 安装脚手架

npm install -g create-react-app
  1. create-react-app es6-demo 创建react项目
cd Desktop // 进入桌面
create-react-app es6-demo // 用脚手架生成es6-demo

三,es6里都有些什么

  1. 块级作用域,字符串,函数

  2. 对象扩展,解构

  3. 类,模块化

1,作用域:let与const

  • 定义变量使用let代替var,块级作用域

  • Const定义不可修改的变量

// let:块级作用域
{
   var a1 = 'darrell1';
   let a2 = 'darrell2'
}

console.log(a1); // darrell1
console.log(a2); // 'a2' is not defined 

// const:基本类型
const a3 = 'darrell3'
a3 = 'darrell4'
console.log(a3); // "a3" is read-only

const a = []; // 如果是引用类型的话,往里面添加值是没问题的,但是改变指向后则会报错
a.push('apple');
a.push('egg');
console.log(a); // ["apple", "egg"]

2,字符串:模板字符串

  • 使用反引号,直接写变量

  • 多行字符串

  • 告别+拼接字符串

let name='imooc'
// es5
console.log('hello '+name+'! \n you are funny!')
// es6 after
console.log(`hello ${name}!
  you are funny!`)  // 换行不需要加\n,直接换行就行

3,函数扩展:ES6中函数的用法

  • 参数有默认值

  • 箭头函数

  • 展开运算符

// 带默认参数的箭头函数
let hello = (name='world')=>{
    console.log(`hello ${name}`)
}
// 直接返回值的箭头函数
let cal = num=>num*2
// 多个参数
let cal1 = (num1, num2)=>num1*num2

hello() // hello world
hello('darrell') // hello darrell

console.log(cal(5)) // 10
console.log(cal1(5, 6)) // 30

let arr = [6, 7]
console.log(cal1(...arr)) // ...解构,输出 42

4,对象扩展:Object扩展

  • Object.keys、values、entries

  • 对象方法简写,计算属性

  • 展开运算符(不是ES6标准,但是babel也支持)

const name = 'imooc'
// es5
const obj = {
    name: name,
    site:'imooc.com',
    sayHello: function(){
        console.log('hello world!')
    }
}
console.log(obj)
obj.sayHello()

//es6:
//在对象里面添加跟变量名一样的属性址,并且属性的值就是变量的属性址。就可以直接简写成下面这样,函数也可以简写
const obj = {
    name,
    site:'imooc.com',
    sayHello(){
        console.log('hello world!')
    }
}
console.log(obj)
obj.sayHello()

5,解构赋值,函数也可以多返回值

  • 数组结构

  • 对象解构

const [name, age] = ['imooc', '20']
const {title,job} = {title:'React开发App', job:'IT'}

console.log(name,age) // imooc,20
console.log(title,job) // React开发App, IT

6,类:提供class的语法糖

  • 是prototype的语法糖

  • Extends继承

  • Constructor构造函数

class MyApp{
    constructor(age) {
        this.name='darrell'  
        this.age = age      
    } //用这个类实例化一个对象是,会最先执行这个构造器
    sayHello(){
        console.log(`hello ${this.name}, I am ${this.age} years old`) //模版字符串
    }
}
let app = new MyApp(18)
app.sayHello() // 输出的为:hello darrell, I am 18 years old

7,新的数据结构:ES6中新出现的数据结构

  • Set,元素不可重合

  • Map

  • Symbol

// Set:不能有重复的内容
let desserts = new Set(['tomao','peats','egg']);


desserts.add('toma'); 

console.log(desserts); // ['tomao','peats','egg','toma']
console.log(desserts.size); 4
console.log(desserts.has('tomao')); // true
desserts.delete('toma'); 
console.log(desserts) // ['tomao','peats','egg']

desserts.clear();  // []

这几个是es6中新出现的数据结构,我上面就拿set举了一个简单的例子。具体的大家可以去参考考阮一峰老师的ECMAScript 6 入门中关于这几个概念的说明哦。

8,模块化:ES6中自带了模块化机制,告别seajs和require.js

  • Import,import{}

  • Emport,Export default

  • Node现在还不支持,还需要require来加载文件

// module1.js
let fruit = 'apple';
let dessert = 'cake';
let dinner = (fruit,dessert) => {
    console.log(`今天的晚餐是${fruit}和${dessert}`);
}
export {fruit,dessert};
export default dinner; // 导出默认的函数

//module2.js
import dinner from './module1.js'; //这个是拿到module1.js默认导出的dinner函数
dinner('apple','egg'); // 今天的晚餐是apple和egg

import * as chef from './module1.js'; // 将module1种所有的export都导出重命名为chef

chef.default('apple','egg');// 今天的晚餐是apple和egg,默认导出的是放在chef的defalut里
chef.default(chef.fruit,chef.dessert); // 今天的晚餐是apple和cake

9,还有一些特性,虽然不在ES6的范围,其他的特性,但是也被babel支持,普遍被大家接受和使用(需要安装插件)。不过这些对于初学者来说,这些暂时还不需要全部掌握。

  • Async await

处理异步的方法,非常的简单优雅,具体大家可以参考阮一峰老师的这篇文章,async 函数的含义和用法,

  • Promise
new Promise((resolve) => {
    setTimeout(function(){
       resolve()
    }, 3000);
}).then(() => {
    console.log('promise 成功');
});

上面是一个简单的例子,我new了一个promise对象,让他在三秒之后可以输出promise 成功,具体的操作大家可以查看,具体的Promise大家可以参考阮一峰老师的ECMAScript 6 入门这本书中对于Promise的讲解,讲的很好。
其实promise更多的是用来获取数据,比如我们在react项目中,会通过fetch发送异步请求,其实fetch返回的就是一个promise对象,所以我们一直.then()

  • 迭代器(Iterators)和生成器(Generators)
// 自己实现的一个简单版的迭代器
function chef(foods) {
    let i = 0;

    return {
        next(){
            let done = (i >= foods.length);
            let value = !done ? foods[i++] : undefined;

            return {
                value: value,
                done:done
            }
        }
    }
}

let anghao = chef(['tomato','egg']);

console.log(anghao.next()); // {value: "tomato", done: false}
console.log(anghao.next()); // {value: "egg", done: false}
console.log(anghao.next()); // {value: undefined, done: true}

//es6 的 Generators
function* chef(foods) {
  for(var i = 0 ;i< foods.length;i++) {
    yield foods[i]
  }
}

//第二种
let wanghao = chef(['tomato','egg']);
console.log(wanghao.next()); // {value: "tomato", done: false}
console.log(wanghao.next()); // {value: "egg", done: false}
console.log(wanghao.next()); // {value: undefined, done: true}

以上是简单的迭代器与生成器的例子,笔者最近在学习阿里的dvaredux框架,其中他处理异步数据流的时候使用了redux-saga,里面有用到生成器。不过对于初学者来说,这些暂时还不需要掌握。

四,结语

个人感觉学习的最好的方法就是去实践,先把一些es6的基础的运用到你日常的工作当中去,将一些原来的es5的方法改写为es6的方法。能帮助我们快速的理解es6的语法。

如在面试过程中我们最常碰到了一道面试题

var funcs = []
for (var i = 0; i < 10; i++) {
    funcs.push(function() { console.log(i) })
}
funcs.forEach(function(func) {
    func()
})

这个面试题已经是考作用域的一道经典题目了,答案是输出10个10。

在es5中我们该怎么做,肯定是利用闭包来解决问题,下图是一个立即执行函数。

// ES5告诉我们可以利用闭包解决这个问题
var funcs = []
for (var i = 0; i < 10; i++) {
    func.push((function(value) {
        return function() {
            console.log(value)
        }
    }(i)))
}

这样我们便能得到0-9,依次输出。

但是当我们有了let之后,我们可以这样写

// es6
for (let i = 0; i < 10; i++) {
    func.push(function() {
         console.log(i)
     })
}

我们也能得到相同的结果,但是相比于es5的代码,是不是更加简洁呢。

但是这里我想讲的是,虽然es6更加简洁了,但是懂闭包这个概念,可以帮我们更好的理解js的作用域,上下文的关系。

除了上面这个概念,还比如说函数中的this的指向问题,箭头函数的this是指向函数本身的,而es5中的函数则不一定,有些是指向window的。

es6还有很多值得我们去玩的知识点,希望我的这边文章能给大家带来一点点启发。

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

推荐阅读更多精彩内容

  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,783评论 0 1
  • 原博:前端开发者不得不知的 JavaScript ES6 十大特性转载自AlloyTeam:http://www....
    许吉中阅读 4,137评论 1 79
  • ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加...
    cbw100阅读 15,439评论 3 233
  • 一、ES6简介 ​ 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ...
    一岁一枯荣_阅读 6,082评论 8 25
  • 童年是一出戏,戏里的主人公是我和母亲,童年是一段情,充满着悲伤、喜悦和泪水,时光老去,岁月不再,我们再也回不到从前...
    宛若清风R阅读 622评论 0 0