一、函数参数默认值对函数的影响
(1)函数length受形参默认值影响
length的含义是,函数预期传入的参数个数,参数设置默认值后,就不包括该参数了,rest参数也不计入legnth属性。length属性的判断到设置了默认值的参数为止。
function test(a={}, b, c){} test.length // 0
function test1 (a, b=2, c){} test.legth // 1
(2)函数默认值对形参和arguments的影响<br />设置函数默认值后,形参和arguments的映射会脱钩
二、this指向
(1)在全局上下文中,无论是否为严格模式,this都指向window。
(2)函数内部,this在非严格模式下默认指向window,严格模式下默认为undefined。
(3)单独调用全局方法,this默认指向window,等同于调用window的方法(但是用let声明的字面量函数,不在全局对象上,单独调用时,this依然指向window)
(4)作为对象方法被调用,this为最近的引用成员。
function foo(){
console.log(this)
}
a.b.c.foo() // => c
(5)new运算符调用构造函数时this对象会被隐式返回,this此时为实例对象。
function Super(name){
this.name = name // this会被隐式返回,被保存为实例对象,this指向实例对象
}
let son = new Super('son')
(6)class类中,consstuctor中的this值实例对象,类的方法中,this指向还是看调用对象,如果要固定this指向,可以将方法bind一下。
三、箭头函数
箭头函数是一种更简洁的函数写法 : 不用写function和函数名、甚至参数圆括号和函数体大括号。
(1)直接返回一个表达式的时候,可以省略大括号(返回一个对象时,需用圆括号包起来,不然会报错)
let foo = a => a || 123;
(2)箭头函数的特点:
a. 箭头函数中,没有自己的this对象,而且是固定的,指向箭头函数定义时上层函数的this指向,普通函数中的this要看调用的方式。
function foo (){
setTimeout(()=>{
console.log(this.id) //箭头函数定义生效时,this为外层的this。
},100)
}
var id = 123
foo({id : 321})
b. 箭头函数中,没有argument属性,可以用rest参数来代替
let foo = (...args) = {
cosnole.log(args)
}
c. **不能用new操作符调用**,否则会报错
四、spread/rest运算符
(1)以数组形式搜集对应元素。可以用来代替arguments
作为形参时,rest运算符必须放在最后部分,后面不能跟其他形参,否则会报错Rest parameter must be last formal parameter
let foo = (...args)=>{
console.log(args) // => [1,2,3]
}
foo(1,2,3)
(2)将一个数组展开,扁平化一次。用于扁平化,替代concat方法,可以用apply来模拟
function foo([x, y, z]){
console.log(x, y, z) // => 1,2,3
}
foo(...[1,2,3,4,5])
foo.apply(null,[1,2,3,4,5])
foo.apply(undefined,[1,2,3,4,5])
//apply第一个参数传null或者undefined的话,不会改变函数内部this指向
let a = [1,2,3,4,5],
b = [1].concat(a);
b = [1, ...a] //替代concat方法
使用rest运算符和参数默认值都会影响到函数length属性