深入理解ES6三

参数

  • ES6简化了为形式参数提供默认值的过程
function makeRequest(rul,timeout = 2000,callback) {
    //函数其余部分
}
  • 上面的函数只有当不为第二个参数传入值或者主动为第二个参数传入undefined时才会使用timeout的默认值
  • 在ES6中一个函数使用了默认参数值,会使得arguments对象保持与命名参数的分离,无论参数如何变化,arguments对象不再随之改变。
function mix(first,second='b') {
    console.log(arguments.length);  // 1 之传入了一个参数
    console.log(first === arguments[0])  // true
    console.log(second === aruments[1])  // false //arguments[1]是undefined
}
mix('a');
  • 默认参数表达式
    • ES6中可以使用先定义的参数作为后定义参数的默认值,但是后定义的参数不能作为先定义参数的默认值。
    • 默认参数也存在临时死区,定义参数时会为每个参数创建一个新的标识符绑定,该绑定在初始化之前不可被引用,如果访问会导致程序错误

不定参数

  • 在函数的命名参数钱添加三个点(...)就表明这是一个不定参数,该参数为一个数组,包含着自它之后出入的所有参数,通过这个数组名即可逐一访问里面的参数。
  • 不定参数的使用限制:1.每个函数最多只能声明一个不定参数,而且一定要放在所有参数的末尾。2.不定参数不能用于对象字面量setter中
  • arguments对象包含不定参数,无论是否使用不定参数,argumetns对象总是包含所有传入函数的参数

展开运算符

- 展开运算符可以让你指定一个数组,将它们打散后作为各自独立的参数传入函数
- 展开运算符的使用:例如`Math.max()`方法可以接受任意数量的参数并返回值最大的一个,但是该方法不允许传入数组。
```
// ES5使用
let values = [25,50,75,100];
console.log(Math.max.apply(Math,values)); //100

// Es6使用
console.log(Math.max(...values)); //100
```

判断函数被调用的方法

  • 在ES5中判断一个函数是否通过new关键字被调用(或者说,判断该函数是否作为构造函数被调用),最常使用的是instanceof
  • instanceof语法:Object instanceof constructor; instanceof运算符用来检测constructor.prototype是否存在于参数Object的原型链上
  • ES6引入了new.target这个元属性,元属性市值非对象的属性,其可以提供非对象目标的补充信息,当调用函数的[construct]方法时,new.target被赋值new操作符的目标,通常是新创建的对象实例。如果用[[call]]方法,则new.target的值为undefined。

块级函数

  • ES6中允许在代码块中声明函数
if(true) {
    function doSomething() {

    }
}
  • 块级函数的声明提升
    • 函数声明的块级函数会被提升至块的顶部而用let定义的函数表达式不会被提升
    • ES6严格模式下块级函数只会提升至块的顶部,但是在非严格模式下函数会被提升至外围函数或全局作用域的顶部。

箭头函数

  • 箭头函数是一种使用箭头(=>)定义函数的新语法
  • 与传统函数的不同:
    1. 没有this、super、arguments和new.target绑定 这些值由外围一层非箭头函数决定
    2. 不能通过new关键字调用 箭头函数没有[[constructor]]方法,如果通过new关键字调用箭头函数,程序会抛出错误。
    3. 没有原型 不存在prototype这个属性
    4. 不可以改变this的绑定 在函数的生命周期内始终保持一致
    5. 不支持arguments对象
    6. 不支持重复命名的参数
  • 箭头函数的语法
    1. 当箭头函数只有一个参数时,可以直接写参数名,箭头紧随其后,箭头右侧额表达式被求值后便立即返回
        let reflect = value => value;
    
    1. 如果要传入两个或两个以上的参数,要在参数的两侧添加一对小括号
    let sum = (num1,num2) => num1+num2;
    
    1. 如果函数没有参数,也要在声明的时候写一组没有内容的小括号
    let getName = () => 'Tgb';
    
    1. 可以有函数体
    let sum = (num1,num2) => {
        return num1+num2;
    }
    
    1. 箭头函数返回对象字面量
    let getTempItem = id => ({ id: id,name: 'temp' });
    
    1. 箭头函数的自调用 沙箱模式
    let person = ((name) => {
        return {
            getName: function() {
                retrun name;
            }
        };
    })('tgb');
    
    

你可能感兴趣的:(深入理解ES6三)