箭頭函數(shù)鸟缕,函數(shù)默認(rèn)參數(shù),數(shù)組和對(duì)象的解構(gòu)

箭頭函數(shù)

ES6更新引入了箭頭函數(shù),這是聲明和使用函數(shù)的另一種方式懂从。它帶來的好處:

  • 更簡(jiǎn)潔
  • 函數(shù)式編程
  • 隱式返回

示例代碼:

  • 簡(jiǎn)潔
function double(x) { return x * 2; } // Traditional way
console.log(double(2)); // 4
  • 隱式返回
const double = x => x * 2; // Same function written as an arrow function with implicit return
console.log(double(2));  // 4
  • 作用域

在箭頭函數(shù)中授段,this就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象番甩〕肫眩基本上,使用箭頭函數(shù)对室,您不必在調(diào)用函數(shù)內(nèi)部的函數(shù)之前執(zhí)行that = this技巧。

function myFunc() {
  this.myVar = 0;
  setTimeout(() => {
    this.myVar++;
    console.log(this.myVar) // 1
  }, 0);
}
詳細(xì)介紹
簡(jiǎn)潔

在許多方面咖祭,箭頭函數(shù)比傳統(tǒng)函數(shù)更簡(jiǎn)潔掩宜。

  • 隱式VS顯示返回

一個(gè)顯示返回是其中一個(gè)函數(shù)返回關(guān)鍵字在它的身上使用。

function double(x) {
    return x * 2; // this function explicitly returns x * 2, *return* keyword is used
  }

在傳統(tǒng)的函數(shù)中么翰,返回總是顯而易見的牺汤。但是使用箭頭函數(shù),您可以執(zhí)行隱式返回浩嫌,這意味著您不需要使用關(guān)鍵字return來返回值檐迟。

const double = (x) => {
    return x * 2; // 顯示 return
  }

由于這個(gè)函數(shù)只返回一些東西(在return關(guān)鍵字之前沒有指令),我們可以做一個(gè)隱式返回码耐。

  const double = (x) => x * 2; // 隱式  return x*2

為此追迟,只需要?jiǎng)h除括號(hào)和返回關(guān)鍵字。這就是為什么它被稱為隱式返回骚腥,return關(guān)鍵字不存在敦间,但是這個(gè)函數(shù)確實(shí)會(huì)返回x * 2

注意:如果函數(shù)沒有返回一個(gè)值(帶有副作用)束铭,它不會(huì)執(zhí)行顯式或隱式返回廓块。

另外,如果想隱式地返回一個(gè)對(duì)象契沫,必須在它周圍有括號(hào)带猴,因?yàn)樗鼤?huì)和塊大括號(hào)沖突:

const getPerson = () => ({ name: "Nick", age: 24 })
console.log(getPerson()) // { name: "Nick", age: 24 } -- 函數(shù)隱式返回對(duì)象

  • 只有一個(gè)參數(shù)

如果函數(shù)只有一個(gè)參數(shù),可以省略它周圍的括號(hào):

  const double = (x) => x * 2; // this arrow function only takes one parameter

參數(shù)周圍括號(hào)可以省略:

  const double = x => x * 2; // this arrow function only takes one parameter

  • 沒有參數(shù)

當(dāng)沒有參數(shù)提供給箭頭函數(shù)時(shí)懈万,需要提供圓括號(hào)拴清,否則它將不是有效的語(yǔ)法。

() => { // parentheses are provided, everything is fine
    const x = 2;
    return x;
  }
=> { // No parentheses, this won't work!
    const x = 2;
    return x;
  }
  • this作用域

在箭頭函數(shù)中钞速,this就是定義時(shí)所在的對(duì)象贷掖,而不是使用時(shí)所在的對(duì)象。
沒有箭頭函數(shù)渴语,如果想在函數(shù)內(nèi)的某個(gè)函數(shù)中從這個(gè)函數(shù)訪問一個(gè)變量苹威,必須使用that=this或者self=this這個(gè)技巧。

示例代碼

在myFunc中使用setTimeout函數(shù):

function myFunc() {
  this.myVar = 0;
  var that = this; // that = this trick
  setTimeout(
    function() { // A new *this* is created in this function scope
      that.myVar++;
      console.log(that.myVar) // 1

      console.log(this.myVar) // undefined -- see function declaration above
    },
    0
  );
}

但是有了箭頭功能驾凶,這是從其周圍取得的

function myFunc() {
  this.myVar = 0;
  setTimeout(
    () => { // this taken from surrounding, meaning myFunc here
      this.myVar++;
      console.log(this.myVar) // 1
    },
    0
  );
}

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

從ES6開始牙甫,可以使用以下語(yǔ)法將默認(rèn)值設(shè)置為函數(shù)參數(shù):

function myFunc(x = 10) {
  return x;
}
console.log(myFunc()) // 10 -- no value is provided so x default value 10 is assigned to x in myFunc
console.log(myFunc(5)) // 5 -- a value is provided so x is equal to 5 in myFunc

console.log(myFunc(undefined)) // 10 -- undefined value is provided so default value is assigned to x
console.log(myFunc(null)) // null -- a value (null) is provided, see below for more details

函數(shù)默認(rèn)參數(shù)應(yīng)用于兩種情況b并且只有兩種情況:

  • 沒有提供參數(shù)
  • 提供未定義的參數(shù)

