【问题标题】:Where can I find the source code for the Javascript `typeof` operator?在哪里可以找到 Javascript `typeof` 运算符的源代码?
【发布时间】:2021-01-05 02:36:59
【问题描述】:

我希望了解 JavaScript 中的 typeof 运算符如何知道对象是函数。

确切地说,我想知道如何获取函数“body”并对其进行逆向工程以确定它期望的参数。 arguments 属性似乎很接近,但仅在评估函数中可用。

uneval()toSource() 似乎都没有做我想做的事,除了已经过时了。

【问题讨论】:

  • 与你相比,我可能只知道一小部分,但我会开始在 GitHub 上查看 v8 源代码,我发现这个文件似乎与 typeof 运算符有关:chromium.googlesource.com/v8/v8/+/…
  • tc39.es/ecma262/#sec-typeof-operator 对象(实现 [[Call]])“函数”
  • 您可以使用myFunction.toString() 并解析结果。在大多数情况下,您可能可以获得参数的名称,但我看不出这与 typeof 有什么关系。
  • @CristopherRosales 我在搜索时忽略了,会看看
  • @connexo 我在 MDN 上看到了类似的东西。我不明白(implements [[Call]]) 是什么意思。

标签: javascript typeof


【解决方案1】:

specification 表明:

没有实现[[Call]]的对象是objects

实现[[Call]] 的对象是functions

[[Call]] 是对象的“内部属性” - 它不直接暴露给可交互的运行 JavaScript)

所以任何可以是()d 的都是function。这甚至包括代理,因为代理可以像函数一样被调用。

关于另一个问题:

我想知道如何获取函数“body”并对其进行逆向工程以确定它期望的参数

最简单的方法是将函数转为字符串,并使用正则表达式解析参数列表:

function sum(a, b) {
  return a + b;
}

const argList = String(sum).match(/\((.*)\)/)[1];
console.log(argList.split(/,\s*/)); // depending on how complicated the list is
    // you may need to make the above pattern more elaborate

【讨论】:

  • 如何以编程方式检查对象是否可以()ed?
  • 我只使用typeof。如果您不想使用它,对于绝大多数情况,您还可以检查该对象是否继承自 Object.prototype
  • 没有完全回答我关于typeof 工作原理的问题:-/
  • 它通过检查对象是否具有内部[[Call]] 方法来工作。就是这样,真的,没有别的了。对于边缘情况,如果不实际尝试调用对象以查看发生了什么,可能无法签入 JS,因为代理处理程序不可用stackoverflow.com/questions/38385561/…
  • 他也可以使用instanceof Function
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2011-08-31
  • 1970-01-01
相关资源
最近更新 更多