一、今日所学内容
1、this的指向
(1)概念:this是一个对象,通过this.属性名调用里面的东西
(2)this的七种指向:
全局中的this:指向window
函数中的this:谁调用就指向谁
对象的方法中的this:谁调用就指向谁
构造函数中的this:实例对象
定时器的回调函数中的this:指向window(严格来说,谁调用就指向谁)
事件处理函数中的this:事件源
箭头函数中的this:指向上一级;箭头函数中没有this,所以它的this指向的是绑定定义函数所处的作用域
(3)修改this指向
call()apply()
这两个方法都可以调用函数,在调用函数的同时,可以指定this的指向
函数(实参);
函数.call(this对象,参数1,参数2,......)
函数.apply(this对象,[实参1,实参2,......])
二者互不影响
bind()
把函数的this绑定到一个目标对象上,然后返回一个新函数
后续只需要调用新函数,新函数的this永远指向绑定的目标对象
已经使用过bind()修改this指向的函数,再次使用bind()时,不能修改this指向
原始函数可以多次使用bind()修改this指向
2、数据类型的分类
(1)ES5
基本:string、number、undefined、null、boolean
引用:object、function、array
(2)ES6
基本:string、number、undefined、null、boolean、symbol(独一无二的值;不常用)
引用:object
(3)ES11
bigInt:科学计算
(4)数据类型的内存分配
基本:栈
引用:堆,栈中存放的是它在堆中的地址,指向堆中的数据
(5)变量的复制
基本:传递值的拷贝
引用:传递地址的拷贝
(6)传递参数
基本:传递值的拷贝
引用:传递地址的拷贝
3、深浅拷贝
(1)为什么要拷贝?
如果是引用类型,直接复制,两个对象会共享一份数据,只要修改其中一个对象,就会对另外一个对象造成影响
(2)浅拷贝:只会拷贝对象的一层
方法一:定义的构造函数是对象{}时,使用forin循环
方法二:Object.assign():合并对象返回新对象
(3)深拷贝:每一层都拷贝
const构造函数2=JSON.parse(JSON.stringify(构造函数1));
JSON.stringify:把对象转为字符串
JSON.parse:把字符串转为对象
可以实现95%的深拷贝需要
(4)深拷贝的缺陷
undefined、函数、正则表达式、无限大、无限小以及时间对象等无法实现完美拷贝
(5)完美拷贝(深拷贝)
引入lodash.min.js文件
使用_.cloneDeep
4、变量的类型检测
(1)typeof:主要用于检测基本类型
(2)instanceof:主要用于检测引用类型
写法:变量(实例对象)instanceof构造函数
原理:变量的原型链上,能否找到后面的构造函数
返回值为布尔值
不能检测基本数据类型
(3)Object.prototype.toString.call(变量/实例对象):专门用来检测数据类型
返回值是一个字符串
|