ES9 function.toString() 变化

阅读时长 6 分钟读完

在 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

纠错
反馈