ECMA-262 7.0 GetValue(V)

Max*_*Pro 7 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).
Run Code Online (Sandbox Code Playgroud)

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...
Run Code Online (Sandbox Code Playgroud)

Mar*_*aov 1

本节提供了更多背景信息:

...参考规范类型#

注意 引用类型用于解释删除、typeof、赋值运算符、super 关键字和其他语言功能等运算符的行为。例如,赋值的左侧操作数预计会产生引用。

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

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

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

  • 获取基址(V)。返回参考 V 的基值分量。
  • 获取参考名称(V)。返回引用 V 的引用名称组件。
  • IsStrictReference(V)。返回引用 V 的严格引用标志组件。
  • 有原始基数(V)。如果 Type(base) 为布尔值、字符串、符号或数字,则返回 true。
  • IsPropertyReference(V)。如果基值是对象或 HasPrimitiveBase(V) 为 true,则返回 true;否则返回 false。
  • IsUnresolvableReference(V)。如果基值未定义,则返回 true,否则返回 false。
  • 是超级参考(V)。如果此引用具有 thisValue 组件,则返回 true。本规范中使用以下抽象操作来对引用进行操作...

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

delete someObject.prop
Run Code Online (Sandbox Code Playgroud)

或者

typeof someVarIdentifier
Run Code Online (Sandbox Code Playgroud)

例子:

("" + a);
Run Code Online (Sandbox Code Playgroud)

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