react新手必須懂得es6的基礎(chǔ)知識(shí)

圖片發(fā)自簡(jiǎn)書(shū)App

筆者這兩天在整理react知識(shí)點(diǎn)的時(shí)候斟叼,順便對(duì)es6的基礎(chǔ)知識(shí)也進(jìn)行了一些整理斯嚎,其實(shí)es6出來(lái)已經(jīng)很久了,也不算是一個(gè)新的技術(shù)了俘陷,現(xiàn)在也已經(jīng)很普及了,所以是時(shí)候?qū)⑺莆掌饋?lái)了观谦。

一拉盾,es6是什么以及為什么要學(xué)習(xí)它

ECMAScript 6(以下簡(jiǎn)稱(chēng)ES6)是JavaScript語(yǔ)言的下一代標(biāo)準(zhǔn),已經(jīng)在2015年6月正式發(fā)布了豁状。它的目標(biāo)捉偏,是使得JavaScript語(yǔ)言可以用來(lái)編寫(xiě)復(fù)雜的大型應(yīng)用程序,成為企業(yè)級(jí)開(kāi)發(fā)語(yǔ)言替蔬。

標(biāo)準(zhǔn)的制定者有計(jì)劃告私,以后每年發(fā)布一次標(biāo)準(zhǔn),使用年份作為標(biāo)準(zhǔn)的版本承桥。因?yàn)楫?dāng)前版本的ES6是在2015年發(fā)布的驻粟,所以又稱(chēng)ECMAScript 2015。也就是說(shuō)凶异,ES6就是ES2015蜀撑,下一年應(yīng)該會(huì)發(fā)布小幅修訂的ES2016。

雖然現(xiàn)在的瀏覽器還不能支持es6剩彬,但是我們能通過(guò)babel語(yǔ)法轉(zhuǎn)化器酷麦,將es6轉(zhuǎn)化為能被大多數(shù)瀏覽器能夠支持的es5。

流行的庫(kù)基本都基于es6構(gòu)建喉恋,React默認(rèn)使用es6新語(yǔ)法開(kāi)發(fā)沃饶,現(xiàn)在React16.0中母廷。

es6出來(lái)已經(jīng)很久了,筆認(rèn)為它已經(jīng)算不上是一個(gè)新技術(shù)糊肤,而且現(xiàn)在已經(jīng)很普及琴昆,將來(lái)必定也是一個(gè)趨勢(shì),而且現(xiàn)在前端這個(gè)領(lǐng)域的技術(shù)更新迭代特別的快馆揉,因此掌握es6顯得尤為重要业舍。

二,環(huán)境準(zhǔn)備升酣,使用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 創(chuàng)建react項(xiàng)目
cd Desktop // 進(jìn)入桌面
create-react-app es6-demo // 用腳手架生成es6-demo

三舷暮,es6里都有些什么

  1. 塊級(jí)作用域,字符串噩茄,函數(shù)

  2. 對(duì)象擴(kuò)展下面,解構(gòu)

  3. 類(lèi),模塊化

1绩聘,作用域:let與const

  • 定義變量使用let代替var诸狭,塊級(jí)作用域

  • Const定義不可修改的變量

// let:塊級(jí)作用域
{
   var a1 = 'darrell1';
   let a2 = 'darrell2'
}

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

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

const a = []; // 如果是引用類(lèi)型的話(huà),往里面添加值是沒(méi)問(wèn)題的君纫,但是改變指向后則會(huì)報(bào)錯(cuò)
a.push('apple');
a.push('egg');
console.log(a); // ["apple", "egg"]

2驯遇,字符串:模板字符串

  • 使用反引號(hào),直接寫(xiě)變量

  • 多行字符串

  • 告別+拼接字符串

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

3蓄髓,函數(shù)擴(kuò)展:ES6中函數(shù)的用法

  • 參數(shù)有默認(rèn)值

  • 箭頭函數(shù)

  • 展開(kāi)運(yùn)算符

// 帶默認(rèn)參數(shù)的箭頭函數(shù)
let hello = (name='world')=>{
    console.log(`hello ${name}`)
}
// 直接返回值的箭頭函數(shù)
let cal = num=>num*2
// 多個(gè)參數(shù)
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)) // ...解構(gòu)叉庐,輸出 42

4,對(duì)象擴(kuò)展:Object擴(kuò)展

  • Object.keys会喝、values陡叠、entries

  • 對(duì)象方法簡(jiǎn)寫(xiě),計(jì)算屬性

  • 展開(kāi)運(yùn)算符(不是ES6標(biāo)準(zhǔn)肢执,但是babel也支持)

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

