4.函數(shù)的擴(kuò)展

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

function log(x, y = 'World') {
 console.log(x, y);
}
log('Hello') // Hello World

function Point(x = 0, y = 0) { 
this.x = x; 
this.y = y;
}
var p = new Point();
p // { x: 0, y: 0 }

解構(gòu)賦值默認(rèn)值的使用:

function fetch(url, { body = '', method = 'GET', headers = {} }) { 
console.log(method);
}
fetch('http://example.com', {})// "GET"
fetch('http://example.com')// 報(bào)錯(cuò)

函數(shù)的length屬性:
指定了默認(rèn)值以后,函數(shù)的length
屬性翎冲,將返回沒(méi)有指定默認(rèn)值的參數(shù)個(gè)數(shù)华畏。也就是說(shuō),指定了默認(rèn)值后跨嘉,length
屬性將失真川慌。

(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2

利用參數(shù)默認(rèn)值,可以指定某一個(gè)參數(shù)不得省略祠乃,如果省略就拋出一個(gè)錯(cuò)誤

function throwIfMissing() { 
  throw new Error('Missing parameter');
}

function foo(mustBeProvided = throwIfMissing()) {
   return mustBeProvided;
}
foo()

rest參數(shù)

ES6引入rest參數(shù)(形式為“...變量名”)梦重,用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對(duì)象了亮瓷。rest參數(shù)搭配的變量是一個(gè)數(shù)組琴拧,該變量將多余的參數(shù)放入數(shù)組中。與java中的可變形參功能一樣嘱支。

// arguments變量的寫法
function sortNumbers() { 
return Array.prototype.slice.call(arguments).sort();
}
// rest參數(shù)的寫法
const sortNumbers = (...numbers) => numbers.sort();

擴(kuò)展運(yùn)算符

擴(kuò)展運(yùn)算符(spread)是三個(gè)點(diǎn)(...)艾蓝。它好比rest參數(shù)的逆運(yùn)算力崇,將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列。

console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]

// ES5的寫法
Math.max.apply(null, [14, 3, 77])
// ES6的寫法
Math.max(...[14, 3, 77])
// 等同于
Math.max(14, 3, 77);

擴(kuò)展運(yùn)算符的應(yīng)用

  • 合并數(shù)組
// ES5
[1, 2].concat(more)
// ES6
[1, 2, ...more]
var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e'];
// ES5的合并數(shù)組
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// ES6的合并數(shù)組
[...arr1, ...arr2, ...arr3
]// [ 'a', 'b', 'c', 'd', 'e' ]
  • 與解構(gòu)賦值結(jié)合
    擴(kuò)展運(yùn)算符可以與解構(gòu)賦值結(jié)合起來(lái)赢织,用于生成數(shù)組亮靴。
const [first, ...rest] = [1, 2, 3, 4, 5];
first 
// 1
rest  
// [2, 3, 4, 5]
const [first, ...rest] = [];
first
 // undefined
rest 
 // []
const [first, ...rest] = ["foo"];
first 
 // "foo"
rest  
// []
  • 字符串
[...'hello'];
[...'hello'].reverse().join("")
  • 實(shí)現(xiàn)了Iterator接口的對(duì)象
    任何Iterator接口的對(duì)象,都可以用擴(kuò)展運(yùn)算符轉(zhuǎn)為真正的數(shù)組于置。
var nodeList = document.querySelectorAll('div');var array = [...nodeList];
  • Map和Set結(jié)構(gòu)茧吊,Generator函數(shù)
    擴(kuò)展運(yùn)算符內(nèi)部調(diào)用的是數(shù)據(jù)結(jié)構(gòu)的Iterator接口,因此只要具有Iterator接口的對(duì)象八毯,都可以使用擴(kuò)展運(yùn)算符搓侄,比如Map結(jié)構(gòu)。
 let map = new Map([
    [1, 'one'], 
    [2, 'two'], 
    [3, 'three'],
]);
let arr = [...map.keys()]; // [1, 2, 3]

