一、函数参数默认值对函数的影响
    (1)函数length受形参默认值影响
    length的含义是,函数预期传入的参数个数,参数设置默认值后,就不包括该参数了,rest参数也不计入legnth属性。length属性的判断到设置了默认值的参数为止

    1. function test(a={}, b, c){} test.length // 0
    2. function test1 (a, b=2, c){} test.legth // 1
    1. 2)函数默认值对形参和arguments的影响<br />设置函数默认值后,形参和arguments的映射会脱钩

    二、this指向
    (1)在全局上下文中,无论是否为严格模式,this都指向window
    (2)函数内部,this在非严格模式下默认指向window严格模式下默认为undefined。
    (3)单独调用全局方法,this默认指向window,等同于调用window的方法(但是用let声明的字面量函数,不在全局对象上,单独调用时,this依然指向window)
    (4)作为对象方法被调用,this为最近的引用成员

    1. function foo(){
    2. console.log(this)
    3. }
    4. a.b.c.foo() // => c
    1. 5new运算符调用构造函数时this对象会被隐式返回,this此时为实例对象。
    1. function Super(name){
    2. this.name = name // this会被隐式返回,被保存为实例对象,this指向实例对象
    3. }
    4. let son = new Super('son')
    1. 6class类中,consstuctor中的this值实例对象,类的方法中,this指向还是看调用对象,如果要固定this指向,可以将方法bind一下。

    三、箭头函数
    箭头函数是一种更简洁的函数写法 : 不用写function和函数名、甚至参数圆括号和函数体大括号。
    (1)直接返回一个表达式的时候,可以省略大括号(返回一个对象时,需用圆括号包起来,不然会报错)

    1. let foo = a => a || 123;

    (2)箭头函数的特点:
    a. 箭头函数中,没有自己的this对象,而且是固定的,指向箭头函数定义时上层函数的this指向,普通函数中的this要看调用的方式。

    1. function foo (){
    2. setTimeout(()=>{
    3. console.log(this.id) //箭头函数定义生效时,this为外层的this。
    4. },100)
    5. }
    6. var id = 123
    7. foo({id : 321})

    b. 箭头函数中,没有argument属性,可以用rest参数来代替

    1. let foo = (...args) = {
    2. cosnole.log(args)
    3. }
    1. c. **不能用new操作符调用**,否则会报错

    四、spread/rest运算符
    (1)以数组形式搜集对应元素。可以用来代替arguments
    作为形参时,rest运算符必须放在最后部分,后面不能跟其他形参,否则会报错Rest parameter must be last formal parameter

    1. let foo = (...args)=>{
    2. console.log(args) // => [1,2,3]
    3. }
    4. foo(1,2,3)

    (2)将一个数组展开,扁平化一次。用于扁平化,替代concat方法,可以用apply来模拟

    1. function foo([x, y, z]){
    2. console.log(x, y, z) // => 1,2,3
    3. }
    4. foo(...[1,2,3,4,5])
    5. foo.apply(null,[1,2,3,4,5])
    6. foo.apply(undefined,[1,2,3,4,5])
    7. //apply第一个参数传null或者undefined的话,不会改变函数内部this指向
    1. let a = [1,2,3,4,5],
    2. b = [1].concat(a);
    3. b = [1, ...a] //替代concat方法

    使用rest运算符和参数默认值都会影响到函数length属性