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.固定参数,必须写在打散数组前

03-23 03:25