this关键字和ES6

本文详细介绍了JavaScript中的this关键字在不同场景下的含义,包括全局、函数、事件等,并讲解了如何通过call、apply、bind来改变this的指向。此外,还深入探讨了ES6的新特性,如let和const的声明方式,箭头函数的使用及其与this的关系,形参默认值,模板字符串,解构赋值,展开合并运算符,对象简写,Map和Set数据结构,以及for...of循环的使用。
摘要由CSDN通过智能技术生成

一丶this关键字

概念:js中内置了this关键字,在不同的作用域表示的含义不同

1.含义;

1.全局的this代表window

console.log(this)

2.普通函数中的this代表window (严格模式中普通函数的this代表undefined)

function   fn(){    console.log(this)      }  fn()

3.自调用函数中的this代表window

(function(){    console.log(this)         })()

4.定时器中的this代表window

setTimeout(function(){    console.log(this)      },1000)

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

<button  id="btn">按钮</button>

btn.οnclick=function(){   console.log(this)     }

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

var  obj = {   name:'张三', age:12 ,eat:function(){    console.log(this)    }    }            obj.eat

2.this关键字的理解

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

fn()   =====  window.fn()   代表window

document.onclick = fn   ===    document.onclick()    代表document

obj.fn()    代表对象obj

window.setTimeout() ==  window    代表window

自调用函数  === window.函数()       代表window

全局中的this     代表window

3.改变this的含义

1.call     语法 :  函数.call(改变后的this含义,调用的实参)

给call传递第一个参数为null,就表示将函数中的this改为了window

function add(a,b){ console.log(a+b);console.log(this); } add(1,2)  -----    add.call(document,3,4)

2.apply    语法:  函数.apply(改变后的this含义,[调用的实参])

function add(a,b){ console.log(a+b);console.log(this); } add(1,2)  -----    add.apply(document,[3,4])

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

function add(a,b){ console.log(a+b);console.log(this); }  var newAdd = add.bind(document) newAdd( 3, 4 )

复制函数, 返回一个新函数  新函数和原函数不是一个   新函数的this含义改变

总结: call  apply 是调用函数并改变this     bind 是复制一个新的函数出来 并返回this

4.伪数组

伪数组是一个对象,这个对象中必须有length属性,如果length不为0,那么这个对象中必须由下标和对应的数据

3.1.bind使用场景

document.querySelector('button').onclick = function() {

   setTimeout((function() {

        // 改变btn的背景颜色

        this.style.backgroundColor = 'red'

    }).bind(this), 500)       }

定时器外面的this代表document,定时器里面的this代表定时器外面的this,所以定时器里面的this就代表document,  查找的时候是向外查找 

3.2.call和apply使用场景

精准的检测对象的具体类型

语法:对象.toString.call(数据)

console.log(  {}.toString.call(date)  )    输出结果:  [object  Date]

{}用toString,转成字符串的结果是 [object  Object]    toString方法中的this代表的是{} 

语法:对象.toString.apply(数据)

apply的使用场景和call一样

二丶ES6

1.定义变量

1.let是es6新增的定义便令的关键字  使用方式跟var是一样的

let  a = 20  //  let定义变量没有预解析   

不允许重复定义(就是一个变量名不能赋两次值 例如 var a=10 ; var a= 20;)

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

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

let的特性const都有   const定义就必须赋值  const a = 20    值不能更改

2.箭头函数

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

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

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

   

当大括号中只有一行代码的话,就可以省略大括号  var add = a => console.log(a+6)  add(2) 

 使用场景:通常在数组中使用

数组.方法(function(v){    return 内容   })

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

箭头函数中没有this关键字 - 可以说箭头函数中的this代表的是箭头函数所在作用域中的this

箭头函数定义好了就已经知道this代表什么了        箭头函数中的this不能修改

3.形参默认值

 4.模板字符串 (es6提供的一种新的定义字符串的语法)

语法: `字符`

var  str = `

a

b

`

可以换行书写,保持字符串中的换行和空格

模板字符串中可以识别变量,使用美元符大括号:${变量}

var imgPath = 'a/b/c/1.jpg'(图片地址)

var img = '<img src="'+imgPath+'" />'

var img = `<img src="${imgPath}" />`

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

对象解构:  变量名必须与属性名一致

var obj = { name : '张三' ,  age : 12 ,  inMan : true }

var {name ,  age , isMan } = obj       console.log(name, age, isMan);

在解构的时候取别名   取别名后原来的名称就不能使用了

var {name: a ,  age: b , isMan: c } = obj     console.log(a,b,c)

 数组解构

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

 

 6.展开合并运算符

 将对象展开成多个键值对

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

 

 数组合并

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

 7.对象简写

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

 

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

  

 8.Map

 Map:这是一种es6新提供的一种对象数据

Map数据其实是一种键值对

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

Map的键,可以是任意数据类型

定义:  var m =  new  Map()

map的结构使用[],其中的数据也必须是[],在里面的[]中第一个为键,第二个为值,如果只有键没有值,默认的值为undefined

Map的操作方法:

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

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

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

判断map中是否包含某个键值对:map.has(键)。返回布尔值

获取map中键值对的数量:map.size,返回数字,

清空map中的数据:map.clear()。没有返回值,

获取所有键的集合:map.keys(),返回一个集合,

获取所有值的集合:map.values(),返回一个集合,

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

9.set

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

官方:Set是所有键的集合

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

定义

var s = new Set()

 给set集合中添加值:set.add(值)。返回添加后的新set。如果添加的数据在set中存在,则添加不进去,已经存在的元素是添加不进去的:

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

查看set中数据的长度:set.size,返回数字。

判断set中是否有某个数据:set.has(数据)。返回布尔值

清空set中的数据:set.clear()。没有返回值,

遍历set:set.forEach(item => {})

10.for ... of

es6提供 了一种新的遍历语法

语法:

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

}

for in用来遍历键。可以遍历的数据如下:

  • 可以遍历object类型,只要类型是object就能遍历,但能遍历的只有可遍历/可枚举的属性,(也就是enumerable属性为true的属性);

  • 可以遍历数组,但遍历出来的下标是字符串,遍历数组的时候会将数组的下标作为键

  • 可以遍历字符串,遍历出来的下标也是字符串

  • 如果对象的原型中有可遍历的属性,会将原型中的可遍历属性也遍历出来。如果原型中的可遍历属性和对象本身的可遍历属性重名,就只遍历对象本身的属性了。

for of用来遍历值。可以遍历的数据如下:

  • 可以遍历数组,遍历出来的是数组中的每个元素

  • 可以遍历字符串,遍历出来的是字符串中的每个字符

  • 可以遍历set集合。

  • 可以遍历Map集合

  • 不可以遍历对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值