//es6:
//在對(duì)象里面添加跟變量名一樣的屬性址枉阵,并且屬性的值就是變量的屬性址。就可以直接簡(jiǎn)寫(xiě)成下面這樣,函數(shù)也可以簡(jiǎn)寫(xiě)
const obj = {
    name,
    site:'imooc.com',
    sayHello(){
        console.log('hello world!')
    }
}
console.log(obj)
obj.sayHello()

5预茄,解構(gòu)賦值兴溜,函數(shù)也可以多返回值

  • 數(shù)組結(jié)構(gòu)

  • 對(duì)象解構(gòu)

const [name, age] = ['imooc', '20']
const {title,job} = {title:'React開(kāi)發(fā)App', job:'IT'}

console.log(name,age) // imooc,20
console.log(title,job) // React開(kāi)發(fā)App, IT

6,類(lèi):提供class的語(yǔ)法糖

  • 是prototype的語(yǔ)法糖

  • Extends繼承

  • Constructor構(gòu)造函數(shù)

class MyApp{
    constructor(age) {
        this.name='darrell'  
        this.age = age      
    } //用這個(gè)類(lèi)實(shí)例化一個(gè)對(duì)象是耻陕,會(huì)最先執(zhí)行這個(gè)構(gòu)造器
    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拙徽,新的數(shù)據(jù)結(jié)構(gòu):ES6中新出現(xiàn)的數(shù)據(jù)結(jié)構(gòu)

  • Set,元素不可重合

  • Map

  • Symbol

// Set:不能有重復(fù)的內(nèi)容
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();  // []

這幾個(gè)是es6中新出現(xiàn)的數(shù)據(jù)結(jié)構(gòu)诗宣,我上面就拿set舉了一個(gè)簡(jiǎn)單的例子膘怕。具體的大家可以去參考考阮一峰老師的ECMAScript 6 入門(mén)中關(guān)于這幾個(gè)概念的說(shuō)明哦。

8召庞,模塊化:ES6中自帶了模塊化機(jī)制岛心,告別seajs和require.js

  • Import,import{}

  • Emport,Export default

  • Node現(xiàn)在還不支持来破,還需要require來(lái)加載文件

// module1.js
let fruit = 'apple';
let dessert = 'cake';
let dinner = (fruit,dessert) => {
    console.log(`今天的晚餐是${fruit}和${dessert}`);
}
export {fruit,dessert};
export default dinner; // 導(dǎo)出默認(rèn)的函數(shù)

//module2.js
import dinner from './module1.js'; //這個(gè)是拿到module1.js默認(rèn)導(dǎo)出的dinner函數(shù)
dinner('apple','egg'); // 今天的晚餐是apple和egg

import * as chef from './module1.js'; // 將module1種所有的export都導(dǎo)出重命名為chef

chef.default('apple','egg');// 今天的晚餐是apple和egg,默認(rèn)導(dǎo)出的是放在chef的defalut里
chef.default(chef.fruit,chef.dessert); // 今天的晚餐是apple和cake

9,還有一些特性忘古,雖然不在ES6的范圍讳癌,其他的特性,但是也被babel支持存皂,普遍被大家接受和使用(需要安裝插件)。不過(guò)這些對(duì)于初學(xué)者來(lái)說(shuō)逢艘,這些暫時(shí)還不需要全部掌握旦袋。

  • Async await

處理異步的方法,非常的簡(jiǎn)單優(yōu)雅,具體大家可以參考阮一峰老師的這篇文章它改,async 函數(shù)的含義和用法,

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

上面是一個(gè)簡(jiǎn)單的例子疤孕,我new了一個(gè)promise對(duì)象,讓他在三秒之后可以輸出promise 成功央拖,具體的操作大家可以查看祭阀,具體的Promise大家可以參考阮一峰老師的ECMAScript 6 入門(mén)這本書(shū)中對(duì)于Promise的講解,講的很好鲜戒。
其實(shí)promise更多的是用來(lái)獲取數(shù)據(jù)专控,比如我們?cè)趓eact項(xiàng)目中,會(huì)通過(guò)fetch發(fā)送異步請(qǐng)求遏餐,其實(shí)fetch返回的就是一個(gè)promise對(duì)象伦腐,所以我們一直.then()

  • 迭代器(Iterators)和生成器(Generators)
// 自己實(shí)現(xiàn)的一個(gè)簡(jiǎn)單版的迭代器
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}

以上是簡(jiǎn)單的迭代器與生成器的例子,筆者最近在學(xué)習(xí)阿里的dvaredux框架失都,其中他處理異步數(shù)據(jù)流的時(shí)候使用了redux-saga,里面有用到生成器柏蘑。不過(guò)對(duì)于初學(xué)者來(lái)說(shuō),這些暫時(shí)還不需要掌握粹庞。

四咳焚,結(jié)語(yǔ)

