先来看一下原先的写法:
- function demo(n){
- var name=n||'aa'//默认
- console.log(name);
- }
- demo('bb') // bb
- demo() // aa
- demo(null) // aa
- demo('') // aa
可以看到以上方法不能0之类的话,隐式转化后布尔类型是FALSE的,会还用默认值
es6:
- function demo(n='aa'){//es6的默认值
- console.log(n);
- }
- demo('bb') // bb
- demo(0) // 0
- demo(null) // null
- demo(nudefined) // 报错
改成es6后默认值,只有在传入undefined时,才会触发默认值赋值,传入其他值,也可以正常的解析出来,供我们使用了,在我们指定默认值了之后,不能再函数再定义同名的值,并且我们书写默认值时,指定默认值的变量必须放到最后一项,否则默认值不会生效,少传参的一项也会undefined,或者直接指定第二个参数是undefined,但是不够简洁,一般情况不会这样写
- function demo(a,b='b',c){//es6的默认值需要写到参数的最后
- console.log(a);
- console.log(b);
- console.log(c);
- }
- demo(0,null) // 0 null undefined
- demo(0,undefined,null) // 0 b null
- demo(undefined) // undefined b undefined
不定参数用来表示不确定参数个数,形如,...变量名,由...加上一个具名参数标识符组成。具名参数只能放在参数组的最后,并且有且只有一个不定参数。
- function sum(num,...arr){ //...必须是最后一个参数
- console.log(num) // 1
- arr.forEach(function(item){
- num+=item
- })
- console.log(num); // 10
- }
- sum(1,2,3,4)
通过例子,很清晰能看到,在 扩展运算符(...)之前的变量是正常的赋值,当定义的变量用完后,剩下的参数存在 ...arr 中
注:不定参数并不是适合所有的函数使用,只在特定的情境下会比较适用,比方说刚刚案例中的求和函数,就十分适合把参数收集起来放在数组中进行求和,在适当的情况下使用它可以事半功倍,减少代码量,提高开发效率。不定参数必须在最后一项,否则报错
箭头函数是ES6给我们介绍一种全新的定义函数的方式,就是用箭头符号(=>),故得名为箭头函数。具体语法直接来看案例:
- // 基本语法
- var fn = (a,b=10) => {
- return a + b
- }
- console.log(fn(1)) // 11
-
- // 只有一个参数时可以省略(),函数体只有一行解析为 return+语句,并且可以省略{}
- var fn1 = a => a
- console.log(fn1(1)); // 1
- // fn1 等同于 f
- // var f = function(a){
- // return a;
- // }
-
- // 没有参数只写一个(),函数体不想return的话,加上{}
- var fn2 = () => {console.log('fn2执行了,但是没有返回值')};
- console.log(fn2()); // undefined
-
- var fn3 = (a,b) => a+b
- console.log(fn3(1,1)); // 2
-
- // 想要返回对象,因为{}和箭头函数语法冲突,需要再包一层()
- var fn4 = (a,b) => ({name:a,age:b})
- console.log(fn4('zs',18)); // {name: 'zs', age: 18}
箭头函数的特点
1、箭头函数体中的 this 对象,是定义函数时的对象,而不是使用函数时的对象。直接看例子
- // 在全局挂载一个 age 100
- var age = 100
-
- let sayFn = function() {
- console.log(this.age)
- }
-
- let obj = {
- age: 18,
- that:this,
- say: sayFn
- };
-
- let obj1 = {
- age: 18,
- that:this,
- say: () => {
- console.log(this.age);
- }
- };
-
- let obj2 = {
- age:20,
- say: function() {
- (()=>console.log(this.age))()
- }
- };
-
- sayFn() // 100
- console.log(obj.that); // window
- obj.say() // 18
- console.log(obj1.that); // window
- obj1.say(); // 100
- obj2.say(); // 20
这样就可以直观的看到,普通函数和箭头函数this指向的不同
obj2和obj1的this一样,但是里面的箭头函数的this指向的是 obj2.say的this也就是obj2
并且但是在箭头函数中,this是固定的。
- // 回调函数
- var obj = {
- age: 18,
- sayHello: function () {
- setTimeout(function () {
- console.log(this.age);
- });
- }
- };
- var age = 20;
- obj.sayHello(); // 20
-
- var obj1 = {
- age: 18,
- sayHello: function () {
- setTimeout(()=>{
- console.log(this.age);
- });
- }
- };
- var age = 20;
- obj1.sayHello(); // 18
2、箭头函数不能作为构造函数,不能使用new ,会抛出一个错误
3、箭头函数没有arguments,如果要用,可以用 rest (...) 参数代替
4、不可以使用yield命令,因此箭头函数不能用作 Generator 函数
5、因为this指向不变,箭头函数通过call和apply调用,只会传入参数
6、箭头函数没有原型对象