ECMA-262 7.0 GetValue(V)

时间:2017-08-23 08:39:58

标签: javascript ecmascript-6

任何人都可以通过示例向我解释这个算法是如何工作的吗?

GetValue (V)#

1. ReturnIfAbrupt(V).
2. If Type(V) is not Reference, return V. 
3. Let base be GetBase(V). 
4. If IsUnresolvableReference(V) is true, throw a ReferenceError exception. 
5. If IsPropertyReference(V) is true, then  
    a. If HasPrimitiveBase(V) is true, then  
        i. Assert: In this case, base will never be null or undefined.  
        ii. Let base be ToObject(base).  
    b. Return ? base.[[Get]](GetReferencedName(V), GetThisValue(V)). 
6. Else base must be an Environment Record,  
    a. Return ? base.GetBindingValue(GetReferencedName(V), IsStrictReference(V)) (see 8.1.1).

http://www.ecma-international.org/ecma-262/7.0/#sec-getvalue

如果有人举例解释它是如何运作的话会很好。我试过了,但我不太懂。

解释示例:

let a = 10, b = {name: "Unknown"};
(null, a);
(null, a.name);
(null, b);
(null, b.name);
(null, b.surname);
(null, 10);
/// etc...

1 个答案:

答案 0 :(得分:1)

此细分提供更多背景信息:

  

...参考规范类型#

     

注意参考类型用于解释此类行为   运算符为delete,typeof,赋值运算符,super   关键字和其他语言功能。例如,左手   作业的操作数有望产生参考。

     

参考是已解析的名称或属性绑定。参考   由三个组成部分组成,基值,引用名称和   布尔值严格的引用标志。基值是   undefined,Object,Boolean,String,Symbol,Number或an   环境记录。未定义的基值表示   参考无法解析为绑定。引用的名称是a   字符串或符号值。

     

超级参考是用于表示名称的参考   使用super关键字表示的绑定。超级参考   有一个额外的thisValue组件,它的基值永远不会   环境记录。

     

本规范中使用了以下抽象操作   访问引用的组件:

     
      
  • GetBase(V)。返回引用V的基值组件。
  •   
  • GetReferencedName(V)。返回引用的名称组件   参考V.
  •   
  • IsStrictReference(V)。返回严格的引用标志   参考文献V的组成部分。
  •   
  • HasPrimitiveBase(V)。如果Type(base)是Boolean,String,Symbol或Number。返回true。
  •   
  • IsPropertyReference(V)。如果基值为a,则返回true   object或HasPrimitiveBase(V)为true;否则返回false。
  •   
  • IsUnresolvableReference(V)。如果基值为,则返回true   未定义,否则为false。
  •   
  • IsSuperReference(V)。如果,则返回true   此引用具有thisValue组件。以下摘要   本规范中使用的操作用于参考...
  •   

这是语言内部。从快速浏览一下,在对值执行附加操作之前,它看起来与类型推断有关。当您调用

之类的内容时,此类操作将在较低级别执行
delete someObject.prop

typeof someVarIdentifier

示例:

("" + a);

解析表达式 - > getValue("")+ getValue(a) - > string {""} +(number {10} - > cast to string) - > concat(""," 10") - > " 10"