2017-08-23 17 views
7

Czy ktoś może mi wyjaśnić przykłady działania tego algorytmu?ECMA-262 7.0 GetValue (V)

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

Byłoby miło, gdyby ktoś z przykładów wyjaśnił, jak to działa. Próbowałem, ale nie zrozumiałem zbyt wiele.

Przykłady wyjaśnienie:

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

to wygląda jak pseudo kod, czy masz do wdrożenia to? Podaj, co zrobiłeś ... – Hitmands

+0

@ Hitmands Abyś mnie zrozumiał, chcę zrozumieć na prawdziwych przykładach, jak to działa. Na przykład, weźmiemy dodawanie '(" "+ Object.prototype)'. Dodatkowo, istnieje również algorytm i wywołuje GetValue (V) dla każdego operandu i chciałbym rozważyć wszystkie gałęzie możliwych przypadków w algorytmie (GetValue()). – MaximPro

+0

Co masz na myśli mówiąc "jak to działa"? To właśnie jest algorytm *, opis działania. Czego próbowałeś, ale nie mogłeś zrozumieć? – Bergi

Odpowiedz

1

Segment ten daje więcej kontekstu:

... typu odniesienia Specyfikacja #

UWAGA typ referencyjny służy do wyjaśnienia zachowań takie operatory: jako delete, typeof, operatory przypisania, super słowo kluczowe i inne funkcje językowe. Na przykład lewy operand przyporządkowania powinien dostarczyć referencję.

Odniesienie to rozstrzygnięta nazwa lub właściwość wiążąca. Numer referencyjny składa się z trzech komponentów, wartości bazowej, nazwy przywoływanej i znacznika wartości odniesienia o wartości zmiennej Boolean. Podstawową wartością jest niezdefiniowana, Obiekt, Boolean, Ciąg, Symbol, Numer lub rekord środowiska . Wartość podstawowa niezdefiniowana wskazuje, że odniesienie nie może zostać przekształcone w wiązanie. Nazwa, do której się odwołuje, to ciąg znaków lub wartość symbolu .

Super Reference to odniesienie, które jest używane do oznaczania wiązania o nazwie , które zostało wyrażone za pomocą super słowa kluczowego. Opcja Super Reference ma dodatkową składnik ThisValue, a jego wartość podstawowa nigdy nie będzie rekordem środowiska.

następujące streszczenie operacje są używane w niniejszym opisie do dostępu elementy odniesienia:

  • GetBase (v). Zwraca składową podstawową referencji V.
  • GetReferencedName (V). Zwraca referencyjny składnik nazwy zmiennej IsStrictReference (V). Zwraca ścisłą flagę odniesienia składnik odniesienia V.
  • HasPrimitiveBase (V). Zwraca wartość true, jeśli Typ (baza) to Boolean, String, Symbol lub Number.
  • IsPropertyReference (V). Zwraca wartość true, jeśli podstawową wartością jest obiekt lub HasPrimitiveBase (V); w przeciwnym razie zwraca false.
  • IsUnresolvableReference (V). Zwraca wartość true, jeśli podstawową wartością jest niezdefiniowana i false w przeciwnym razie.
  • IsSuperReference (V). Zwraca true, jeśli to odwołanie ma składnik thisValue. Poniższe abstrakcyjne operacje są używane w tej specyfikacji do działania na referencjach ...

To jest język wewnętrzny. Od razu rzuca się w oczy, że wiąże się z wnioskiem o typ, zanim zostaną wykonane dodatkowe działania na wartości. Tego rodzaju operacje wykonywane są na niższym poziomie, jeśli nazywać rzeczy jak

delete someObject.prop 

lub

typeof someVarIdentifier 

Przykład:

("" + a); 

Parse wyrażenie -> getValue ("") + getValue (a) -> string {""} + (liczba {10} -> rzutowanie na ciąg) -> concat ("", "10") -> "10"

+0

Przeczytałem o typie referencyjnym, ale również nie daje pełnego zrozumienia, kiedy przechodzimy przez GetValue Twój przykład wykonania łańcucha algorytmów (binarny +, ToString, ToPrimitive). Nie potrzebuję ich wyjaśnień, interesuje mnie tylko algorytm GetValue – MaximPro

+0

. Jestem zainteresowany różnymi sytuacjami występującymi w GetValue. Interesuje mnie, w jakich przypadkach można osiągnąć tę lub inną gałąź (Nie ma przykładów ich osiągnięcia w algorytmie, więc trudno jest zrozumieć, kiedy jest to możliwe). – MaximPro

+0

Jeśli możesz zwolnić, możesz użyć więcej światła wariant. Na przykład '(null, a)'.Gdzie w tym wyrażeniu zwraca się ostatnie wyrażenie po przecinku. Zwróci wyraźnie wartość GetValue (a). – MaximPro