【问题标题】:ECMA-262 7.0 GetValue(V)ECMA-262 7.0 获取值(V)
【发布时间】:2017-08-23 08:39:58
【问题描述】:

谁能举例说明这个算法是如何工作的?

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 为了让你理解我,我想通过一个真实的例子来了解它是如何工作的。例如,我们将添加("" + Object.prototype)。此外,还有一个算法,它为每个操作数调用 GetValue(V),我想考虑算法中所有可能情况的分支 (GetValue())。
  • 你是什么意思,“这是如何工作的”?这就是算法的内容,是对某事物如何工作的描述。您尝试了什么但无法理解?
  • @Bergi,methinks,作者想要示例,如何将此算法应用于具体代码,例如块中的代码解释示例。例如,如果只写变量名或变量属性等,将选择哪些分支。
  • @Grundy 他应该表现出一些努力,然后发布他认为算法如何在这些示例上执行的内容。或者更具体地询问他尝试和失败的过程的某些部分。

标签: javascript ecmascript-6


【解决方案1】:

这个片段提供了更多的上下文:

...参考规范类型#

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

引用是解析的名称或属性绑定。参考资料 由三个部分组成,基值、引用的名称和 布尔值严格引用标志。基值是 未定义、对象、布尔值、字符串、符号、数字或 环境记录。未定义的基值表示 无法将引用解析为绑定。引用的名称是 字符串或符号值。

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

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

  • GetBase(V)。返回引用 V 的基值组件。
  • GetReferencedName(V)。返回引用的名称组件 参考五。
  • IsStrictReference (V)。返回严格引用标志 参考 V 的组成部分。
  • HasPrimitiveBase(V)。如果 Type(base) 是 Boolean、String、Symbol 或 Number,则返回 true。
  • IsPropertyReference (V)。如果任一基值是 对象或 HasPrimitiveBase(V) 为真;否则返回 false。
  • IsUnresolvableReference (V)。如果基值是,则返回 true 未定义,否则为假。
  • IsSuperReference(V)。如果返回真 这个引用有一个 thisValue 组件。以下摘要 操作在本规范中用于对引用进行操作...

这是语言内部。乍一看,它似乎与对值执行其他操作之前的类型推断有关。当您调用诸如

之类的东西时,这种操作在较低级别上执行
delete someObject.prop

typeof someVarIdentifier

例子:

("" + a);

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

【讨论】:

  • 我已经阅读了有关引用类型的信息,但它也没有完全理解我们何时通过 GetValue 执行一系列算法(二进制 +、ToString、ToPrimitive)的示例。我不需要他们的解释,我只对GetValue算法感兴趣
  • 我对GetValue 中发生的各种情况很感兴趣。我感兴趣的是什么情况下可以实现这个或那个分支(算法中没有他们实现的例子,所以很难理解什么时候可以实现)
  • 如果可以释放,可以使用更轻的变体。例如(null, a)。在此表达式中的位置返回逗号后的最后一个表达式。它将清楚地返回 GetValue(a)。
  • 对不起,伙计,我无法为您提供更多帮助。大概只有 TC39 的人才能给出好的解释。
  • ECMAScript 的开发者?
猜你喜欢
  • 2013-12-30
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多