判断函数是否标记为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月前
阿里云RPA元素出现后,有个返回结果 ,需要拿这个结果再去做判断吗?这个判断的操作 如何 处理
【2月更文挑战第8天】阿里云RPA元素出现后,有个返回结果 ,需要拿这个结果再去做判断吗?这个判断的操作 如何 处理
76 3
|
1天前
|
JavaScript 前端开发 Java
v-if和v-show的区别?使用场景?v-if状态改变调用钩子函数的示例
这篇文章详细阐述了Vue中`v-if`和`v-show`指令的共同点、区别、使用场景以及它们在组件和普通元素上附属时的不同表现,并通过示例展示了状态改变时对钩子函数调用的影响。
v-if和v-show的区别?使用场景?v-if状态改变调用钩子函数的示例
|
1月前
|
前端开发 JavaScript
Promise 等待多个接口返回数据再执行操作
Promise 等待多个接口返回数据再执行操作
24 0
|
9月前
|
JSON 小程序 JavaScript
小程序根据返回值的int类型渲染不同的状态
小程序根据返回值的int类型渲染不同的状态
91 0
|
3月前
|
小程序 区块链
血常规常见判断参数
血常规常见判断参数
29 0
|
JavaScript
清除JS定时器setInterval方法防止if条件语句判断无效的解决方案
清除JS定时器setInterval方法防止if条件语句判断无效的解决方案
135 0
|
JavaScript
js:判断对象是否包含元素,是否为空对象
js:判断对象是否包含元素,是否为空对象
135 0
|
前端开发
promise的简单用法、使用、例子、另外处理方法
promise的简单用法、使用、例子、另外处理方法
96 0
lodash判断值是否是Function对象
lodash判断值是否是Function对象
108 0
lodash判断值是否是Error/EvalError等对象
lodash判断值是否是Error/EvalError等对象
59 0