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 chợt 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
Nếu một hàm được gọi với các đối số bị thiếu [ít hơn so với khai báo], các giá trị bị thiếu được đặt thành undefined
Đôi khi điều này có thể chấp nhận được, nhưng đôi khi tốt hơn là gán giá trị mặc định cho tham số
Giá trị tham số mặc định
ES6 cho phép các tham số chức năng có giá trị mặc định
Thí dụ
Nếu y không được thông qua hoặc không xác định, thì y = 10
function myFunction[x, y = 10] {
return x + y;
}
myFunction[
Thông số phần còn lại chức năng
Tham số còn lại [. ] cho phép một hàm coi số lượng đối số không xác định là một mảng
Thí dụ
hàm tổng[. args] {
let sum = 0;
for [let args of args] sum += arg;
return sum;
}
đặt x = tổng[4, 9, 16, 25, 29, 100, 66, 77];
Tự mình thử »Đối tượng đối số
Các hàm JavaScript có một đối tượng tích hợp được gọi là đối tượng đối số
Đối tượng đối số chứa một mảng các đối số được sử dụng khi hàm được gọi [gọi]
Bằng cách này, bạn có thể chỉ cần sử dụng một hàm để tìm [ví dụ] giá trị cao nhất trong danh sách các số
Thí dụ
x = findMax[1, 123, 500, 115, 44, 88];
function findMax[] {
let max = -Infinity;
for [let i = 0; i < đối số. chiều dài;
if [arguments[i] > max] {
max = arguments[i];
}
}
return max;
}
Hoặc tạo một hàm để tính tổng tất cả các giá trị đầu vào
Thí dụ
x = sumAll[1, 123, 500, 115, 44, 88];
function sumAll[] {
let sum = 0;
for [let i = 0; i < đối số. chiều dài;
sum += arguments[i];
}
return sum;
}
Nếu một hàm được gọi với quá nhiều đối số [nhiều hơn so với khai báo], những đối số này có thể được truy cập bằng cách sử dụng đối tượng đối số
Các đối số được truyền theo giá trị
Tham số, trong lời gọi hàm, là đối số của hàm
Các đối số JavaScript được truyền theo giá trị. Hàm chỉ biết các giá trị, không biết vị trí của đối số