Number函数如何与operator new交互

时间:2018-03-28 01:20:09

标签: javascript ecmascript-6

在这种情况下,找到了内置函数Number。我想考虑一下,因为我在下面提出的问题可以在规范中的其他函数中找到。

如果我们打开规范,我们会看到以下内容:

  

20.1.1.1数字(值)

     

使用参数值调用Number时,以下步骤为   采取:

     
      
  1. 如果没有参数传递给这个函数调用,那么就是   0
  2.   
  3. 否则,让我们呢? ToNumber(值)。
  4.   
  5. 如果未定义NewTarget,请返回n。
  6.   
  7. 让O成为? OrdinaryCreateFromConstructor(NEWTARGET,   “%NumberPrototype%”,«[[NumberData]]»)。
  8.   
  9. 将O。[[NumberData]]设置为n。
  10.   
  11. 返回O。
  12.   

基于此,我想问几个问题:

  1. NewTarget它来自哪里?
  2. 如果此算法既用于构造函数又用于简单转换为数字,那么如果NewTarget = undefined转换为数字NewTarget != undefined,则将此函数称为构造函数。
  3. 让我们进一步阐明所有要点。

      

    12.3.3.1运行时语义:评估

         

    NewExpression:new NewExpression

         
        
    1. 回来? EvaluateNew(NewExpression,空)。
    2.         

      MemberExpression:new MemberExpressionArguments

           
          
      1. 回来? EvaluateNew(MemberExpression,Arguments)。
      2.         

        12.3.3.1.1运行时语义:EvaluateNew(constructExpr,arguments)

             

        带有参数constructExpr和的抽象操作EvaluateNew   arguments执行以下步骤:

             
            
        1. 断言:constructExpr是NewExpression或者是   MemberExpression。
        2.   
        3. 断言:参数为空或参数。
        4.   
        5. 让ref成为评估constructExpr。
        6. 的结果   
        7. 让构造函数成为?的GetValue(REF)。
        8.   
        9. 如果参数为空,则让argList为新的空列表。
        10.   
        11. 否则,
            一个。设argList为参数的ArgumentListEvaluation。

               

          湾ReturnIfAbrupt(arglist中)。

        12.   
        13. 如果IsConstructor(构造函数)为false,则抛出TypeError异常。
        14.   
        15. 回来?构造(构造函数,argList)。
        16.   

    当您通过new运算符调用某个函数时(我们将很容易地在没有参数的情况下执行),我们会看到Return 'line. EvaluateNew (NewExpression, empty)在这一行中,NewExpressionNumber功能,对吧?如果一切正确则更进一步。接下来,我们在EvaluateNew算法中看到有一行如下所示:Let's get the result of evaluating constructExpr. - 这是什么意思?这意味着我们需要在继续执行算法之前计算ref是什么?如果我没有弄错,那么ref就是Number函数。所以我们被要求从Number函数执行算法的行?如果是这种情况,那么我们在Number算法中遇到问题,因为我们不知道NewTarget有什么价值。

    您理解的问题在于我不理解Numberoperator new的互动。我请你帮忙解决一下。

    P.S对于选民失望:解释你不喜欢的东西,以便我可以更好地改变问题,谢谢

1 个答案:

答案 0 :(得分:2)

  

NewTarget - 它来自哪里?

来自[[call]]ing a builtin function object或来自[[construct]]ing a builtin function object

  

如果此算法同时用于构造函数和简单转换为数字,那么如果NewTarget = undefined转换为数字NewTarget != undefined,则将此函数称为构造函数。

这不是一个问题,这是一个(真实的)陈述。

  

在这一行中,NewExpressionNumber函数,对吗?

没有。 NewExpression constructExpr表达式,即new运算符具有的任何操作数的抽象语法树。这可以是任何表达式,例如具有IdentifierReference的PrimaryExpression,其评估为全局Number函数(或对其的引用) - 在评估它时,这正是第3步所做的