【手撕面试题】JavaScript(高频知识点三)

这篇具有很好参考价值的文章主要介绍了【手撕面试题】JavaScript(高频知识点三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

面试官:什么是防抖和节流,他们的应用场景有哪些?

面试官:js中什么是可选操作符,如何访问数组?

面试官:请简述一下 event loop

面试官:请简述 node/v8 中的垃圾回收机制

面试官:如何删除项目中没有使用到的 package?

面试官:请你谈谈 js 中在 new 的时候发生了什么?

面试官:浏览器的剪切板中如何监听复制事件?

面试官:如何实现页面文本不可复制?

面试官:异步加载 JS 脚本时,async 与 defer 有何区别?

面试官:前端如何实现文件上传功能?


        每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术 之美。

面试官:什么是防抖和节流,他们的应用场景有哪些?

我:呃~,防抖和节流以及他们的应用场景总结如下:

防抖:顾名思义就是防止抖动,以免把一次事件误认为是多次,敲键盘就是一个每天都会接触到的防抖操作,在JS中有好多防抖的场景,例如:登录、发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖;调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖;代码如下,可以看出来防抖重在清零:

function debounce(f, wait) {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => {
      f(...args);
    }, wait);
  };
}

节流:节流,顾名思义,控制水的流量。控制事件发生的频率,如控制为 1s 发生一次,甚至 1 分钟发生一次。与服务端(server)及网关(gateway)控制的限流 (Rate Limit) 类似,在JS中有好多节流的场景,例如:scroll事件,每隔一秒计算一次位置信息等;浏览器播放事件,每个一秒计算一次进度信息等;input 框实时搜索并发送请求展示下拉列表,每隔一秒发送一次请求 (也可做防抖);代码如下,可以看出来节流重在加锁:

function throttle(f, wait) {
  let timer;
  return (...args) => {
    if (timer) {
      return;
    }
    timer = setTimeout(() => {
      f(...args);
      timer = null;
    }, wait);
  };
}

总结

防抖:防止抖动,单位时间内事件触发会被重置,避免事件被误伤触发多次。代码实现重在清零 clearTimeout。防抖可以比作等电梯,只要有一个人进来,就需要再等一会儿。业务场景有避免登录按钮多次点击的重复提交。

节流:控制流量,单位时间内事件只能触发一次,与服务器端的限流 (Rate Limit) 类似。代码实现重在开锁关锁 timer=timeout; timer=null。节流可以比作过红绿灯,每等一个红灯时间就可以过一批。

面试官:js中什么是可选操作符,如何访问数组?

我:呃~,?. 操作符,可以嵌套获取对象的属性值。通过获取对象属性获得的值可能是 undefined 或 null 时,可选链操作符提供了一种方法来简化被连接对象的值访问。具体使用方式如下:

const o = {};

// 添加可选链之前
o && o.a && o.a.b && o.a.b.c && o.a.b.c.d;

// 添加可选链之后
o?.a?.b?.c?.d;

const obj = { a: [1, 2], b() {} };
// 访问数组
obj?.a?.[0];
//使用方法
obj?.b?.();

面试官:请简述一下 event loop

我:呃~,因为 JS 是单线程的,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。为了解决排除等待问题,JS 的任务分为同步任务(synchronous)和异步任务(asynchronous)。 所有同步任务都在主线程上执行,形成一个 Stack)。异步任务(如果是 WebAPI 则会进入 WebAPI,例如 ajax setTimeout)不进入主线程,而是进入另一 Callback Queue。同步任务顺序执行,只有执行栈中的同步任务执行完了,系统才会读取任务队列中可以执行的异步任务,才会把此异步任务从事件队列中放入执行栈中执行,如此循环,直至所有任务执行完毕。这就是 EventLoop。代码如下:

setTimeout(() => console.log(0));
new Promise((resolve) => {
  console.log(1);
  resolve(2);
  console.log(3);
}).then((o) => console.log(o));

new Promise((resolve) => {
  console.log(4);
  resolve(5);
})
  .then((o) => console.log(o))
  .then(() => console.log(6));

输出内容如下:

【手撕面试题】JavaScript(高频知识点三)

面试官:请简述 node/v8 中的垃圾回收机制

我:呃~,v8 中的垃圾回收机制分为如下三种:

Scavenge:工作在新生代,把 from space 中的存活对象移至 to space

Mark-Sweep:标记清除。新生代的某些对象由于过度活跃会被移至老生代,此时对老生代中活对象进行标记,并清理死对象

Mark-Compac:标记整理。

当一个函数执行结束之后,JavaScript 引擎会通过向下移动 ESP 来销毁该函数保存在栈中的执行上下文。 要回收堆中的垃圾数据,就需要用到 JavaScript 中的垃圾回收器了。 代际假说(The Generational Hypothesis),是垃圾回收领域中一个重要的术语,后续垃圾回收的策略都是建立在该假说的基础之上的,所以很是重要。 代际假说有以下两个特点

1)大部分对象在内存中存在的时间很短,简单来说,就是很多对象一经分配内存,很快就变得不可访问;

2)是不死的对象,会活得更久。 在 V8 中会把堆分为新生代和老生代两个区域,新生代中存放的是生存时间短的对象,老生代中存放的生存时间久的对象。 ● 副垃圾回收器,主要负责新生代的垃圾回收。 ● 主垃圾回收器,主要负责老生代的垃圾回收。

【手撕面试题】JavaScript(高频知识点三)

 使用增量标记算法,可以把一个完整的垃圾回收任务拆分为很多小的任务,这些小的任务执行时间比较短,可以穿插在其他的 JavaScript 任务中间执行,增强用户体验。

