判断函数是否标记为async

简介: 判断函数是否标记为async

来看一道字节的面试题


/
  字节面试题
 
 判断函数是否标记为async
 */

function isAsyncFunction(func){}

isAsyncFunction(async () => {})

isAsyncFunction(() => {})

一、介绍


我们看一下标记的async的函数和没有标记async的函数到底有什么样的区别,打印看一下。
alt
展开之后,你会发现区别,普通的函数,它的原型是function啊,这是大家都知道的,每一个函数它的原型是function,function的原型呢是Object,它是这么一条原型链。


但是标记了async的函数呢,你看一下,它的原型变了,变成了AsyncFunction形,而这个AsyncFunction,它的原型才是function,也就是说在原形链上,它在中间夹了一层AsyncFunction
alt


所以说这个判断呢,好像还挺简单的,就判断这个函数它的原型,也就是判断这个函数它的constructor是不是AsyncFunction就完事了。


二、怎么判断是否为async function


我们打印看一下的constructor。它的构造函数,因为函数也是对象,每个对象都有产生它的构造函数,它这个构造函数是不是等于AsyncFunction。


function isAsyncFunction(func){
   
   
    console.log(func.constructor === AsyncFunction);
}
isAsyncFunction(async () => {})

isAsyncFunction(() => {})

alt
保存看一下,这个时候你会发现报错了,这个AsyncFunction,它是存在,但是它没有暴露给js,你在js里边是拿不到这个构造函数的。


1.Symbol.toStringTag


我们再一次去看一下它的对象结构,再看一下这个标记的AsyncFunction的函数,它里边还有个特点,它里边有一个特殊的符号属性,它的值呢是AsyncFunction,而普通函数呢,它没有这个符号属性
alt
那它会影响啥?它影响的是object toString这个方法,我们打印一下下面这个看一下结果。


function isAsyncFunction(func){
   
   
  console.log(Object.prototype.toString.call(func));
}

isAsyncFunction(async () => {})

isAsyncFunction(() => {})

alt

会发现,它会影响这个async,而普通函数,打印出来是Function。


那为什么会这样呢,原因是由于标记了async的函数,它有一个知名符号叫做Symbol.toStringTag,而这个符号的值呢,是AsyncFunction,于是,在使用上面方式进行打印的时候,它会用Symbol.toStringTag这个符号的值替换掉Function,它就影响这个。
alt


2、判断方法实现


所以,我们使用上面方法进行判断。


/
  字节面试题
 
 判断函数是否标记为async
 /
function isAsyncFunction(func){
    const str = Object.prototype.toString.call(func)
    console.log( str === '[object AsyncFunction]');
}
// true
isAsyncFunction(async () => {})
// false
isAsyncFunction(() => {})

或者


/**
 
 字节面试题
  判断函数是否标记为async
 
/
function isAsyncFunction(func){
    console.log(func[Symbol.toStringTag] === 'AsyncFunction');
}
// true
isAsyncFunction(async () => {})
// false
isAsyncFunction(() => {})

相关文章
|
3月前
|
存储 人工智能 搜索推荐
终身学习型智能体
当前人工智能前沿研究的一个重要方向:构建能够自主学习、调用工具、积累经验的小型智能体(Agent)。 我们可以称这种系统为“终身学习型智能体”或“自适应认知代理”。它的设计理念就是: 不靠庞大的内置知识取胜,而是依靠高效的推理能力 + 动态获取知识的能力 + 经验积累机制。
665 135
|
3天前
|
人工智能 自然语言处理 安全
2025年最好的Agent智能体有哪些?分场景测评+选型指南,一篇讲透
2025年,Agent智能体已从概念走向规模化落地,成为提升效率的“数字员工”。本文结合权威报告与百家企业实践,详解办公、产业、消费、研发四大场景下的实用Agent,并提供避坑指南与未来趋势,助你选对工具,实现价值匹配。
|
前端开发 JavaScript 容器
CSS 实战录: 双栏、四等分、不等间距、自适应...
CSS 实战录: 双栏、四等分、不等间距、自适应...
272 0
|
10月前
|
前端开发
Css实现文本超出长度隐藏并用三个点结尾
Css实现文本超出长度隐藏并用三个点结尾
258 17
|
人工智能 自然语言处理 算法
AI时代的企业内训全景图:从案例到实战
作为一名扎根在HR培训领域多年的“老兵”,我越来越清晰地感受到,企业内训的本质其实是为企业持续“造血”。无论是基础岗的新人培训、技能岗的操作规范培训,还是面向技术中坚力量的高阶技术研讨,抑或是管理层的战略思维提升课,内训的价值都是在帮助企业内部提升能力水平,进而提高组织生产力,减少对外部资源的依赖。更为重要的是,在当前AI、大模型、Embodied Intelligence等新兴技术快速迭代的背景下,企业必须不断为人才升级赋能,才能在市场竞争中保持领先。
1581 13
|
机器学习/深度学习 人工智能 芯片
【AI系统】谷歌 TPU v3 POD 形态
TPU v3 是 TPU v2 的增强版,主要改进包括:MXU 数量翻倍至 4 个,时钟频率提升 30%,内存带宽扩大 30%,容量翻倍,芯片间带宽增加 30%,可连接节点数增至 4 倍。TPU v3 通过采用水冷系统,不仅提高了功率,还优化了温度管理,显著提升了计算能力和能效。TPU v3 Pod 由 1024 个 TPU v3 组成,算力达 100 PFLOPS,适用于大规模神经网络训练。
918 2
|
机器学习/深度学习 人工智能 自然语言处理
AI与艺术创作:机器的艺术天赋
【10月更文挑战第31天】本文探讨了AI在艺术创作中的应用及其独特“艺术天赋”。从绘画、音乐、文学到设计,AI通过计算机视觉、自然语言处理和生成对抗网络等技术,逐渐展现出强大的创作能力。尽管面临原创性、审美标准和法律伦理等挑战,AI艺术创作仍为艺术界带来了新的视角和灵感,未来有望与人类艺术家共同推动艺术的创新与发展。
|
存储 缓存 监控
如何提高服务器CPU性能?
如何提高服务器CPU性能?
1298 3
|
Ubuntu Linux 网络安全
在Linux中,如何配置Samba或NFS文件共享?
在Linux中,如何配置Samba或NFS文件共享?