每日一篇——23秋招JS面经(6)

每日一篇------23秋招JS面经(6)

⭐Promise程序阅读题

在这道题中不仅要注意同步任务、微任务和宏任务,还要注意微任务中promise的then也是异步的,也会有先后顺序,④处执行完返回后才直到⑤有没有机会执行,所以执行完4会执行6,接下来才轮到5,所以答案为172384650

⭐如何理解JS中的异步

JS是一门单线程语言,因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个。

而渲染主线程承担着诸多工作,渲染页面,执行js都在其中执行。

如果用同步的方式,极有可能导致主线程产生阻塞,从而导致消息队列中很多任务无法及时执行。

所以浏览器就采取了异步措施,当某些异步任务触发时,如定时器、网络请求、事件监听器等,主线程就会将任务交给其他线程去处理,自身立即结束任务执行,转而执行后续任务,等到异步任务执行完毕,将事先传递的回调函数包装成任务,加入到对应队列(延时队列、微任务队列、交互队列)的末尾排队,等待主线程调度执行。

在这种异步模式下,浏览器就不会发生阻塞,保证了单线程的流畅运行。

⭐说一说事件循环

事件循环又叫消息循环,是浏览器渲染主线程的工作方式。

在Chrome的底层实现中,它开启了一个for的死循环,每次循环从消息队列中取出第一个任务执行,而其他线程只需要在合适的时机将任务放到消息队列中。

以前我们会将消息队列简单分为宏任务队列和微任务队列,现在随着浏览器环境愈发复杂,浏览器采用了更加灵活多变的处理方式。

根据W3C官方解释,每个任务都有不同的类型,同类型的任务须在同一个队列。不同的队列有不同的优先级(例如交互队列优先级大于延时队列),在一次事件循环中,由浏览器自行决定取哪一个队列的任务,但浏览器必须有一个微任务队列,且其优先级是最高的,必须优先调度执行。

⭐JS中的计时器能做到精确计时吗?

不可以

  1. 计算机中采用晶体振荡器来计时,虽然比较准确,但对比原子钟,精确度还是不足,且会受温度电压等因素影响,在计算机中通常会使用网络时间协议来进行校准。而js计时是调用操作系统中的计时函数,也就携带了些许偏差。
  2. 按照W3C标准,当浏览器中使用计时器,其嵌套层级超过五层时,之后的计时器就默认会有一个4ms的延迟,这4ms也会引起时间的偏差
  3. 而最主要的因素还是事件循环中,如果渲染主线程上有任务正在执行,就会推迟计时器的执行

⭐如何判断一个对象是否为空

如果使用常规的Object.getOwnPropertyNames()来判断,虽然可以将一般的不可枚举类型属性也判断出来,但无法判断继承的属性以及Symbol类型值定义的属性。所以我们需要使用Reflect.ownKeys()来进行转换,这样通过它返回的数组长度就能精准判断出对象是否为空。

⭐重写一下String.prototype.trim

1、正则

js 复制代码
String.prototype.trim = function() {
	return this.replace(/(^\s*)|(\s*$)/g, "")
}

2、双指针法

js 复制代码
String.prototype.trim = function() {
    while(this[0]===' ') {
        this = this.subString(1)
    }
    while(this[this.length-1]===' ') {
        this = this.subString(0, this.length-1)
    }
}
相关推荐
前端之虎陈随易9 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·vue.js·人工智能·typescript·node.js
一路向北he9 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
kyriewen9 小时前
豆包和千问同时关了智能体,我用它们搭的 3 个自动化全废了——迁移方案整理
前端·javascript·ai编程
前端一小卒10 小时前
我用 TypeScript 从零手写了一个 Claude Code,然后发现它的核心只有 30 行
前端·agent
Waay10 小时前
面试口述版:个人对 Prometheus 完整理解
运维·学习·云原生·面试·职场和发展·kubernetes·prometheus
大圣编程11 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
yuhaiqiang11 小时前
随手 vibecoding 的浏览器插件已经 6000 多次下载,聊聊他的产品设计
前端·后端·面试
之歆12 小时前
Vue商品详情与放大镜组件
前端·javascript·vue.js
再吃一根胡萝卜12 小时前
如何把小米 MiMo 接入 CodeBuddy,打造私有 Agent
前端
负责的蛋挞14 小时前
异步HttpModule的实现方式
java·服务器·前端