2016-01-01 23 views
17

Rozważmy następujący przykładowy kodRozprzestrzenianie Składnia ES6

var x = ["a", "b", "c"]; 
var z = ["p", "q"]; 

var d = [...x, ...z]; 

var e = x.concat(z); 

Tutaj, wartość d i e są dokładnie takie same i jest równa ["a", "b", "c", "p", "q"], więc

  1. co dokładnie jest różnica między tymi dwa?
  2. Który z nich jest bardziej wydajny i dlaczego?
  3. Czym dokładnie jest użycie składni rozszerzonej?

Nie sądzisz, że wprowadzenie tych małych skrótów w formalnym, szerokim języku może pozostawić pewne niedostrzegalne błędy, co oznacza, że ​​jest całkiem niepotrzebny lub nie zdaję sobie sprawy, że jest to konieczne.

+0

Podczas gdy odpowiedzi na to: "Nie sądzisz, że wprowadzenie tych małych skrótów w formalnym, szerokim języku może pozostawić pewne niedostrzegane błędy" będzie oparte na opiniach, moim zdaniem, tak, większość ES6 jest będzie generować mnóstwo błędnego kodu, ponieważ niechlujni i/lub młodsi programiści nie zrozumieją dokładnie, co robią. – rockerest

+0

Czas na szybką próbę! – towerofnix

+0

@rockerest dokładnie to, co myślałem. – void

Odpowiedz

11
  1. W przykładzie podanym, jest zasadniczo nie ma różnicy między obu
  2. .concat jest significantly more efficient: http://jsperf.com/spread-into-array-vs-concat ponieważ ... (spread), cukier jedynie składnię górze bardziej podstawowym składni bazowego jawnie iteruje indeksów rozszerzenia tablicę .
  3. Rozprzestrzenianie pozwala słodzone składni na wierzchu bardziej przylegający bezpośredniej manipulacji tablicy

rozszerzyć na # 3 powyżej, korzystanie z rozprzestrzenianiem jest nieco wymyślony przykład (aczkolwiek najprawdopodobniej występują w środowisku naturalnym często). Rozprzestrzenianie jest użyteczne, gdy - na przykład - cała lista argumentów powinna zostać przekazana do .call w treści funkcji.

function myFunc(){ 
    otherFunc.call(myObj, ...args); 
} 

kontra

function myFunc(){ 
    otherFunc.call(myObj, args[0], args[1], args[2], args[3], args[4]); 
} 

Jest to kolejny przykład arbitralny, ale to trochę jaśniejsze dlaczego operator spread będzie miły w użyciu w niektórych sytuacjach inaczej gadatliwym i przylegający.

Jak @loganfsmythpoints out:

Rozprzestrzenianie działa również na arbitralnych iterowalny obiektów co oznacza, że ​​działa nie tylko na Array s, ale także Map i Set między innymi.

Jest to świetny argument i dodaje do koncepcji, że - choć nie jest to niemożliwe do osiągnięcia w ES5 - funkcjonalność wprowadzona w operatorze rozprzestrzeniania jest jednym z bardziej użytecznych elementów w nowej składni.


Dla rzeczywistej bazowego składni operatora rozciąga się w tym konkretnym kontekście (od ... może być również „spoczynku” parametru), patrz the specification. "bardziej fundamentalna składnia, która jawnie iteruje indeksy w celu rozszerzenia tablicy", jak napisałem powyżej, wystarczy, aby uzyskać punkt przecięcia, ale faktyczna definicja używa GetValue i GetIterator dla zmiennej następującej po.

+0

Prawdziwa próbka do użycia: '$ .when', która nie zezwala na tablicę obietnic jako parametr, więc' $ .when (... args) 'jest fajne :) – Grundy

+2

Spread działa również na dowolne obiekty iterowalne, co oznacza, że ​​nie tylko działa na 'Array's, ale także' Map' i 'Set' między innymi. – loganfsmyth