1.13 学习JS
作者:互联网
1.基本数据类型是存放在栈中,引用数据类型是存放在堆中
Let a = 1 就是在栈中存放一个值a
Let a = [1,2] 引用数据类型会在栈中存放一个地址值并在堆中存放地址值和数据,如果要用这个值会通过栈的地址值去查找堆中相同的地址值,如果不是引用数据类型则直接访问值
2.深浅拷贝:
(1)浅拷贝:如果拷贝的是一个基本数据类型,则拷贝的是基本数据类型的值,如果是引用数据类型,则拷贝的是堆中的地址值,如果其中一个对象改变值,则另一个对象也会跟着改变
浅拷贝方法:Array的slice和concat方法都是浅拷贝
(2)深拷贝:将一个对象从内存中整个拷贝出来,然后在堆开辟一个新的区域存放新对象,所以这两个对象互不影响
深拷贝方法:
JSON.stringify():把一个js对象序列化为一个JSON字符串
JSON.parse():把JSON字符串反序列化为一个js对象
3. 同步异步的区别
同步异步的区别就是在单线程上执行先后顺序的不同
同步:当前执行的API执行完才能执行下一个API,在主线程上排队执行任务,上一个任务执行完才能执行下一个任务
异步:能改变程序正常执行顺序的就是异步。当前执行的API不会堵塞后面的程序执行,进入任务队列,等待主线程上的任务执行完进入主线程执行任务
4.闭包
(1)是什么:闭包是一个嵌套的内部函数,包含被引用变量的对象,内部嵌套函数能够调用外部嵌套函数的作用域,就是闭包
(2)如何产生闭包:内部函数引用外部函数的变量时,产生闭包
(3)作用:可以访问外部的变量,使用内部函数的变量在程序执行完毕后会存在内存中,延长了局部变量的生命周期
(4)缺点:内存泄漏
5.内存泄漏:就是用过的东西没有及时的回收 导致部分内存长期被占用,程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费
(1)对于一个持续使用浏览器来说,如果一些不能用到的内存没有被及时释放,这就叫内存泄漏
(2)js的垃圾回收机制 js中的内存回收机制采用的是 引用计数:垃圾回收器会定期扫描内存,当某个内存中的值被引用为零时就会将其回收。当前变量已经使用完毕但依然被引用,导致垃圾回收器无法回收这就造成了内存泄漏
(3)识别方法:浏览器和命令行
6.for in 和 for of 区别
for in 一般用来操作对象
for in 能遍历对象内的数值,能遍历数组的索引值
for in 也能遍历手动添加上的键名和原型链上的键名
for of 一般用来操作数组 只能遍历有部署了原生的 iterator 接口,若想遍历对象,可以用
object.keys(value)转换为数组,再进行遍历
7.this指向问题
只有函数被调用的时候才能知道this指向谁,this指向调用者
(1)定时器中 this 指向window
(2)构造函数中 this指向实例对象
(3)箭头函数中 没有this,this指向父级作用域的this
(4)在普通函数内,this指向上一级调用者,如果没有上一级调用者,则指向window
8.箭头函数
(1)箭头函数没有自己的argument
(2)箭头函数没有自己的this,它的this指向父级作用域的this
(3)call bind apply 不能修改this的指向,this的指向是不会改变的
(4)箭头函数不能用来做构造函数 它没有this
(5)箭头函数没有自己的原型prototype
9.call bind apply的区别
(1)三者都是用来修改this指向对象的 bind返回的是一个新的函数 需要调用执行
(2)三者的传参不同 第一个参数三者都是传入一个修改的this指向对象
第二参数中 call传入的参数直接写在后面,多个参数以逗号隔开
apply传入的参数用数据接收,多个参数以逗号隔开
bind传入的参数和call一样
9.宏任务 微任务
宏任务:每次执行栈执行的代码就是一个宏任务计时器 ajax 读取文件
微任务: 在当前 task 执行结束后立即执行的任务promise.then
执行顺序:同步程序=>process.nextTick=>微任务=>宏任务=>setImmediate \
10.async和await
使用async定义的函数 返回值是一个promise对象,await只能跟async一起使用,
优点在于处理then的调用链,能够使代码更加简洁清晰
缺点在于await会堵塞代码,他会等待await后的代码执行完再去执行下一行代码,即使后面跟着的是同步代码
标签:函数,指向,对象,JS,学习,内存,拷贝,执行,1.13 来源: https://blog.csdn.net/weixin_60495440/article/details/122458901