JavaScript i trzykropek (...) -> "rozproszenie"/"reszta"
Opublikowano czw 21 maja 2020 w javascript • 2 min read
Zastosowanie trzech kropek wprowadzonych w ES6 - pozwala na rozwinięcie wyrażenia iterowalnego (wielokorotnie powtarzalnego/przejściowego) jako spread
operator lub parametr rest
.
Trzykropek można stosować w kontekście obiektów, tablic, stringów, zbiorów (setów) i map.
Spread Operator -> Rozproszenie
Dzieli kolekcję tworząc tablicę
Pozwala na rozciągnięcie (rozproszenie/rozwinięcie) obiektu mogącego ulec iteracji wewnątrz odbiorcy (np. zamiast tworzenia zagnieżdżonej tablicy1 w tablicy2 - tablice2 przyjmuje właściwości tablicy1)
const arr1 = ['r4', 'c3po']
const arr2 = [arr1, 'r2dr']
console.log(arr2) >> [['r4', 'c3po'], 'r2dr']
vs
const arr3 = [...arr1, 'r2d2']
console.log(arr3) >> ['r4', 'c3po', 'r2dr']
Przykładowo pozwala na stworzenie tablicy z elementów zbliżonych (argument) do tablicy lub ze stringa [argument jak i odbiorca mogą być obiektem tablicą, łańcuchem znaków (stringiem), zbiorem lub map]
let arr = [...HTML-collection]
Przykładowe zastosowanie
function sum(...theArgs) {
return theArgs.reduce((previous, current) => {
return previous + current;
});
}
console.log(sum(1, 2, 3));
>> 6
Przy wywoływaniu funkcji i podawaniu jako argumentu tablicy pozwala na jej rozłożenie na pojedyncze argumenty (wyjmuje je z tablicy)
Przykładowe zastosowanie
function sum(x, y, z) {
return x + y + z;
}
const numbers = [1, 2, 3]; // tablica
console.log(sum(...numbers)); // rozłożenie tablicy na pojedyncze argumentu
>> 6
Shallow copy - tworzenie kopii tym samym tworząc osobne referencje
const arr1 = ['r4', 'c3po']
const arr2 = [...arr1]
>> arr1 === arr2
>> false
W kontrze do
const arr1 = ['r4', 'c3po']
const arr2 = arr1
>> arr1 === arr2
>> true
Jest to również przydatne w przypadku pracy z obiektami
const droid = {
isActive: false,
inputValue: "Droid name"
};
const droidCopy = {...state};
>> droidCopy
>> {isActive: false, inputValue: "Droid name"}
const droidCopy2 = {
...state, // najpierw spread
isActive: true // potem podmiana
};
>> droidCopy2
>> {isActive: true, inputValue: "Droid name"}
Rest parameters / Reszta
Sumuje poszczególne parametry (w) tworząc tablicę
Pozwala na wskazanie możliwości zastosowania nieokreślonej liczby argumentów, w funkcji, które zostaną zamienione w tablicę. Pozwala również na podanie poprzedzających parametrów nazwanych (te wówczas nie znają się w tablicy).
function myFunc(a, b, ...args) {
console.log(a); // 22
console.log(b); // 98
console.log(args); // [43, 3, 26]
};
myFunc(22, 98, 43, 3, 26);
-------------------
function myFunc(...args) {
args.forEach( a => console.log(a))
return args
}
console.log(myFunc(1, 2, 3))
>> 1
>> 2
>> 3
>> [1,2,3]
----
function myFunc(...[x, y, z]) {
return x + y + z;
}
myFunc(1) // NaN - brak agrumentów
myFunc(1, 2, 3) // 6
myFunc(1, 2, 3, 4) // 6 - tylko pierwsze trzy są brane pod uwagę
Źródła:
https://dev.to/sagar/three-dots---in-javascript-26ci
https://dev.to/blacksonic/the-tale-of-three-dots-in-javascript-4287
https://stackoverflow.com/questions/42184674/what-is-the-meaning-of-args-three-dots-in-a-function-definition
https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Operatory/Sk%C5%82adnia_rozwini%C4%99cia