this关键字和ES6

目录

this关键字

1.this关键字的含义

2.this关键字的理解

3.改变this含义

1.用call改变this含义

2.用apply  --  改this

3.用bind  --  改this

ES6

1.变量

2.箭头函数

1.语法:(形参) => {代码段}

2.带参数的写法

3.使用场景:通常在数组方法中使用

4.箭头函数中没有this关键字

3.形参默认值

4.模板字符串

5.解构赋值

1.解构对象

2.解构数组

6.展开合并运算符

1.将对象展开成多个键值对

2.数组展开 - 将数组展开成多个值

3.数组合并

7.对象简写

属性:

方法:

8.Map方法

定义:

方法:

属性:

9.Set方法

方法:

10.for...of



this关键字

1.this关键字的含义

全局/普通函数/定时器/自调用函数中的 this 都代表 window

事件函数中的this 代表当前事件源/标签

对象方法中的this  代表当前对象

箭头函数中的this  代表上级作用域的this

严格模式中普通函数的this代表undefined

2.this关键字的理解

函数定义好,我们并不能确定其中的this代表什么,关键取决于谁调用这个函数,他就代表谁

3.改变this含义

1.用call改变this含义

(1).语法:函数.call(新的this含义)

call能改变this , 也能调用函数

(2)语法: 函数.call(新的this含义,实参1,实参2,...)

函数需要的实参,从call的第二个实参开始传递

(3)改变this的使用场景

1.场景1:精准的检测对象的具体类型

    {}有toSrting, 转成字符串的结果是[object Object]            

    toString方法中的this代表的是{}

    我们希望date能使用到{}的toSting方法,结果像上面的结果一样 - 改this

    {}.toString.call(date)  [object Date]

<script>
    var date = new Date()
    var arr = []
    var obj = {}
    Math
    //类型检测 - typeof == 输出的对象类型太单一,不能很直观的看到对象具体是干什么用的
    //  console.log(typeof date);
    //  console.log(typeof arr);
    //  console.log(typeof obj);
    //  console.log(typeof Math);

    console.log({}.toString.call(date));
    console.log({}.toString.call(arr));
    console.log({}.toString.call(obj));
    console.log({}.toString.call(Math));


    console.log({}.toString.apply(date));
    console.log({}.toString.apply(arr));
    console.log({}.toString.apply(obj));
    console.log({}.toString.apply(Math));
   
</script>

2.场景2:把伪数组转成数组

2.用apply  --  改this

(1).语法:函数.apply(新的this含义)

能调用函数

(2).语法:函数.apply(新的this含义, [实参1, 实参2, ...])

apply给函数传递实参,是将所有实参组成一个数组,作为apply的第二个参数传递的

(3).使用场景同call一样

3.用bind  --  改this

(1).语法:函数.bind(改变后的this含义)

复制一个新函数,并改变新函数中的this

复制出来的新函数和原本的函数一模一样,但不是同一个。

(2).bind使用场景

<body>
<button>按钮</button>
</body>
<script>
    //bind使用场景
    document.querySelector('button').onclick = function () {

        setTimeout((function(){
            //改变btn的背景颜色
            // document.querySelector('button')
            this.style.backgroundColor = 'red'
            // console.log(this);
        }).bind(this),500)
    }
</script>

ES6

1.变量

1.let是es6新增的用于定义变量的关键字 - 使用方式跟var是一样的

let定义变量没有预解析

let不允许重复定义

let定义的变量会自带块级作用域(全局定义的变量不在window中)

2.const - 定义常量 - 使用方式跟var是一样的

跟let不一样的地方:  定义就必须赋值

总结:

    let具有的特性const都有

    定义就必须赋值

    值不可以改

    let其实还是会提前解析到,只是解析后也不能使用

例:

 var a = 10
 function fn() {
     // 暂时性死区
     a = 20
     console.log(a);
     // let其实还是会提前解析到,只是解析后也不能使用
     let a = 30
 }
 fn()
 console.log(a);

2.箭头函数

es6中提供的新的定义函数的语法

其实是对以前函数定义的一种简写 - 只能简写匿名函数

1.语法:(形参) => {代码段}

let fn = function(){
    console.log(111);
}

使用箭头函数简写

let fn = () => {console.log(111)}

2.带参数的写法

 let fn = function(a,b){
    console.log(a+b);
}

使用箭头函数简写

let fn = (a,b) => {console.log(a+b);}

fn(3,4)

注意:如果只有一个形参的时候,小括号可以省略:

 var add = function(a) {

     console.log(a + 6);

 }

使用箭头函数简写

 var add = a => { console.log(a + 6); }

 add(2)

注意:当大括号中只有一行代码的话,就可以省略大括号

使用箭头函数简写

var add = a => console.log(a + 6);

 add(2)

当箭头函数省略大括号后,如果这行代码中有return关键字,return关键字必须省略

