ES6中对函数的扩展

  在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 x=x||'al';

  这种写法的缺点在于,如果参数赋值了,但是对应的布尔值为false,则赋值不起作用。空字符,结果也会改为默认值。

  ES6允许为函数的参数设置默认值,直接写在参数定义的后面。ES6简洁许多,而且很自然。除了简洁,ES6的写法还有两个好处:阅读代码的人可以立即意识到哪些参数是可以省略的;其次,有利于将来的代码优化。

function m1({x = 0,y=0}={}){
  return [x,y];  
}

function m2({x,y}={x:0,y:0}){
  return [x,y];  
}

  m1中函数参数的默认值是空对象,但是设置了对象解构赋值的默认值;m2中函数参数的默认值是一个有具体属性的函数,但是没有设置对象解构赋值的默认值。

 

  通常情况下,定义了默认值的参数应该是函数的尾参数。因为这样比较容易看出,到底忽略了哪些参数。如果非尾部的参数设置默认值,实际上这个参数是无法省略的。

  假如又默认值的参数都不是尾参数。这时,无法只省略该参数而不省略其后的参数,除非显式输入undefined。如果传入undefined,将触发该参数等于默认值,null则没有这个效果。

 

  指定了默认值以后,函数的length属性将返回没有指定默认值的参数个数。也就是说,指定了默认值后,Length属性将失真。length属性的返回值等于函数的参数个数减去指定了默认值的参数个数。

  如果参数默认值是一个变量,则该变量所处的作用域与其他变量的作用域规则是一样的,则先是当前函数的作用域,然后才是全局作用域。

  利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。另外,可以将参数默认值设置为undefined,表明这个参数是可以省略的。

function throwIfMissing(){
  throw new Error('missing parameter');  
}

function foo(mustBeProvided=throwIfMissing()){
  return mustBeProvided;  
}

  ES6引入了rest参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入其中。

  rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。rest参数之后不能再有其他参数,否则会报错。函数的length属性不包括rest参数。

 

  扩展运算符(spread)是三个点(...)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。

  由于扩展运算符可以展开数组,所以不再需要apply方法将数组转为函数的参数了。

Math.max.apply(null,[14,3,77])

Math.max(...[14,3,77])

Math.max(14,3,77)

//三种结果相同

var arr1 =[0,1,2];
var arr2=[3,4,5];
Array.prototype.push.apply(arr1,arr2);

//ES6的写法
arr.push(..arr2);

 

  函数的name属性返回该函数的函数名。function foo(){} foo.name//'foo'

  ES6对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量,ES5的name属性会返回空字符串,而ES6的name属性会返回实际的函数名。如果将一个具名函数赋值给一个变量,则ES5和ES6的name属性都返回这个具名函数原本的名字。

  Function构造函数返回的函数实例,name属性的值为anonymous。

  bind返回的函数,name属性值会加上"bound"。

  

  ES6允许使用“箭头”(=>)定义函数。如果箭头函数不需要参数或需要多个参数,就使用圆括号代表参数部分。如果箭头函数的代码块部分多于一条语句,就要使用大括号将其括起来,并使用return 语句返回。

  由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。

  箭头函数可以与变量解构结合使用。const full =({first,last}) => first+' ' +last;

  

  箭头函数使用注意点:

  1:函数体内的this对象就是定义时所在的对象,而不是使用时所在的对象。(少用,少用)

  2:不可以当做构造函数。也就是说,不可以使用new命令,否则会抛出一个错误。

  3:不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。

  4:不可以使用yield命令,因此箭头函数不能用作Generator函数。

  这些我还真基本用不上。this对象的指向是可变的,但在箭头函数中它是固定的。

 

  函数绑定。箭头函数可以绑定this对象,大大减少了显式绑定this对象的写法(call、apply、bind)。没杂仔细看。

  尾调用是函数式编程的一个重要概念,本身非常简单,就是指某个函数的最后一步是调用另一个函数。  

posted @ 2018-07-09 18:40  艾路  阅读(333)  评论(0编辑  收藏  举报