Mutable և Immutable Array մեթոդներ JavaScript-ում
Mutable և Immutable Array մեթոդներ JavaScript-ում — ի՞նչ տարբերություն
JavaScript-ում զանգվածների (array) վրա գործող մեթոդները կարող են բաժանվել երկու խմբի՝
Այս տարբերությունը շատ կարևոր է հասկանալու համար, երբ գրում ես կոդ, որը պետք է լինի կանխատեսելի, բացատրելի, կամ օգտագործվում է վիճակների (state) կառավարման մեջ, օրինակ՝ React-ում։
Երբ դու փոխանցում ես զանգվածը ֆունկցիայի մեջ, այն փոխանցվում է հղմամբ (reference), ոչ թե պատճենով։ Այսինքն՝ եթե մեթոդը փոխում է զանգվածը, այն կարող է աննկատ փոխել արժեքներ ուրիշ տեղերում էլ։
const arr = [1, 2, 3];
const result = arr.reverse(); // MUTABLE
console.log(arr); // [3, 2, 1]
console.log(result); // [3, 2, 1]
| Մեթոդ | Նկարագրություն |
| map | Վերադարձնում է նոր զանգված՝ փոխված արժեքներով |
| filter | Ֆիլտրում է զանգվածը՝ վերադառձնալով նորը |
| slice | Կտրում է զանգվածը՝ վերադարձնելով նոր մաս |
| concat | Միավորում է զանգվածները՝ առանց օրիգինալը փոխելու |
| flat, flatMap | Հարթեցնում է զանգվածները, բայց չի փոխում օրիգինալը |
| toSorted, toReversed, toSpliced | Նոր ES2023 մեթոդներ՝ immutable տարբերակներ |
const arr = [1, 2, 3];
const doubled = arr.map(x => x * 2); // [2, 4, 6]
console.log(arr); // [1, 2, 3]
console.log(doubled); // [2, 4, 6]
| Մեթոդ | Նկարագրություն |
| push | Ավելացնում է տարր |
| pop | Հանում է վերջին տարրը |
| shift | Հանում է առաջին տարրը |
| unshift | Ավելացնում է սկզբում |
| splice | Կտրում/ավելացնում է տեղում |
| sort | Դասավորում է նույն զանգվածը inplace |
| reverse | Շրջում է inplace |
const arr = [1, 2, 3];
arr.push(4); // arr = [1, 2, 3, 4]
ES2023-ից (ES14) JavaScript-ը ներառում է նոր տարբերակներ՝ immutable ձևով գործողությունների համար։
| Նոր մեթոդ | Ի՞նչ է անում |
| toSorted() | Նման է sort()-ին, բայց immutable է |
| toReversed() | Նման է reverse()-ին, բայց immutable է |
| toSpliced() | Նման է splice()-ին, բայց immutable է |
const arr = [3, 1, 2];
const sorted = arr.toSorted(); // [1, 2, 3]
console.log(arr); // [3, 1, 2]
React-ում state-ը երբեք չպետք է ուղղակիորեն փոխվի։ Այդ պատճառով օգտագործվում են immutable մեթոդներ։ Օրինակ՝
// Վատ:
state.numbers.push(4);
// Լավ:
setState(prev => ({
numbers: [...prev.numbers, 4]
}));