Skip to content

Latest commit

 

History

History
85 lines (70 loc) · 2.19 KB

5.函数的扩展.md

File metadata and controls

85 lines (70 loc) · 2.19 KB

默认值参数

函数的默认值参数与解构赋值中的默认值几本相同

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

length属性

指定默认值之后,函数的length属性, 将返回没有制定默认值的参数个数。

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

rest参数

rest参数('...变量名'),用于获取函数多余的参数并放入数组中,这样就不需要使用arguments对象了.

const add = (...args) => args.reduce((sum, num) => (sum + num), 0);
add(2, 5, 3) // 10

扩展运算符

扩展运算符(spread),相当于rest参数的逆运算。将一个数组转为用逗号分隔的参数序列。符号也是三个点(...) 且同样适用于类数组对象

console.log(...[1, 2, 3]) // 1 2 3

function push(array, ...items){
    array.push(...items);
}

这种写法可以替代apply方法

function f(x, y , z){ ... }
var args = [0, 1, 2];
// es5 写法
f.apply(null, args);

// es6 写法
f(...args);

name属性

函数的name属性很早就被浏览器广泛支持了,但直到es6才被写入标准。 需要注意的是, 如果将一个匿名函数复制给一个变量,es5的name属性会返回空字符串,es6则会返回实际的函数名。

var f = function(){}
// es5
f.name // ''
// es6
f.name // f

箭头函数

es6 允许用‘箭头’(=>)定义函数

let f = v => v;
// 等同于
let f = function(v){ return v }
// 当参数为0或多个时需要带上括号
let f1 = () => 5;
let f2 = (a, b) => 5;

// 若返回语句多余1条,则大括号不能省
let f3 = () => {console.log(1); return 2;}
// 若直接返回一个对象,则需要用小括号包裹
let f4 = id => ({ id: 1, name: '' })

注意事项

  1. 函数体内的this对象就是定义时所在的对象,而不是使用时所在的对象
  2. 不可以当作构造函数,也就是说不能使用new命令,否则会抛出一个错误
  3. 函数体内不存在arguments对象, 用rest参数代替
  4. 不用使用yield命令,因此箭头函数不能作Generator函数