返回值是完成记录?

时间:2018-04-05 05:35:49

标签: javascript ecmascript-6

在规范中,有很多记录,如return value。是否可以准确地说明类型1. Return "Infinity".的所有记录都返回完成记录。在规范中有一段听起来像这样:

  

6.2.3.2隐含完成值

     

本规范的算法通常隐式返回完成记录   [[类型]]是正常的。除非从上下文中显而易见,   返回不是Completion的值的算法语句   记录,例如:

     

1. Return NormalCompletion("Infinity").

     

与以下内容相同:

     

1. Assert: completionRecord is a Completion Record.

     

但是,如果值表达式   “返回”声明是完成记录的构造文字,   返回结果完成记录。如果是值表达式   是对抽象操作的调用,简单地说就是“返回”语句   返回抽象操作生成的完成记录。

     

抽象操作Completion(completionRecord)用于   强调先前计算的完成记录正在进行中   回。完成抽象操作只需一个参数,   completionRecord,并执行以下步骤:

     

2. Return completionRecord as the Completion Record of this abstract operation.

     

1. Return NormalCompletion(undefined).

     

算法步骤中没有值的“return”语句表示   同样的事情:

     

6. Return obj.

     

对完成的任何提及   记录在未明确要求的上下文中的值   完成记录值相当于显式   引用完成记录值的[[Value]]字段,除非   完成记录突然完成。

这里有一个问题!有时返回值必须是特定的数据类型。例如,http://www.ecma-international.org/ecma-262/#sec-objectcreate {{1}}那么我们是返回一个对象还是完成记录?

1 个答案:

答案 0 :(得分:2)

  

我们还要返回一个对象还是完成记录?

您引用的部分确实解释了这一点:

  

[...]一种算法语句,它返回一个非完成记录的值,例如:

     
      
  1. 返回“无限”。
  2.         

    与以下内容相同:

         
        
    1. 返回NormalCompletion(“Infinity”)。
    2.   

将其应用于

  
      
  1. 返回obj。
  2.   

obj这里是“新创建的对象”,这意味着它不是完​​成记录。这意味着,正如上面的陈述所说,它被视为

  
      
  1. 返回NormalCompletion(obj)。
  2.   

其次:

  

任何回报都是完成记录?看看ecma-international.org/ecma-262/#sec-ordinarytoprimitive 1.断言:Type(O)是Object。这是一个对象的声明。但如果O的收据是完成记录。怎么理解?如果我们在返回时获得完成记录,我们如何从中获取其他类型的数据?

您引用的文字通过以下方式回答:

  

对未完全要求完整完成记录值的上下文中的完成记录值的任何引用等同于对[[Value]]字段的显式引用

在此背景下,Type(O)被视为Type(O.[[Value]])