1. 程式人生 > >es6函式(function)

es6函式(function)

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