es6函式(function)
阿新 • • 發佈:2019-02-06
1 預設引數
- 引數個數
function foo(x, y) {
let sum = x + y
return sum
}
foo(1) // x = 1, y = undefined
foo(1, 2, 3) // x = 1, y = 2
// foo.length,返回第一個預設引數前的引數個數,預期引數的個數,rest引數不計
function foo(a, b, c, d) {} // 4
function foo(a, b, c = 3, d) {} // 2
function foo(a, b, c, ...d) {} // 3
- 同名引數
// 可以有同名引數
function foo(x, x, y) {
console.log(x, y)
}
// foo(1, 2, 3) // x = 2, y = 3
// 使用預設引數,或存在引數解構,不能有同名引數,因為都存在賦值(assignment)
function foo(x, x, y = 1) {
console.log(x, x, y)
}
function foo({a, b}, a) {
console.log(a, b)
}
// SyntaxError: Duplicate parameter name not allowed in this context
- 預設引數
// es6允許使用預設引數
function Point(x = 0, y = 0) {
this.x = x
this.y = y
}
// es5寫法,注意x=''或x=false的情況,如果需要,可使用x === undefined判斷處理
function Point(x, y) {
this.x = x || 0
this.y = y || 0
}
function foo(x, y) {
if(y === undefined) {
y = 0
}
// ...
}
// 惰性求值(lazy evaluator)
let y = 1
function foo(x = y + 1) {
console.log(x)
}
foo() // 2
y = 2
foo() // 3
2 rest引數
- arguments的使用
// arguments是偽陣列,包括所有引數,部署了@@Symbol.Iterator
// {'0': 1, '1': 2, '2': 3, length: 3, [Symbol.Iterator]}
function foo() {
// 轉成Array的方法
let arr = Array.prototype.slice.call(arguments)
let arr = Array.from(arguments)
let arr = [...arguments]
// for...in for...of Object.keys/values/entries
arguments[Symbol.Iterator] // [Function: values]
}
sum(1, 2, 3) // 7
- rest
// es6引入rest,可以不再使用arguments物件
function sum(x, ...vals) {
console.log(vals)
let s = vals.reduce((total, num) => total + num)
console.log(s)
}
sum(1, 2, 3) // 5
// vals = [2, 3],Array物件,所有多餘的引數
// rest後不能再有其他引數
function foo(x, ...params, y) {...}
// SyntaxError:Rest parameter must be last formal parameter