函數(shù)參數(shù)的默認(rèn)值
function add(x = 12, y = 10) {
return x + y;
}
用 es5 來(lái)模擬
function add(x, y) {
if (!x && typeof x === "undefined") {
x = 12;
}
if (!y && typeof y === "undefined") {
y = 10;
}
return x + y;
}
let x = 99;
function foo(p = x + 1) {
console.log(p);
}
foo(); // 100
x = 100;
foo(); // 101
與解構(gòu)賦值默認(rèn)值結(jié)合使用
function foo({ x, y = 5 }) {
console.log(x, y);
}
// 等同于
function foo(obj) {
let { x, y = 5 } = obj;
console.log(x, y);
}
從等同代碼可以看出捺弦,在做解構(gòu)之前并沒(méi)有判斷 obj 的數(shù)據(jù)類型,所以如果 obj 不能進(jìn)行對(duì)象的解構(gòu)時(shí)就會(huì)報(bào)錯(cuò)属愤;
為了避免這種問(wèn)題贝搁,我們就可以給 obj 再來(lái)一個(gè)默認(rèn)值
function foo(foo = {}) {
let { x, y = 5 } = obj;
console.log(x, y);
}
// 上述代碼簡(jiǎn)化一下
function foo({ x, y = 5 } = {}) {
console.log(x, y);
}
一般的毅糟,我們把可省略的參數(shù)放在最后面
函數(shù)的 length (該函數(shù)預(yù)期必須傳入的參數(shù)個(gè)數(shù))
(這個(gè)屬性好像沒(méi)怎么用到過(guò))
指定了默認(rèn)值以后柠并,函數(shù)的 length 屬性耐床,將返回沒(méi)有指定默認(rèn)值的參數(shù)個(gè)數(shù)密幔。
如果設(shè)置了默認(rèn)值的參數(shù)不是尾參數(shù),那么 length 屬性也不再計(jì)入后面的參數(shù)了
(function(a) {}.length); // 1
(function(a = 5) {}.length); // 0
(function(a, b, c = 5) {}.length); // 2
應(yīng)用例子
利用參數(shù)默認(rèn)值撩轰,可以指定某一個(gè)參數(shù)不得省略胯甩,如果省略就拋出一個(gè)錯(cuò)誤。
function throwIfMissing() {
throw new Error("Missing parameter");
}
function foo(mustBeProvided = throwIfMissing()) {
return mustBeProvided;
}
foo();
// Error: Missing parameter
rest 參數(shù)
ES6 引入 rest 參數(shù)(形式為...變量名)钧敞,用于獲取函數(shù)的多余參數(shù)蜡豹,這樣就不需要使用 arguments 對(duì)象了麸粮。rest 參數(shù)搭配的變量是一個(gè)數(shù)組溉苛,該變量將多余的參數(shù)放入數(shù)組中。
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3); // 10
// 搭配展開(kāi)符食用弄诲,效果更好
let arr = [2, 5, 3, 4];
add(...arr); // 14
嚴(yán)格模式
ES2016 做了一點(diǎn)修改愚战,規(guī)定只要函數(shù)參數(shù)使用了默認(rèn)值、解構(gòu)賦值齐遵、或者擴(kuò)展運(yùn)算符寂玲,那么函數(shù)內(nèi)部就不能顯式設(shè)定為嚴(yán)格模式,否則會(huì)報(bào)錯(cuò)梗摇。
箭頭函數(shù)
var f = v => v;
// 等同于
var f = function(v) {
return v;
};
箭頭函數(shù)的特點(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ù)阵苇。
箭頭函數(shù)的優(yōu)點(diǎn)
- 極大的簡(jiǎn)化代碼
function sum(x) {
return function(y) {
return function(z) {
return x + y + z;
};
};
}
sum(1)(2)(3) // 6
// 等效于
let sum = x=>y=>z=> x+y+z
sum(1)(2)(3) // 6
尾調(diào)用 和 尾遞歸
這是一種代碼優(yōu)化思想,形式上就是盡可能讓函數(shù)體內(nèi)的函數(shù)調(diào)用放在最后一步感论,可以降低調(diào)用的復(fù)雜度
尾調(diào)用詳情
回到目錄