在 ECMAScript 2018 (也称为 ES9)中,新增了一些有关函数的语法特性。其中之一是 Function.prototype.toString()
方法的更新。 在这篇文章中,我们将深入了解这些变化,并了解它们如何影响您的代码。
背景
在 JavaScript 中,函数是一级公民。 这意味着它们可以作为变量传递,也可以作为对象的属性和数组的元素使用。 function.toString()
方法可将函数转换为字符串表示形式,通常用于调试代码或动态生成代码字符串。
在 ES5 中,Function.prototype.toString()
方法的行为被标准化。 当调用函数的 toString()
方法时,返回表示函数签名和函数体的字符串。 例如,以下是一个简单的函数:
-------- -------------- - ------------------- ----------- -
调用 greeting.toString()
会返回以下字符串:
--------- -------------- - ------------------- ----------- --
在这个字符串中,我们可以获得函数的名称、参数和主体。 这对调试非常有用。
在 ES6 中, template literals 的出现给 Function.prototype.toString()
带来了些许变化。 假设以下函数:
-------- ------ -- - ------ ---- --- -- ---- --- ---- -- --- - ---- -
在 ES5 中,调用 sum.toString()
方法返回以下字符串:
--------- ------ -- - ------ ---- --- -- ---- --- ---- -- --- - ---- --
但正如您所看到的,函数主体才包含文本,而不是它们的值。注意,template literals 在ES6中添加,Function.prototype.toString()
仍然返回字符串模板以及模板中的表达式本身。如果您需要获得函数主体的字符串,只需在返回字符串中解析模板本身。
ES9 中的更改
在 ES9 中,Function.prototype.toString()
的行为有一些变化。 在调用函数的 toString()
方法时,返回表示函数签名和函数体的字符串,但是这些字符串经过了一些改进,以便更加准确地表示函数。
例如,假设以下函数:
-------- ----------- - ------ ----- ------- - -------------- --------- - ------ - ----------- - ------------------- -- ---- -- ---------------- - - -
在 ES9 中, classRoom.toString()
方法将返回以下字符串:
------ ------- - -------------- --------- - ------ - ----------- - ------------------- -- ---- -- ---------------- - --
如您所见,返回的字符串只包含与 Student
类相关的主体。 通过这样的方式,我们可以更轻松地查看和阅读函数。
另外,如果将函数声明在另一个函数中,则 Function.prototype.toString()
将返回表示内部函数的字符串,而不是整个外部包含它的函数。例如,对于以下代码:
-------- --------------- - -------- --------------- - -------------- -- -- ----- ------------ - ------ -------------- -
调用 outerFunction().toString()
将返回以下字符串:
--------- --------------- - -------------- -- -- ----- ------------ --
这是一种非常有用的变化,您可以更容易地查看和调试嵌套函数。
总结
在 ES9 中,Function.prototype.toString()
方法有了一些改进,以更好地描述函数。这包括返回内部函数的字符串和准确表示包含 class 的函数。这些变化可以使调试和查看代码变得更加容易,因此您应该在编写和调试您的代码时利用它们。
在编写代码时,您可能会发现 Function.prototype.toString()
方法对于捕获和预测程序行为非常有用。 您还可以使用返回的字符串来自动生成代码字符串,并在不依赖于源代码中的文本时创建可读模板/string。
示例代码
-------- ----------- - ------ ----- ------- - -------------- --------- - ------ - ----------- - ------------------- -- ---- -- ---------------- - - - ------------------------------------ -- ------ ------- --- ---------------- --------- - -------- --- ----------- --- ------------------- -- ---- -- ------------------ ----- -------- --------------- - -------- --------------- - -------------- -- -- ----- ------------ - ------ -------------- - ---------------------------------------- -- --------- --------------- --- -------------- -- -- ----- ----------------
参考文献:
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64abd4d048841e98947b0f25