var go = function*(){
 yield 1;
 yield 2; 
yield 3;
};
[...go()]
 // [1, 2, 3]
  • 嚴(yán)格模式
    從ES5開(kāi)始话速,函數(shù)內(nèi)部可以設(shè)定為嚴(yán)格模式讶踪。
function doSomething(a, b) { 
'use strict'; 
 // code
}

只要函數(shù)參數(shù)使用了默認(rèn)值、解構(gòu)賦值泊交、或者擴(kuò)展運(yùn)算符乳讥,那么函數(shù)內(nèi)部就不能顯式設(shè)定為嚴(yán)格模式,否則會(huì)報(bào)錯(cuò)廓俭。但可以如下解決(包含在一個(gè)立即執(zhí)行的函數(shù)里):

const doSomething = (function () {
   'use strict';
    return function(value = 42) {
       return value;
 };
}());
  • name屬性
    函數(shù)的name屬性云石,返回該函數(shù)的函數(shù)名。

  • 箭頭函數(shù)

var f = v => v; 

上面的箭頭函數(shù)等同于:

var f = function(v) { return v;};```

如果箭頭函數(shù)的代碼塊部分多于一條語(yǔ)句研乒,就要使用大括號(hào)將它們括起來(lái)汹忠,并且使用return語(yǔ)句返回。
由于大括號(hào)被解釋為代碼塊雹熬,所以如果箭頭函數(shù)直接返回一個(gè)對(duì)象宽菜,必須在對(duì)象外面加上括號(hào)。

var getTempItem = id => ({ id: id, name: "Temp" });

箭頭函數(shù)可以與變量解構(gòu)結(jié)合使用竿报。

const full = ({ first, last }) => first + ' ' + last;
// 等同于
function full(person) {
return person.first + ' ' + person.last;
}

箭頭函數(shù)的一個(gè)用處是簡(jiǎn)化回調(diào)函數(shù)铅乡。

// 正常函數(shù)寫法
[1,2,3].map(function (x) { return x * x;});
// 箭頭函數(shù)寫法
[1,2,3].map(x => x * x);

rest用法

const numbers = (...nums) => nums;
numbers(1, 2, 3, 4, 5)// [1,2,3,4,5]
const headAndTail = (head, ...tail) => [head, tail];
headAndTail(1, 2, 3, 4, 5)// [1,[2,3,4,5]]

+ 使用注意點(diǎn)
     箭頭函數(shù)有幾個(gè)使用注意點(diǎn)。
  - 函數(shù)體內(nèi)的this對(duì)象仰楚,就是定義時(shí)所在的對(duì)象隆判,而不是使用時(shí)所在的對(duì)象。
 - 不可以當(dāng)作構(gòu)造函數(shù)僧界,也就是說(shuō)侨嘀,不可以使用new命令,否則會(huì)拋出一個(gè)錯(cuò)誤捂襟。
 - 不可以使用arguments對(duì)象咬腕,該對(duì)象在函數(shù)體內(nèi)不存在。如果要用葬荷,可以用Rest參數(shù)代替涨共。
 - 不可以使用yield命令纽帖,因此箭頭函數(shù)不能用作Generator函數(shù)。

上面四點(diǎn)中举反,第一點(diǎn)尤其值得注意懊直。this對(duì)象的指向是可變的,但是在箭頭函數(shù)中火鼻,它是固定的室囊。

function Timer() {
this.s1 = 0;
this.s2 = 0;
// 箭頭函數(shù)
setInterval(() => this.s1++, 1000);
// 普通函數(shù)
setInterval(function () {
this.s2++;
}, 1000);}
var timer = new Timer();
setTimeout(() => console.log('s1: ', timer.s1), 3100);
setTimeout(() => console.log('s2: ', timer.s2), 3100);
// s1: 3// s2: 0

箭頭函數(shù)可以讓this指向固定化,這種特性很有利于封裝回調(diào)函數(shù)

所以魁索,箭頭函數(shù)轉(zhuǎn)成ES5的代碼如下融撞。

// ES6function foo() {
setTimeout(() => {
console.log('id:', this.id); }, 100);
}
// ES5
function foo() {
var _this = this;
setTimeout(function () {
console.log('id:', _this.id);
}, 100);
}

下面是一個(gè)部署管道機(jī)制(pipeline)的例子,即前一個(gè)函數(shù)的輸出是后一個(gè)函數(shù)的輸入粗蔚。

const pipeline = (...funcs) => val => funcs.reduce((a, b) => b(a), val);
const plus1 = a => a + 1;
const mult2 = a => a * 2;
const addThenMult = pipeline(plus1, mult2);
addThenMult(5)// 12

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尝偎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鹏控,更是在濱河造成了極大的恐慌致扯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牧挣,死亡現(xiàn)場(chǎng)離奇詭異急前,居然都是意外死亡醒陆,警方通過(guò)查閱死者的電腦和手機(jī)瀑构,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刨摩,“玉大人寺晌,你說(shuō)我怎么就攤上這事≡枭玻” “怎么了呻征?”我有些...
    開(kāi)封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)罢浇。 經(jīng)常有香客問(wèn)我陆赋,道長(zhǎng),這世上最難降的妖魔是什么嚷闭? 我笑而不...
    開(kāi)封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任攒岛,我火速辦了婚禮,結(jié)果婚禮上胞锰,老公的妹妹穿的比我還像新娘灾锯。我一直安慰自己,他們只是感情好嗅榕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布顺饮。 她就那樣靜靜地躺著吵聪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兼雄。 梳的紋絲不亂的頭發(fā)上吟逝,一...
    開(kāi)封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音赦肋,去河邊找鬼澎办。 笑死,一個(gè)胖子當(dāng)著我的面吹牛金砍,可吹牛的內(nèi)容都是我干的局蚀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恕稠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琅绅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鹅巍,我...
    開(kāi)封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤千扶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后骆捧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體澎羞,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年敛苇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妆绞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枫攀,死狀恐怖括饶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情来涨,我是刑警寧澤图焰,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蹦掐,受9級(jí)特大地震影響技羔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卧抗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一藤滥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颗味,春花似錦超陆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)张漂。三九已至,卻和暖如春谨娜,著一層夾襖步出監(jiān)牢的瞬間航攒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工趴梢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漠畜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓坞靶,卻偏偏與公主長(zhǎng)得像憔狞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彰阴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前瘾敢,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法尿这。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,382評(píng)論 0 1
  • 1.函數(shù)參數(shù)的默認(rèn)值 (1).基本用法 在ES6之前簇抵,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法射众。
    趙然228閱讀 688評(píng)論 0 0
  • 三碟摆,字符串?dāng)U展 3.1 Unicode表示法 ES6 做出了改進(jìn),只要將碼點(diǎn)放入大括號(hào)叨橱,就能正確解讀該字符典蜕。有了這...
    eastbaby閱讀 1,532評(píng)論 0 8
  • 1、函數(shù)參數(shù)的默認(rèn)值1)基本用法在ES6之前雏逾,不能直接為函數(shù)的參數(shù)指定默認(rèn)值嘉裤,為了避免這個(gè)問(wèn)題郑临,通常需要先判斷一下...
    秋天de童話閱讀 381評(píng)論 0 0
  • 標(biāo)題是對(duì)這個(gè)暑假找工作的總結(jié)吧栖博。 2017年6月29日10點(diǎn)30分結(jié)束了這學(xué)期最后一場(chǎng)考試,租的車在十一點(diǎn)左右載著...
    橘子Leslie閱讀 297評(píng)論 8 1