ECMA-262 7.0 GetValue(V)

7
有人能用例子来解释一下这个算法是如何工作的吗?
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...

这看起来像是伪代码,你需要实现它吗?请提供你所做的内容... - Hitmands
@Hitmands 为了让你理解我的意思,我想通过实际例子来了解它的工作原理。例如,我们将采取加法 ("" + Object.prototype)。对于加法,也有一个算法,并且它调用每个操作数的 GetValue(V),我想考虑算法 (GetValue()) 中所有可能情况的分支。 - MaximPro
@Bergi "这是如何工作的" - 我的意思是每个分支何时被触及。也就是说,有一段代码(null, a)。上述算法将如何工作?在各个点上,为什么会使用这个或那个分支。最好写出此算法的所有可能代码选项。这样更容易理解它在示例中发生了什么。 - MaximPro
@Bergi 我在每个案例中都遇到了问题。我无法显示失败的情况。 据我所知,逗号运算符从GetValue(a)返回一个纯结果。 - MaximPro
如果你只想知道具有使其采取另一分支的属性的引用可以出现的地方,那么你应该查看规范,在构造Reference时的每个场合。我认为你的问题太过宽泛。 - Bergi
显示剩余7条评论
1个回答

1
这一段提供了更多的上下文信息:

...参考规范类型#

注意,引用类型用于解释delete、typeof、赋值运算符、super关键字和其他语言特性的行为。例如,赋值的左操作数应该产生一个引用。

引用是已解析的名称或属性绑定。引用由三个组件组成:基本值、引用名称和布尔值严格引用标志。基本值可以是undefined、对象、布尔值、字符串、符号、数字或环境记录。基本值为undefined表示无法将引用解析为绑定。引用名称是一个字符串或符号值。

超级引用是一种使用super关键字表示的名称绑定引用。超级引用具有额外的thisValue组件,其基本值永远不会是环境记录。

以下抽象操作在此规范中用于访问引用的组件:

  • GetBase(V)。返回引用V的基本值组件。
  • GetReferencedName(V)。返回引用V的引用名称组件。
  • IsStrictReference(V)。返回引用V的严格引用标志组件。
  • HasPrimitiveBase(V)。如果Type(base)是Boolean、String、Symbol或Number,则返回true。
  • IsPropertyReference(V)。如果基本值是对象或HasPrimitiveBase(V)为true,则返回true;否则返回false。
  • IsUnresolvableReference(V)。如果基本值为undefined,则返回true;否则返回false。
  • IsSuperReference(V)。如果此引用具有thisValue组件,则返回true。以下抽象操作在此规范中用于操作引用...
这是语言内部的内容。从快速浏览来看,它似乎与在对值执行其他操作之前进行类型推断有关。当您调用类似于的操作时,这种操作会在较低级别上执行。
delete someObject.prop

或者

typeof someVarIdentifier

例子:

("" + a);

解析表达式 -> getValue("") + getValue(a) -> string{""} + (number{10} -> 转换为字符串) -> concat("","10") -> "10"

我已经了解了引用类型,但这并不能完全理解我们何时使用GetValue。你提到了一系列算法的执行示例(二进制+、ToString、ToPrimitive),但我只对GetValue算法感兴趣,不需要它们的解释。 - MaximPro
我对GetValue中发生的各种情况感兴趣。我想知道在什么情况下可以实现这个或那个分支(算法中没有它们实现的示例,因此很难理解何时可以实现)。 - MaximPro
如果您可以发布,您可以使用更轻的变体。例如(null, a)。在这个表达式中,逗号后返回最后一个表达式。它将清楚地返回GetValue(a)。 - MaximPro
抱歉,伙计,我无法在这个话题上再为你提供帮助。可能只有TC39的人才能给出好的解释。 - Martin Chaov
这是ECMAScript的开发者吗? - MaximPro
有一点延迟 - 是的 :) - Martin Chaov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接