判断函数是否标记为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(() => {})

相关文章
|
存储 安全 编译器
原来可以这么玩!Go语言类型断言高级应用技巧发现
原来可以这么玩!Go语言类型断言高级应用技巧发现
289 0
|
前端开发 JavaScript 容器
CSS 实战录: 双栏、四等分、不等间距、自适应...
CSS 实战录: 双栏、四等分、不等间距、自适应...
251 0
|
9月前
|
前端开发
Css实现文本超出长度隐藏并用三个点结尾
Css实现文本超出长度隐藏并用三个点结尾
222 17
|
12月前
|
机器学习/深度学习 人工智能 芯片
【AI系统】谷歌 TPU v3 POD 形态
TPU v3 是 TPU v2 的增强版,主要改进包括:MXU 数量翻倍至 4 个,时钟频率提升 30%,内存带宽扩大 30%,容量翻倍,芯片间带宽增加 30%,可连接节点数增至 4 倍。TPU v3 通过采用水冷系统,不仅提高了功率,还优化了温度管理,显著提升了计算能力和能效。TPU v3 Pod 由 1024 个 TPU v3 组成,算力达 100 PFLOPS,适用于大规模神经网络训练。
829 2
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
392 2
Golang语言之函数(func)基础篇
|
Ubuntu Linux 网络安全
在Linux中,如何配置Samba或NFS文件共享?
在Linux中,如何配置Samba或NFS文件共享?
|
机器学习/深度学习 数据采集 人工智能
AI技术实践:利用机器学习算法预测房价
人工智能(Artificial Intelligence, AI)已经深刻地影响了我们的生活,从智能助手到自动驾驶,AI的应用无处不在。然而,AI不仅仅是一个理论概念,它的实际应用和技术实现同样重要。本文将通过详细的技术实践,带领读者从理论走向实践,详细介绍AI项目的实现过程,包括数据准备、模型选择、训练和优化等环节。
1281 3
|
设计模式 编译器 程序员
|
存储 监控 安全
Linux日志管理工具:Logrotate(一)
Linux日志管理工具:Logrotate(一)
1084 0
|
JavaScript 前端开发 安全
Typescript 严格模式有多严格?
Typescript 严格模式有多严格?
306 0
下一篇
oss云网关配置