Khi bạn chuyển một mảng vào một hàm trong JavaScript, nó sẽ được chuyển dưới dạng tham chiếu. Bất cứ điều gì bạn làm thay đổi mảng bên trong hàm cũng sẽ thay đổi mảng ban đầu. ví dụ: mã này sẽ ghi [1, 2, 3] vào bảng điều khiển
var array = [1, 2, 3, 4];const mutate = arr => {
arr.pop[];
return arr;
}mutate[array];console.log[array]; // result [1, 2, 3]
sao chép mảng đã truyền vào một mảng mới và thực hiện tất cả quá trình xử lý của bạn trên mảng mới không giúp được gì
var array = [1, 2, 3, 4];const mutate = arr => {
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
Điều này xảy ra vì var newArr = arr; . Tất cả điều này làm là trỏ một biến mới vào cùng một mảng
Bạn có thể sử dụng Mảng. từ
var newArr = Array.from[arr];
hoặc lát[]
var newArr = arr.slice[];
để sao chép mảng được truyền vào hàm thành một mảng mới. Hơn bạn có thể thay đổi mảng mới mà không làm thay đổi mảng ban đầu
… Cách khác …Tôi đã xem định nghĩa của các tham số còn lại và các toán tử trải rộng sáng nay và tôi nhận ra rằng có một cách khác để truyền một mảng dưới dạng một giá trị thay vì một tham chiếu
Tham số còn lại cho phép chúng ta biểu diễn số lượng đối số không xác định dưới dạng một mảng. Khi bạn định nghĩa một hàm bằng tham số còn lại, các đối số của hàm, bất kể chúng là bao nhiêu, sẽ được chuyển thành một mảng
toán tử trải rộng cho phép một iterable, giống như một mảng, được mở rộng tại chỗ. Nếu bạn sử dụng toán tử trải rộng để chuyển một mảng vào lệnh gọi hàm, hàm sẽ nhận các giá trị riêng lẻ của mảng làm đối số
Nếu chúng ta kết hợp hai khái niệm này, bằng cách xác định hàm của chúng ta với tham số còn lại và gọi hàm bằng toán tử trải rộng, chúng ta có thể thực hiện các thao tác trên mảng với hàm mà không làm thay đổi mảng ban đầu
var array = [1, 2, 3, 4];// use rest parameter in function definitionBỏ qua các đối số khác
// to turn passed values into array
const noMutate = […arr] => {
arr.pop[];
return arr;
}// use spread operator in function call to
// turn array elements into function arguments
noMutate[…array];console.log[array]; // result [1, 2, 3, 4]
Bạn có thể chuyển các đối số khác với tham số còn lại miễn là chúng xuất hiện trước tham số còn lại. Ví dụ: bạn có thể triển khai phiên bản hàm lọc của riêng mình để nhân mọi phần tử của một mảng với một số khác như thế này
var arr = [1, 2, 3, 4];const noMutate = [num, …arr] => {
var multiple = []
for[elem of arr] multiple.push[elem * num];
return multiple;
}var double = noMutate[2, …arr];console.log[double]; // returns [2, 4, 6, 8]
console.log[arr]; // not mutated: [1, 2, 3, 4]
Bạn thậm chí có thể sử dụng toán tử trải rộng để chuyển vào các thuộc tính của một đối tượng JavaScript như thế này
var obj = {
arr: [1, 2, 3, 4]
};const noMutate = [num, …arr] => {
console.log[arr];
var multiple = []
for[elem of arr] multiple.push[elem * num];
return multiple;
}var double = noMutate[2, …obj.arr];console.log[double]; // returns [2, 4, 6, 8]
console.log[arr]; // not mutated: [1, 2, 3, 4]
Hiệu suất khôn ngoan, tôi không chắc điều này so với việc sử dụng Array như thế nào. từ [] hoặc. slice[], nhưng nó loại bỏ một dòng mã và tôi nghĩ nó làm cho mã của bạn trông gọn gàng hơn. Nếu có ai biết điều này ảnh hưởng đến hiệu suất như thế nào, vui lòng cho tôi biết
Phương pháp 1. Sử dụng phương thức apply[]. Phương thức apply[] được sử dụng để gọi một hàm với các đối số đã cho là một mảng hoặc đối tượng giống như mảng. Nó chứa hai tham số. Giá trị này cung cấp lời gọi hàm và mảng đối số chứa mảng đối số được truyền
Phương thức apply[] được sử dụng trên hàm phải được truyền dưới dạng mảng đối số. Tham số đầu tiên được chỉ định là 'null' và tham số thứ hai được chỉ định với mảng đối số. Điều này sẽ gọi hàm với mảng đối số được chỉ định
cú pháp
arrayToPass = [1,
"Two"
, 3];
var array = [1, 2, 3, 4];const mutate = arr => {0
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {1
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {2
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {3
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
Thí dụ
var array = [1, 2, 3, 4];const mutate = arr => {4
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {5
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {6
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0var array = [1, 2, 3, 4];const mutate = arr => {0
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {5
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
3"Two"
0"Two"
5
var array = [1, 2, 3, 4];const mutate = arr => {5____87
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0"Two"
9, 3];
0
"Two"
9, 3];
2
"Two"
5, 3];
4"Two"
7"Two"
0
, 3];
4"Two"
3"Two"
0
var array = [1, 2, 3, 4];const mutate = arr => {0
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {5
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {02____80
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
5
var array = [1, 2, 3, 4];const mutate = arr => {5
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {06
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {07
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {08
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {09
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0"Two"
9
var array = [1, 2, 3, 4];const mutate = arr => {12
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
________ 85 ________ 94 ________ 106 ________ 80
var array = [1, 2, 3, 4];const mutate = arr => {17
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
5
var array = [1, 2, 3, 4];const mutate = arr => {5____120
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0"Two"
9
var array = [1, 2, 3, 4];const mutate = arr => {23
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
9
var array = [1, 2, 3, 4];const mutate = arr => {25
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
5, 3];
4
var array = [1, 2, 3, 4];const mutate = arr => {20
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0var array = [1, 2, 3, 4];const mutate = arr => {17
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
5
var array = [1, 2, 3, 4];const mutate = arr => {5____133
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0"Two"
9
var array = [1, 2, 3, 4];const mutate = arr => {36
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
9
var array = [1, 2, 3, 4];const mutate = arr => {38
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
5, 3];
4
var array = [1, 2, 3, 4];const mutate = arr => {33
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0var array = [1, 2, 3, 4];const mutate = arr => {17
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
5
var array = [1, 2, 3, 4];const mutate = arr => {5
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {46
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {47
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {08
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {49
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0"Two"
9
var array = [1, 2, 3, 4];const mutate = arr => {52
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
5, 3];
4
var array = [1, 2, 3, 4];const mutate = arr => {46
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0var array = [1, 2, 3, 4];const mutate = arr => {17
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
5
var array = [1, 2, 3, 4];const mutate = arr => {5
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {60
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {61
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {08
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {63
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0var array = [1, 2, 3, 4];const mutate = arr => {65
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
9
var array = [1, 2, 3, 4];const mutate = arr => {67
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {68____169
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {65
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {68
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
02"Two"
9"Two"
04
var array = [1, 2, 3, 4];const mutate = arr => {17
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
9"Two"
07
var array = [1, 2, 3, 4];const mutate = arr => {68
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
09var array = [1, 2, 3, 4];const mutate = arr => {68
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
11var array = [1, 2, 3, 4];const mutate = arr => {68____813
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
9"Two"
04
"Two"
5, 3];
4
var array = [1, 2, 3, 4];const mutate = arr => {60
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
"Two"
0, 3];
4
var array = [1, 2, 3, 4];const mutate = arr => {02____80
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
var array = [1, 2, 3, 4];const mutate = arr => {0
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
, 3];
4
var array = [1, 2, 3, 4];const mutate = arr => {6____80
var newArr = arr;
newArr.pop[];
return newArr;
}mutate[array];console.log[array]; // result [1, 2, 3] - Still mutated!
đầu ra
- Trước khi nhấp vào nút
- Sau khi nhấp vào nút
Phương pháp 2. Sử dụng cú pháp lây lan. Cú pháp trải rộng được sử dụng ở nơi không có hoặc nhiều đối số được mong đợi. Nó có thể được sử dụng với các trình vòng lặp mở rộng ở nơi có thể không có số lượng đối số dự kiến cố định [như tham số hàm]
Hàm bắt buộc được gọi như đã cho mảng đối số bằng cách sử dụng cú pháp trải rộng để nó sẽ điền vào các đối số của hàm từ mảng