var add = function(a) {

    return a + 3

}

使用箭头函数简写

var add = a => a + 3

var sum = add(4)

console.log(sum);

3.使用场景:通常在数组方法中使用

map - return的是新元素

filter - return的是条件

every - return的是条件

some - return的是条件

find -return的是条件

findIndex - return的是条件

数组.方法(function(v) {

    return 内容

})

数组.方法(v => 内容)

4.箭头函数中没有this关键字

可以说箭头函数中的this代表的是箭头函数所在作用域中的this

箭头函数定义好了就已经知道this代表什么了

箭头函数中的this不能修改

3.形参默认值

 函数调用有一个参数为0的情况比较多,我希望调用的时候能简便一点

 当需要让一个形参变成可选项,可传递实参也可以不传递的时候,es6中新语法,快速实现需求

 function getRandom(a, b = 0) { // 形参可以有默认值

     return Math.floor(Math.random() * Math.abs(a - b)) + Math.min(a, b)

 }

注意:带有默认值的形参,必须放在所有形参的末尾

4.模板字符串

es6提供的一种新的定义字符串的语法

语法:var str= `字符`

一个字符串可以多行定义---在控制台就可以多行显示

字符串内部通过${变量}可以直接解析变量,省略拼接

模板字符串不屑于拼接,在模板字符串中可以直接解析变量

5.解构赋值

解构赋值:是快速的方便的批量的把对象或数组中的多个值赋值给多个变量

1.解构对象

语法:var {属性名, 属性名, ..} = 对象

        var {属性名: 新的变量名} = 对象

        var {属性名: {属性名}} = 对象

2.解构数组

语法:var [变量名, 变量名, ..] = 数组

        var [变量名, [变量名]] = 数组

  var [ __,__,变量名, [变量名]] = 数组  -- 用下划线表示这个变量我不用

最简短的交换两个变量的值的代码

var a = 1
var b = 2
var [a, b] = [b, a]
console.log(a, b);

6.展开合并运算符

1.将对象展开成多个键值对

语法: ...对象 - 将对象展开成多个键值对

2.数组展开 - 将数组展开成多个值

语法:  ...数组

3.数组合并

语法:  ...数组名    将多个值收集在一个数组中

7.对象简写

属性:

当对象的属性名 和 对应的值所使用的变量名 同名了,就可以简写了

var obj = {name,  // 代表的是键值对

                age,

                sex

}

方法:

当对象的方法的值是一个匿名函数的时候,方法可以简写

var obj = {

eat( ) {  }

8.Map方法

Map:这是一种es6新提供的一种对象数据(是一个键值对,类型是object)

Map数据其实是一种键值对

object的键必须是字符串,如果给的不是字符串,会转成字符串作为对象的键

Map的键,可以是任意数据类型  跟之前学习的object的区别是键可以是任意类型的数据,不会被覆盖

定义:

var m = new Map()

var m = new Map([['键1', '值'], ['键2', '值']])

方法:

1.设置键值对 - set

map.set(键, 值) - 如果map中已经有了当前指定的键,后面的值会覆盖前面的值。

2.根据键获取值 - get

map.get(键) -  返回获取到的值。如果获取一个map中不存在的键,返回undefined。

3.删除键值对 - delete

map.delete(键)  -  返回布尔值,代表是否删除成功。删除map中不存在的键,返回false。

4.判断map中是否包含某个键值对 - has

map.has(键) -  返回布尔值

5.清空map中的数据 - clear

map.clear() - 没有返回值,

6.获取所有键的集合 - keys

map.keys() - 返回一个集合

7.获取所有值的集合 - values

map.values() - 返回一个集合

8.遍历map - forEach

map.forEach((item, key) => {})

属性:

获取map中键值对的数量 - size

map.size  - 返回数字

9.Set方法

es6提供的一种新的对象类型的数据 - Set

官方:Set是所有键的集合

我们语言:新型的数组,数组中不能有重复的元素

定义

var s = new Set()

实现数组去重

var arr = [1,1,2,2,2,3,3,4] 

console.log ( [...new Set(arr) ] );  // [1,2,3,4]

方法:

1.添加一个元素

set.add(值)  -  返回添加后的新set。如果添加的数据在set中存在,则添加不进去

2.删除一个元素

set.delete(元素) -  返回布尔值,表示是否删除成功

3.查看set中数据长度

set.size  --  返回数字

4.判段set中是否有某个数据

set.has(数据)   --  返回布尔值

5.清空set中的数据

set.clear()  -  没有返回值

6.遍历

set.forEach(item => {} )

10.for...of

es6提供 了一种新的遍历语法(直接遍历到值的一种方式)

语法:

for(var a of 数组/字符串) {

}

用于遍历值的一种遍历方式,不能遍历对象

可以遍历数组、字符串、map、set

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值