ES6学习笔记(九):函数的扩展

2017-07-08  本文已影响0人  大青呐

1、函数的默认值

从ES6开始,允许为函数参数设置默认值,即直接写在参数定义后面。

function log(x, y = 'ES6') {
  console.log(x, y);
}

log('Hello') // Hello ES6
log('Hello', 'Word') // Hello China
log('Hello', ' ') // Hello

参数变量是默认声明的,因此不能再使用let和const命令再次声明,否则会报错。

function foo(a=1){
let a=2;  //error
const a=4;  //error
}

2、与解构赋值结合使用

参数默认值可以与解构赋值的默认值结合起来使用。

function foo({x, y = 5}) {
  console.log(x, y);
}

foo({}) // undefined, 5
foo({x: 1}) // 1, 5
foo({x: 1, y: 2}) // 1, 2
foo() // TypeError: Cannot read property 'x' of undefined

只有当函数foo对象时,变量x和y才会通过解构赋值而生成,如果函数foo调用的参数不是对象,变量x,y不会生成,就会报错。如果参数对象没有y值,y的默认值会生效。

3、length属性

指定默认值以后,函数的length属性返回的是没有指定默认值参数的个数,因为Length属性的含义就是函数预期传入参数的个数,当某个参数指定了默认值以后,预期的传入参数就不再包括已经指定的默认参数。

(function (a) {}).length   // 1
(function (a = 0) {}).length   // 0
(function (a, b, c = 1,d=2) {}).length   // 2

rest参数也是一样,不会计入length属性

(function(...args) {}).length   // 0

另外,如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。

(function (a = 0, b, c,d) {}).length // 0
(function (a, b = 1, c,d) {}).length // 1

4、name属性

函数的name属性,返回该函数的函数名。

function foo(){}
foo.name   // "foo"

这个属性早就被浏览器广泛支持,但是直到ES6,才将其写入了标准。
需要注意的是ES6对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量。ES5的name属性,会返回空字符串,而ES6的name属性会返回实际的函数名。

var func= function () {};
 // ES5
func.name   // ""
// ES6
func.name   // "func"

如果将一个具名函数赋值给一个常量,则ES5和ES6的name属性都返回这个具名函数原本的名字。

const bar = function baz() {};  
// ES5  
bar.name // "baz"  
// ES6  
bar.name // "baz"  
上一篇下一篇

猜你喜欢

热点阅读