利用參數(shù)默認(rèn)值,可以指定某一個參數(shù)不得省略覆山,如果省略就拋出一個錯誤竹伸。
function throwIfMissing() {
throw new Error('Missing parameter');
}
function foo(mustBeProvided = throwIfMissing()) {
return mustBeProvided;
}
foo()
// Error: Missing parameter
上面代碼的foo
函數(shù),如果調(diào)用的時候沒有參數(shù)簇宽,就會調(diào)用默認(rèn)值throwIfMissing
函數(shù)勋篓,從而拋出一個錯誤吧享。
從上面代碼還可以看到,參數(shù)mustBeProvided
的默認(rèn)值等于throwIfMissing
函數(shù)的運行結(jié)果(注意函數(shù)名throwIfMissing
之后有一對圓括號)譬嚣,這表明參數(shù)的默認(rèn)值不是在定義時執(zhí)行钢颂,而是在運行時執(zhí)行。如果參數(shù)已經(jīng)賦值拜银,默認(rèn)值中的函數(shù)就不會運行殊鞭。
另外,可以將參數(shù)默認(rèn)值設(shè)為undefined
盐股,表明這個參數(shù)是可以省略的钱豁。
function foo(optional = undefined) { ··· }
rest參數(shù)
ES6
引入rest
參數(shù)(形式為...變量名
),用于獲取函數(shù)的多余參數(shù)疯汁,這樣就不需要使用arguments
對象了。rest
參數(shù)搭配的變量是一個數(shù)組卵酪,該變量將多余的參數(shù)放入數(shù)組中幌蚊。
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10
下面代碼的兩種寫法,比較后可以發(fā)現(xiàn)溃卡,rest
參數(shù)的寫法更自然也更簡潔溢豆。
arguments
對象不是數(shù)組,而是一個類似數(shù)組的對象瘸羡。所以為了使用數(shù)組的方法漩仙,必須使用Array.prototype.slice.call
先將其轉(zhuǎn)為數(shù)組。rest
參數(shù)就不存在這個問題犹赖,它就是一個真正的數(shù)組队他,數(shù)組特有的方法都可以使用。
// arguments變量的寫法
function sortNumbers() {
return Array.prototype.slice.call(arguments).sort();
}
// rest參數(shù)的寫法
const sortNumbers = (...numbers) => numbers.sort();
下面是一個利用 rest 參數(shù)改寫數(shù)組push方法的例子峻村。
function push(array, ...items) {
items.forEach(function(item) {
array.push(item);
console.log(item);
});
}
var a = [];
push(a, 1, 2, 3)
注意麸折,rest 參數(shù)之后不能再有其他參數(shù)(即只能是最后一個參數(shù)),否則會報錯粘昨。
// 報錯
function f(a, ...b, c) {
// ...
}
函數(shù)的length屬性垢啼,不包括 rest 參數(shù)。
(function(a) {}).length // 1
(function(...a) {}).length // 0
(function(a, ...b) {}).length // 1
嚴(yán)格模式
從 ES5
開始张肾,函數(shù)內(nèi)部可以設(shè)定為嚴(yán)格模式芭析。ES2016
做了一點修改,規(guī)定只要函數(shù)參數(shù)使用了默認(rèn)值吞瞪、解構(gòu)賦值馁启、或者擴(kuò)展運算符,那么函數(shù)內(nèi)部就不能顯式設(shè)定為嚴(yán)格模式尸饺,否則會報錯进统。
// 報錯
function doSomething(a, b = a) {
'use strict';
// code
}
// 報錯
const doSomething = function ({a, b}) {
'use strict';
// code
};
// 報錯
const doSomething = (...a) => {
'use strict';
// code
};
const obj = {
// 報錯
doSomething({a, b}) {
'use strict';
// code
}
};
name 屬性
函數(shù)的name屬性助币,返回該函數(shù)的函數(shù)名。
function foo() {}
foo.name // "foo"
var f = function () {};
// ES5
f.name // ""
// ES6
f.name // "f"