個(gè)人感覺(jué)學(xué)習(xí)的最好的方法就是去實(shí)踐,先把一些es6的基礎(chǔ)的運(yùn)用到你日常的工作當(dāng)中去庞溜,將一些原來(lái)的es5的方法改寫(xiě)為es6的方法革半。能幫助我們快速的理解es6的語(yǔ)法。

如在面試過(guò)程中我們最常碰到了一道面試題

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

這個(gè)面試題已經(jīng)是考作用域的一道經(jīng)典題目了流码,答案是輸出10個(gè)10督惰。

在es5中我們?cè)撛趺醋觯隙ㄊ抢瞄]包來(lái)解決問(wèn)題旅掂,下圖是一個(gè)立即執(zhí)行函數(shù)赏胚。

// ES5告訴我們可以利用閉包解決這個(gè)問(wèn)題
var funcs = []
for (var i = 0; i < 10; i++) {
    func.push((function(value) {
        return function() {
            console.log(value)
        }
    }(i)))
}

這樣我們便能得到0-9,依次輸出商虐。

但是當(dāng)我們有了let之后,我們可以這樣寫(xiě)

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

我們也能得到相同的結(jié)果觉阅,但是相比于es5的代碼崖疤,是不是更加簡(jiǎn)潔呢。

但是這里我想講的是典勇,雖然es6更加簡(jiǎn)潔了劫哼,但是懂閉包這個(gè)概念,可以幫我們更好的理解js的作用域割笙,上下文的關(guān)系权烧。

除了上面這個(gè)概念,還比如說(shuō)函數(shù)中的this的指向問(wèn)題伤溉,箭頭函數(shù)的this是指向函數(shù)本身的般码,而es5中的函數(shù)則不一定,有些是指向window的乱顾。

es6還有很多值得我們?nèi)ネ娴闹R(shí)點(diǎn)板祝,希望我的這邊文章能給大家?guī)?lái)一點(diǎn)點(diǎn)啟發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末走净,一起剝皮案震驚了整個(gè)濱河市券时,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伏伯,老刑警劉巖橘洞,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異说搅,居然都是意外死亡震檩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蜓堕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抛虏,“玉大人,你說(shuō)我怎么就攤上這事套才∮睾铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵背伴,是天一觀的道長(zhǎng)沸毁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)傻寂,這世上最難降的妖魔是什么息尺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮疾掰,結(jié)果婚禮上搂誉,老公的妹妹穿的比我還像新娘。我一直安慰自己静檬,他們只是感情好炭懊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布并级。 她就那樣靜靜地躺著,像睡著了一般侮腹。 火紅的嫁衣襯著肌膚如雪嘲碧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天父阻,我揣著相機(jī)與錄音愈涩,去河邊找鬼。 笑死加矛,一個(gè)胖子當(dāng)著我的面吹牛履婉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荒椭,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舰蟆!你這毒婦竟也來(lái)了趣惠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤身害,失蹤者是張志新(化名)和其女友劉穎味悄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體塌鸯,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侍瑟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丙猬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涨颜。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茧球,靈堂內(nèi)的尸體忽然破棺而出庭瑰,到底是詐尸還是另有隱情,我是刑警寧澤抢埋,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布弹灭,位于F島的核電站,受9級(jí)特大地震影響揪垄,放射性物質(zhì)發(fā)生泄漏穷吮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一饥努、第九天 我趴在偏房一處隱蔽的房頂上張望捡鱼。 院中可真熱鬧,春花似錦酷愧、人聲如沸堰汉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翘鸭。三九已至滴铅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間就乓,已是汗流浹背汉匙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留生蚁,地道東北人噩翠。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像邦投,于是被迫代替她去往敵國(guó)和親伤锚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • [TOC] 參考阮一峰的ECMAScript 6 入門(mén)參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,781評(píng)論 0 1
  • 原博:前端開(kāi)發(fā)者不得不知的 JavaScript ES6 十大特性轉(zhuǎn)載自AlloyTeam:http://www....
    許吉中閱讀 4,135評(píng)論 1 79
  • ES6(ECMAScript2015)的出現(xiàn)志衣,無(wú)疑給前端開(kāi)發(fā)人員帶來(lái)了新的驚喜屯援,它包含了一些很棒的新特性,可以更加...
    cbw100閱讀 15,431評(píng)論 3 233
  • 一念脯、ES6簡(jiǎn)介 ? 歷時(shí)將近6年的時(shí)間來(lái)制定的新 ECMAScript 標(biāo)準(zhǔn) ECMAScript 6(亦稱(chēng) ...
    一歲一枯榮_閱讀 6,078評(píng)論 8 25
  • 童年是一出戲狞洋,戲里的主人公是我和母親,童年是一段情绿店,充滿(mǎn)著悲傷吉懊、喜悅和淚水,時(shí)光老去假勿,歲月不再借嗽,我們?cè)僖不夭坏綇那?..
    宛若清風(fēng)R閱讀 618評(píng)論 0 0