面试官:如何删除项目中没有使用到的 package?

我:呃~,可以采用 depcheck 来完成这件事,代码如下:

npm install depcheck -g

面试官:请你谈谈 js 中在 new 的时候发生了什么?

我:呃~,在js中进行new的时候,发生了下面的四步:

1)创建了一个新对象

2)链接到原型

3)绑定这个指向

4)返回这个对象

function _new() {
  let obj = {};
  let Con = [].shift.call(arguments);
  obj.__proto__ = Con.prototype;
  let result = Con.apply(obj, arguments);
  return typeof obj === "object" ? obj : {};
}

面试官:浏览器的剪切板中如何监听复制事件?

我:呃~,可以采用原生js发方式进行监听,如下:

// 在 HTML 元素上
<input oncopy="cb" />

// 在 JS 中获取具体元素
document.querySelector("p").oncopy = cb;
document.oncopy = cb;
// 或
document.querySelector("p").addEventListener("copy", cb);
document.addEventListener("copy", cb);

面试官:如何实现页面文本不可复制?

我:呃~,有CSS和JS两种方法,以下任选其一或结合使用即可。

使用CSS如下:

user-select: none;

使用JS如下,监听 selectstart 事件,禁止选中,当用户选中一片区域时,将触发 selectstart 事件,Selection API 将会选中一片区域。禁止选中区域即可实现页面文本不可复制:

document.body.onselectstart = (e) => {
  e.preventDefault();
};

document.body.oncopy = (e) => {
  e.preventDefault();
};

面试官:异步加载 JS 脚本时,async 与 defer 有何区别?

我:呃~,在正常情况下,即 <script> 没有任何额外属性标记的情况下,有几点共识JS 的脚本分为加载、解析、执行几个步骤,简单对应到图中就是 fetch (加载) 和 execution (解析并执行)JS 的脚本加载(fetch)且执行(execution)会阻塞 DOM 的渲染,因此 JS 一般放到最后头

而 defer 与 async 的区别如下:

相同点:异步加载 (fetch)

不同点

async 加载(fetch)完成后立即执行 (execution),因此可能会阻塞 DOM 解析;

defer 加载(fetch)完成后延迟到 DOM 解析完成后才会执行(execution)**,但会在事件 DomContentLoaded 之前

面试官:前端如何实现文件上传功能?

我:呃~,将 input 的类型设置为 file,再加一个按钮就行,如下:文章来源地址https://www.toymoban.com/news/detail-404245.html

<input type="file" ref="referenceUpload" @change="onUpload"></input>
<button type="primary" style="margin: 0px 0px 0px -83px;">上传文件</button>

到了这里,关于【手撕面试题】JavaScript(高频知识点三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS-Web-API知识点与高频考题解析

    BOM 操作 DOM 操作 事件绑定 Ajax 存储 BOM(浏览器对象模型)是浏览器本身的一些信息的设置和获取,例如获取浏览器的宽度、高度,设置让浏览器跳转到哪个地址。 navigator screen location history 这些对象就是一堆非常简单粗暴的 API,没任何技术含量,讲起来一点意思都没有,大

    2024年02月09日
    浏览(55)
  • JavaScript 知识点

    立即执行函数 代码 创建函数的同时立即执行,没有绑定任何事件,也无需等待任何异步操作 function () {} 是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。 立即执行函数 也可以理解为立即调用一个匿名函数。最常见的应用场

    2024年02月11日
    浏览(26)
  • JavaScript知识系列(2)每天10个小知识点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 在 JavaScript 中,如果您尝试使用 new 来实例化(创建对象)一个箭头函数,会导致运行时错误。箭头函数与普通函数(使用 function 声明的函数)

    2024年02月09日
    浏览(32)
  • 【字节面试】Fail-fast知识点相关知识点

    字节面试,问到的一个小知识点,这里做一下总结,其实小编之前有一篇文章,已经对此有过涉及,不过这里知识专项针对于问题,把这个知识点拎出来说一下。 什么是Fail-fast机制? Hashmap是否拥有Fail-fast机制? ConcurrentModificationException异常原因和解决方法是什么? 哪些你常

    2024年01月22日
    浏览(35)
  • 2023面试知识点一

    默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 t

    2024年02月07日
    浏览(27)
  • Java 面试知识点

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的 语法,集合的语法,io 的语法,虚拟机方面的语法。 和都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否

    2024年02月16日
    浏览(32)
  • vue面试知识点

    Unsplash class 和 style 使用动态属性,使用驼峰式写法 v-if 和 v-show v-if 不渲染不满足判断条件的模块, v-show 渲染但不显示,使用场景:是否多次切换或频繁更新条件状态 keep-alive 缓存组件,使用场景:频繁切换,不需要重复渲染 v-for 中添加唯一的 key 为了高效的更新虚拟 DOM,

    2024年02月11日
    浏览(34)
  • 多线程面试相关知识点

    程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一

    2024年02月08日
    浏览(30)
  • java面试常见知识点

    JDK(Java Development Kit)是Java开发工具包,是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JRE是运行基于Java语言编写的程序所不可缺少的运行环境。JRE中包含了JVM,runtime class libraries和Jav

    2024年02月11日
    浏览(38)
  • FPGA面试-常用知识点

    本贴记录一下自己找工作过程中顺下来的知识点,如有错误的,请不吝指出,共同进步!   a) FPGA FPGA 基于 LUT ,LUT本质上就是一个RAM,每一个LUT可以看成一个有4位地址线的16x1的RAM。这也是为什么FPGA需要外接一个rom来上电配置。 包括 CLBs , I/O 块, RAM 块和可编程连线 。 在

    2024年04月26日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包