持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
介绍 this 各种情况
this : 谁调用我,我就指向谁
1 普通函数 函数名() : window
2 对象方法 对象名.方法名() : 对象
3 构造函数 new 函数名() : new创建的实例对象
4 箭头函数没有this,外层有就是外层,没有就是window
5 使用 call 和 apply 调用时
数组中的 forEach 和 map 的区别?
相同点 都是循环遍历数组中的每一项
不同点
1 map 方法返回一个新的数组
2 map 方法不会改变原始数组
3 若 arr 为空数组,则 map 方法返回的也是一个空数组
forEach 方法
1 遍历数组的每一个元素,没有返回值
2 forEach 空数组调用没有回调函数。
for in 和 for of 的区别
1 遍历对象用for in,遍历数组用 for...of
2 for...in 循环出的是 key,for...of 循环出的是 value
3 for...of 不能循环普通的对象,需要通过和 Object.keys()搭配使用
4 for...of 是 ES6 新引入的特性。修复了 ES5 引入的 for...in 的不足
call 和 apply,bind 的区别
共同点:
1 都是用来改变函数的 this 对象的指向的。
2 第一个参数都是 this 要指向的对象。
3 都可以利用后续参数传参。
不同点
传参方式不同,
Call、bind()都是单个传参
apply是数组传参
bind传参返回一个新函数
call()可以检测数据类型
EventLoop 事件循环机制
任务是以事件及其回调的方式存在的。当事件(用户的点击,图片的成功加载)发生时,将其回调添加到任务队列;主线程上的任务完成之后,就会从任务队列中取出任务来执行,此过程不断重复从而形成一个循环,称为eventLoop。
事件:用户点击触发的函数
循环:每个tab也都有一个渲染进程,并且主线程非常繁忙,既要处理 DOM,又要计算样式,还要处理布局,同时还需要处理 JavaScript 任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务,这个统筹调度系统就是消息队列和事件循环。
防抖和节流
防抖:持续触发事件,在一定时间内,只执行最后一次
节流:持续触发事件,期间只会执行第一次操作
new 操作符具体干了什么呢?
1 New构造函数可以在内存中开辟一个空间对象
2 this就会指向刚刚创建的对象
3执行构造函数里面的代码,给这个空对象添加属性和方法
4返回这个对象
把两个数组合并,并删除第二个元素。
Let arr =【1,2,3】
Let arr1= arr.concat(【4,5,6】)
Arr1.splice(1,1)
谈谈你对 Javascript 垃圾回收机制的理解?
1 标记清除:当变量进入执行环境的时候,函数中声明一个变量,标记为“进入环境”,函数执行结束,垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及闭包,在这些完成之后仍存在标记的就是要删除的变量了 2 引用计数
class 和普通构造函数有何区别?
我认为,class 是构造函数的语法糖
class 在语法上更加贴合面向对象的写法
class 实现继承更加易读、易理解
更易于写 java 等后端语言的使用
本质还是语法糖,使用 prototype
JS 里垃圾回收机制是什么,常用的是哪种,怎么处理的?
工作流程:
在运行的时候加上标记
去掉环境中的变量和环境中引用的变量的标记
加上标记的会被视为准备删除的变量
垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间
什么是进程、什么是线程、它们之间是什么关系 !
1 进程:
每个进程都有独立的内存地址空间
系统进行资源分配和调度的基本单位
进程里的堆,是一个进程中最大的一块内存,被进程中的所有线程共享的
2 线程:
是进程中的一个实体
关系:
一个程序至少一个进程,一个进程至少一个线程,多个线程是共享进程的资源