es6-函数的扩展

函数的扩展

1.函数的默认值

//参数变量默认声明,不能再次使用let和const声明
function login(name,isLogin=false){
	console.log(name,isLogin);
}
login("admin");        //"admin" false
//与解构赋值结合
function login({name,isLogin=false}){
	console.log(name,isLogin);
}
//1.参数默认值为空对象,设置了解构赋值的值
function login({name="admin",isLogin=false}={}){
	console.log(name,isLogin);
}
//2.参数默认值为具体属性,解构赋值的值为空
function login({name,isLogin}={name="admin",isLogin=false}){
	console.log(name,isLogin);
}
//参数默认值位置
//1.一般设置默认值的参数需作为尾参数,若不是则不能省略,
//	除非赋undefined,默认值才会生效
function login(isLogin=false,name){
	console.log(name,isLogin);
}
login(undefined,"admin"); // false "admin"

1.函数的length属性将返回没有指定默认值的参数个数。
2.rest参数也不会计入length属性。

//参数默认值是变量,作用域先查找当前函数,在查全局
var bool= false;
function login(name,isLogin=bool){
	console.log(name,isLogin);
}
//参数默认是另一个函数,其作用域是全局作用域
var bool= false;
function login(name,func=x=>bool){
	let bool = true;
	console.log(name,func());
}
login("admin");            //"admin" false
//依托函数默认值,指定某一个参数不可省略,若省略则抛出错误(默认值为一个错误信息)。

rest参数,获取函数多余的参数,类型为数组;就不需要使用arguments对象了。
res参数之后不能有其他参数,函数的length属性不包括rest参数。
扩展运算符…
可以将数组转为用逗号分割的参数序列。
1.展开数组

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

2.合并数组

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

3.与解构赋值结合

	const [p,...arr] = [2,1,3,4];
	p    //2
	arr   //[1,3,4]

4.函数返回值。
5.字符串可转为真正的数组。
6.可以将类似数组的对象转为真正的数组。
7.Map/Set/Generator函数,扩展运算符内部调用Iterator接口。

name属性返回该函数的函数名。
Function构造函数返回的函数实例,name属性返回“anonymous”,
bind返回的函数,name属性值会加上“bound”前缀。

箭头函数
嵌套函数可以使用箭头函数很好的改写。

//1.一个参数
var func = key=>key;     func(1);      //1
//2.没有或多个参数
var func=()=>"hello";   func();         //"hello"
var func=(a,b)=>a+b;     func("1",2);        //"12"
//3.参数可使用解构赋值
var func=({a,b})=>a+b;  func({a:"1",b:2});
//4.rest参数
var func=(...item)=>item;   func(1,"2",["hello","world"]);     //[1,"2",["hello","world"]]

1.this 为定义时的对象,不能使用call()/apply()/bind()改变this的指向。
2.不可以当做构造函数
3.不可使用arguments对象、super、new.target
4.不可以使用yield命令。

函数绑定(es7)-“::”
左边是个对象,右边是一个函数。该运算符会将左边的对象作为上下文环境绑定到右边的环境。
1.如果左边为空,右边是一个对象的方法,则将该方法绑定到该对象上(晕)
2.该运算符返回的还是原对象,因此可以采用链式写法。
尾调用
函数的最后一步调用另一个函数,即return (function)。

//1.
function func(){
	var f=()=>"hello";
	return f();
}
//2.尾递归
function factorial(n){
	if(n === 1) return 1;
	return n*factorial(n-1);
}
factorial(5);    // 嵌套 (5*(4*(3*(2*1))));
//尾调用优化
function factorial(n,total){
	if(n===1) return total;
	return factorial(n-1,n*total);
} 
factorial(5,1); //total = 1; n =5
factorial(4,5); //total =5; n=4
factorial(3,20); //total =20; n =3
factorial(2,60); //total = 60;n =2
factorial(1,120); //total = 120,n =1
				 //return total=120;

只有开启严格模式“use strict",尾调用优化才会生效。
把所有递归函数用到的内部变量全部改写成函数的参数。

//1.
function factor(n){
	factorial(n,1);
}
factor(5);
//函数柯里化,将函数多参数的转换为单参数的形式。
function currying(fn,n){
	return function(m){
		fn.call(this,m,n);
	}
}
var func = currying(factorial,1);
func(5);     //有种函数嵌套的感觉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heroboyluck

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值