如果傳入null掷酗,默認(rèn)參數(shù)將不會(huì)被應(yīng)用

注意:默認(rèn)值分配也可以與解構(gòu)參數(shù)一起使用

對(duì)象和數(shù)組的解構(gòu)

解構(gòu)是通過從存儲(chǔ)在對(duì)象或數(shù)組中的數(shù)據(jù)中提取一些值來創(chuàng)建新變量的一種便捷方式窟哺。

示例代碼:
  • 對(duì)象
const person = {
  firstName: "Nick",
  lastName: "Anderson",
  age: 35,
  sex: "M"
}

沒有解構(gòu)

const first = person.firstName;
const age = person.age;
const city = person.city || "Paris";

隨著解構(gòu)泻轰,所有在一行中:

const { firstName: first, age, city = "Paris" } = person; // That's it !

console.log(age) // 35 -- A new variable age is created and is equal to person.age
console.log(first) // "Nick" -- A new variable first is created and is equal to person.firstName
console.log(firstName) // ReferenceError -- person.firstName exists BUT the new variable created is named first
console.log(city) // "Paris" -- A new variable city is created and since person.city is undefined, city is equal to the default value provided "Paris".

注意:在const關(guān)鍵字const { age } = person;之后的括號(hào)不用于聲明對(duì)象或塊,而是解構(gòu)語(yǔ)法且轨。

  • 函數(shù)參數(shù)

沒有解構(gòu)

function joinFirstLastName(person) {
  const firstName = person.firstName;
  const lastName = person.lastName;
  return firstName + '-' + lastName;
}

joinFirstLastName(person); // "Nick-Anderson"

在解構(gòu)對(duì)象參數(shù)的過程中浮声,得到一個(gè)更簡(jiǎn)潔的函數(shù):

function joinFirstLastName({ firstName, lastName }) { // we create firstName and lastName variables by destructuring person parameter
  return firstName + '-' + lastName;
}

joinFirstLastName(person); // "Nick-Anderson"

解構(gòu)使用箭頭函數(shù):

const joinFirstLastName = ({ firstName, lastName }) => firstName + '-' + lastName;

joinFirstLastName(person); // "Nick-Anderson"
  • 數(shù)組

定義一個(gè)數(shù)組:

const myArray = ["a", "b", "c"];

沒有解構(gòu)

const x = myArray[0];
const y = myArray[1];

解構(gòu)

const [x, y, ...z] = myArray; // That's it !

console.log(x) // "a"
console.log(y) // "b"
console.log(z) // ["c"]
參考資料
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旋奢,隨后出現(xiàn)的幾起案子泳挥,更是在濱河造成了極大的恐慌,老刑警劉巖至朗,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屉符,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锹引,警方通過查閱死者的電腦和手機(jī)矗钟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫌变,“玉大人吨艇,你說我怎么就攤上這事√谏叮” “怎么了秸应?”我有些...
    開封第一講書人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)碑宴。 經(jīng)常有香客問我软啼,道長(zhǎng),這世上最難降的妖魔是什么延柠? 我笑而不...
    開封第一講書人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任祸挪,我火速辦了婚禮,結(jié)果婚禮上贞间,老公的妹妹穿的比我還像新娘贿条。我一直安慰自己,他們只是感情好增热,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開白布整以。 她就那樣靜靜地躺著,像睡著了一般峻仇。 火紅的嫁衣襯著肌膚如雪公黑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音凡蚜,去河邊找鬼人断。 笑死,一個(gè)胖子當(dāng)著我的面吹牛朝蜘,可吹牛的內(nèi)容都是我干的恶迈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谱醇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼暇仲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起副渴,我...
    開封第一講書人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤熔吗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后佳晶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讼载,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年轿秧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咨堤。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菇篡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出一喘,到底是詐尸還是另有隱情驱还,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布凸克,位于F島的核電站议蟆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏萎战。R本人自食惡果不足惜咐容,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚂维。 院中可真熱鬧戳粒,春花似錦、人聲如沸虫啥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涂籽。三九已至苹祟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苔咪。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工锰悼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人团赏。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓箕般,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親舔清。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丝里,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

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

  • 函數(shù)和對(duì)象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語(yǔ)言來說都是核心的概念体谒。通過函數(shù)可以封裝任意多條語(yǔ)句杯聚,而且...
    道無虛閱讀 4,578評(píng)論 0 5
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值抒痒,只能采用變通的方法幌绍。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,400評(píng)論 0 1
  • 函數(shù)參數(shù)的默認(rèn)值 ES6 之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值故响,只能采用變通的方法 上面代碼檢查函數(shù)log的參數(shù)y...
    無跡落花閱讀 195評(píng)論 0 1
  • 我思考愛情時(shí)傀广,感覺很矛盾。是自動(dòng)尋找彩届、還是等待緣分伪冰? 我在思考,我要找個(gè)什么樣的愛情樟蠕?最后我得出的答案是贮聂,一切隨緣...
    哈哈kk閱讀 296評(píng)論 0 1
  • 你是不是經(jīng)常夜里睡不著吓懈,白天起不來?這是病靡狞,得治骄瓣。 今天,張大人秘密傳授給你兩招失傳偏方耍攘,夜里睡的香榕栏,日里精神百倍...
    一朵笑花閱讀 241評(píng)論 0 0