ES6 函数的扩展

17 篇文章 0 订阅
15 篇文章 0 订阅

ES6 函数的扩展

一,函数参数的默认值

  • ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。
   function log(x, y = 'world') {
            console.log(x + ' ' + y);
        }
        log('hello', 'hello');   //hello hello
        log('hello');   //hello world
        log('hello',);   //hello world
  • 参数默认值可以与解构赋值的默认值,结合起来使用。
function func({x,y=5}){
           console.log(x,y);
       }
       func({});   //undefined,5
       func({x:1}) // 1,5 
       func({x:1,y:2})  //1,2
       foo()   // TypeError:Cannot read property 'x' of undefined
  • 参数默认值的位置
    通常情况下,定义了默认值的参数,应该是函数的尾参数。因为这样比较容易看出来,到底省略了哪些参数。
    如果非尾部的参数设置默认值,实际上这个参数是没法省略的。

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

(function len(a){}).length   //1
(function len(a=1){}).length   //0
(function len(a,b,c=9){}).length   //2
  • 作用域
    如果参数默认值是一个变量,则该变量所处的作用域,与其变量的作用域规则是一样的,即先是当前函数的作用域,然后才是全局作用域。

二,rest参数

  • ES6引入rest参数(形式为“…变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。
    rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
function add(...nums){
     let sum=0;
     for(let i of nums){
      sum+=i;
     }
    return sum;
 }
add(1,2,3);   //6

三,扩展运算符

  • 扩展运算符(spread)是三个点(…)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。
console.log(1,2,[3,4,5],6,7);
//1,2,3,4,5,6,7
  • 该运算符主要运用于函数调用,扩展运算符与正常的函数参数可以结合使用,非常灵活。
function add(x,y,z){
return x+y+z;
}
var arr=[1,2,3];
add(...arr);   //6  
  • 在某些时候可以取代apply方法
    例“子,应用Math.max 方法,简化求出一个数组最大元素的写法。
//求一个数组中的最大值
Math.max(1,5,23);
Math.max.apply(null,[1,5,23]);   //23
Math.max(...[1,5,23])   //23
  • 运算符 … 的应用
    1,合并数组
var str1=['a','b'];
var str2=['c'];
var str3=['d','e','f'];
//ES5合并数组
str1.concat(str2,str3);
//ES6合并数组
[...str1,...str2,...str3];

2,函数的返回值

JavaScript的函数只能返回一个值,如果需要返回多个值,只能返回数组或对象。扩展运算符提供了解决这个问题的一种变通方法。

var dateField = readDateField(datebase);
var d = new date(...dateField );
//上面代码从数据库取出一行数据,通过扩展运算符,
//直接将其传入构造函数Date。
  • 类似数组的对象
    任何类似数组的对象,都可以用扩展运算符转为真正的数组。
var div=document.getElementsByTagName('div');
//此时div是一个类数组
var arr=[...div];
  • Map和Set结构,Generator函数
    扩展运算符内部调用的是数据结构的Iterator接口,因此只要具有Iterator接口的对象,都可以使用扩展运算符,比如Map结构。

四,name属性

  • 函数的name属性,返回该函数的函数名。
(function func(){}).name;     //func
  • ES6对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量,ES5的name 属性,会返回空字符串,而ES6的name属性会返回实际的函数名。
var func=function(){}
//ES5
func.name;   //""
//ES6
func.name;  //func
//上面代码中,变量func等于一个匿名函数,
//ES5和ES6的ƒ‡ 属性返回的值不一样。
  • 如果将一个具名函数赋值给一个变量,则ES5和ES6的name属性都返回这个具名函数原本的名字。
  • Function构造函数返回的函数实例,name属性的值为“anonymous”。
  • bind返回的函数,name 属性值会加上“bound ”前缀。
function foo(){};
foo.bind({}).name    //bound foo

五,箭头函数

  • ES6允许使用 “箭头”(=>)定义函数。
var f= v=>v;
//就相当于
var f=function(v){
return v;
}

如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。

var sum = (num1,num2)=>num1+num2;
//就相当于
var sum = function(num1,num2){
return num1+num2;
}

如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回

var s = (num1,num2)=>{
var t=num1/2;
return t+num2;
}

  • 注意:
    箭头函数有几个使用注意点。
    (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
    (2)不可以当作构造函数,也就是说,不可以使用new 命令,否则会抛出一个错误。
    (3)不可以使用arguments 对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。
    (4)不可以使用yeild命令,因此箭头函数不能用作Generator函数。
    上面四点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值