var a=10;
var b=20;
var obj={
a:100,
b:200
}
function sum(a,b){
console.log(a+b)
console.log(this.a+this.b);
}
sum(1,2)//3,30
强制修改this指向
需求:让sum方法中的this指向obj
1.call方法
sum.call(obj,1,2)//3,300
call做的事情
(1)指向原方法
(2)让方法中的this指向call的第一个参数
(3)把call的后续参数传给原方法
2.apply方法
sum.apply(obj,[1,2])//3,300
apply的作用和call一样
只是在使用时,apply的第二个参数必须是数组
把需要传给原方法的参数放入数组中
3.bind方法
let newSum=sum.bind(obj) newSum(1,2)//3,300
bind的作用
与call和apply方法不同
call和apply只是一次性的改变this指向
但是bind会把改变this指向后的方法返回,需要给返回的方法命名形成新方法,后续使用新方法,就是原方法改变this指向后的方法
数组解构
let arr=[1,2,3,4]
let [a,b,c,d]=arr
console.log(a,b,c,d)//1,2,3,4
let [z1,,z3]=arr
console.log(z1,z3)//1,3
只要把数组赋值给变量名组成的数组,变量名就会获得对应位置上的值
交换变量值(最少的代码)
var x=10
var y=20
var [x,y]=[y,x]
console.log(x,y)
对象解构
let obj={
a:10,
b:20,
c:30,
d:40
}
let {a:a1,b:b1,d:d1,c:c1}=obj
console.log(a1,b1,c1,d1)//10,20,30,40
let {c:x}=obj
console.log(x)//30
对象解构的用法
把对象赋值给变量名组成的对象
变量名组成的对象中,属性名是变量名
属性名是变量要保存的值在源对象中的属性名是a
此例中,变量a1要保存的值是10,在原对象中的属性名是a
所以变量组成的对象中解构就是{a:a1}
因为是通过属性名与变量名建立关系
所以变量名组成的对象中,没有顺序,且需要哪个属性解构哪个属性即可
注:一般的对象中属性名和变量名保持一致
let {a:a,b:b,c:c,d:d}=obj
console.log(a,b,c,d)//10,20,30,40
ES6给我们提供了简写的方法,当属性名和属性值一样时,可以只写一个
let {a,b,c,d}=obj
console.log(a,b,c,d)//10,20,30,40
打散
打散就是把数组打散成一个一个的值
let arr=[1,2,3,4]
//需求:找出数组最大值
let max=Math.max(1,2,3,4)
console.log(max)//4
通过打散,把数组打散成一个一个的值
let max=Math.max(...arr)
console.log(max)//4
参数增强
与解构联合使用
let stu1={
name:'a',
age:15,
sex:'男'
}
let stu2={
name:'b',
age:16,
sex: '男'
}
let stu3={
name:'c',
age:17,
sex:'女'
}
//定义方法,intr输出学生对象的name,age和sex
function intr(stu){
console.log(stu.name,stu.age,stu.sex)
}
intr(stu1)
function intr({name,age,sex}){
console.log(name,age,sex)
}
intr(stu2)
相当于做了{name,age,sex}=stu的操作
需求定义一个方法,求所有参数的和
分析:参数不确定,所以可以把所有的参数看做是一个打散的数组
function sum(...arr){
//参数是打散的数组arr
//求所有参数的和就是求数组arr的和
var sum=0
arr.forEach(item=>{
sum+=item
})
console.log(sum)
}
sum(1,2,3)
//但参数是1,2,3,说明数组arr打散后是1,2,3,说明函数内部存在数组arr:[1,2,3]
//求1,2,3的和就是求数组arr的和
//注:当参数不确定时,就是打散数组作为形参
需求:求工资综合
其中工资包含固定部分底薪,以及不定部分提成
底薪一定存在,但是有没有提成以及有几个提成不确定
function salary(base,...bonus){
//提成部分不确定,设置成打散的数组
//计算工资就是计算base加上bonus数组的和
let sum = base
for(let i = 0;i<bonus.length;i++){
sum += bonus[i]
}
console.log(sum)
}
salary(10000,200,500,700,30)
salary(2000)
注:1.不定部分与固定部分同时存在,就先写出固定部分的形参,然后把不定部分的形参设置成打散的数组。
2.固定参数,必须写在打散数组前