谈谈最近自己看到的面试题,总觉得不太精简,自己罗列了一下,欢迎参考

89 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 线程:

是进程中的一个实体

关系:

一个程序至少一个进程,一个进程至少一个线程,多个线程是共享进程的资源