JavaScript chuyển đối tượng sang chức năng theo tham chiếu

JavaScript được coi là ngôn ngữ truyền theo giá trị, nhưng tại thời điểm một biến tham chiếu đến một đối tượng, giá trị sẽ trở thành tham chiếu của đối tượng đó

Bây giờ, hãy xem những gì được truyền theo giá trị và truyền theo tham chiếu

Khi truyền theo giá trị, một hàm có thể được gọi bằng cách truyền trực tiếp giá trị của biến làm đối số. Nếu bạn thay đổi đối số bên trong hàm thì sẽ không ảnh hưởng đến biến được truyền từ bên ngoài vào hàm

Vì JavaScript luôn truyền theo giá trị, nên việc thay đổi giá trị của biến sẽ không thay đổi nguyên hàm cơ bản [số hoặc chuỗi]

Hãy chứng minh điều đó trong ví dụ dưới đây

Javascript thay đổi giá trị biến

hàm callByValue[var1, var2] { bảng điều khiển. log["Cuộc gọi nội bộ"]; . nhật ký ["var1 = " + var1 + " var2 = " + var2]; . log["Trước khi gọi"]; . nhật ký ["var1 = " + var1 + " var2 = " + var2]; . log["Sau Cuộc Gọi"]; . nhật ký ["var1 = " + var1 + " var2 = " + var2];

Đầu ra sẽ như sau

Before Call by Value Method
var1 =100 var2 =200
Inside Call by Value Method
var1 =10 var2 =20
After Call by Value Method
var1 =100 var2 =200

Nhưng trong trường hợp một biến tham chiếu đến một đối tượng bao gồm một mảng, thì giá trị là tham chiếu đến đối tượng

Truyền theo giá trị là cách lập trình an toàn hơn, ngăn người lập trình ghi đè các biến bên trong hàm. JavaScript và các ngôn ngữ lập trình hiện đại khác sử dụng nó khi nói đến nguyên thủy

Khi truyền tham chiếu, một hàm có thể được gọi bằng cách truyền trực tiếp tham chiếu/địa chỉ của biến làm đối số. Nếu bạn thay đổi đối số bên trong hàm sẽ ảnh hưởng đến biến được truyền từ bên ngoài vào hàm

Trong JavaScript, các đối tượng và mảng được truyền theo tham chiếu

Đây là một ví dụ

Các đối tượng và mảng Javascript được truyền theo tham chiếu

hàm callByReference[obj] { bảng điều khiển. log["Gọi bên trong theo tham chiếu"]; . a = 100; . nhật ký [đối tượng]; . 1}; . log["Trước khi gọi theo tham chiếu"]; . nhật ký [đối tượng]; . log["Sau khi gọi theo tham chiếu"]; . nhật ký [đối tượng];

Đầu ra sẽ là

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}

Các yếu tố đơn giản nhất của ngôn ngữ lập trình được gọi là nguyên thủy. Chúng khác nhau từ ngôn ngữ này sang ngôn ngữ khác nhưng nói chung là giá trị bất biến cơ bản nhất

Các kiểu dữ liệu nguyên thủy JavaScript sau đây được truyền theo giá trị. chuỗi, boolean, số, null, không xác định

Các nguyên hàm được sao chép theo giá trị của chúng có nghĩa là biến được truyền truy cập theo giá trị của nó

Nguyên thủy là bất biến, có nghĩa là giá trị của chúng không thể thay đổi nhưng có thể được gán lại

Các đối tượng trong JavaScript thuộc loại tham chiếu

Không giống như giá trị nguyên thủy, kích thước của giá trị tham chiếu là động;

Đối tượng là một tập hợp các thuộc tính có thể tham chiếu bất kỳ kiểu dữ liệu nào, bao gồm các đối tượng và giá trị nguyên thủy. Bạn có thể tạo các đối tượng có dấu ngoặc nhọn {…} với danh sách các thuộc tính

Nói chung, các đối tượng đi qua hầu hết mọi khía cạnh của JavaScript. Do đó nó là một trong những điều đầu tiên để học

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 là một đối tượng giống như
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
4 có thể truy cập bên trong các hàm chứa các giá trị của các đối số được truyền cho hàm đó

Ghi chú. Trong mã hiện đại, các tham số còn lại nên được ưu tiên

Đối tượng

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 là một biến cục bộ có sẵn trong tất cả các hàm không phải mũi tên. Bạn có thể tham khảo đối số của hàm bên trong hàm đó bằng cách sử dụng đối tượng
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 của nó. Nó có các mục cho mỗi đối số mà hàm được gọi, với chỉ mục của mục đầu tiên là
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
7

Ví dụ, nếu một hàm được truyền 3 đối số, bạn có thể truy cập chúng như sau

arguments[0] // first argument
arguments[1] // second argument
arguments[2] // third argument

Đối tượng

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 hữu ích cho các hàm được gọi với nhiều đối số hơn chúng được khai báo chính thức để chấp nhận, được gọi là các hàm biến thiên, chẳng hạn như
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
9. Hàm ví dụ này chấp nhận bất kỳ số lượng đối số chuỗi nào và trả về đối số dài nhất

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}

Bạn có thể sử dụng

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
10 để đếm có bao nhiêu đối số mà hàm được gọi với. Thay vào đó, nếu bạn muốn đếm có bao nhiêu tham số mà một hàm được khai báo để chấp nhận, hãy kiểm tra thuộc tính
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
11 của hàm đó

Mỗi chỉ mục đối số cũng có thể được đặt hoặc gán lại

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
1

Các hàm không nghiêm ngặt chỉ có các tham số đơn giản [nghĩa là không có tham số nghỉ, mặc định hoặc hủy cấu trúc] sẽ đồng bộ hóa giá trị mới của tham số với đối tượng

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 và ngược lại

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
5

Các hàm không nghiêm ngặt được truyền các tham số còn lại, mặc định hoặc bị hủy cấu trúc sẽ không đồng bộ hóa các giá trị mới được gán cho các tham số trong thân hàm với đối tượng

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3. Thay vào đó, đối tượng
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 trong các hàm không nghiêm ngặt với các tham số phức tạp sẽ luôn phản ánh các giá trị được truyền cho hàm khi hàm được gọi

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
8

Đây là hành vi tương tự được thể hiện bởi all , bất kể loại tham số mà chúng được truyền. Nghĩa là, việc gán giá trị mới cho tham số trong phần thân của hàm không bao giờ ảnh hưởng đến đối tượng

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3, cũng như việc gán giá trị mới cho chỉ mục
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 sẽ không ảnh hưởng đến giá trị của tham số, ngay cả khi hàm chỉ có các tham số đơn giản

Ghi chú. Bạn không thể viết một lệnh

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
17 trong phần thân của một định nghĩa hàm chấp nhận các tham số còn lại, mặc định hoặc bị hủy cấu trúc. Làm như vậy sẽ gây ra lỗi cú pháp

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 là một đối tượng dạng mảng, có nghĩa là
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3 có thuộc tính
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
11 và các thuộc tính được lập chỉ mục từ 0, nhưng nó không có các phương thức tích hợp sẵn của
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
4 như
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
52 hoặc
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
53. Tuy nhiên, nó có thể được chuyển đổi thành một
function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
4 thực, sử dụng một trong các cú pháp
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
55,
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
56 hoặc trải rộng

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
1

Đối với các trường hợp sử dụng phổ biến, sử dụng nó như một đối tượng giống như mảng là đủ, vì cả hai đều có thể lặp lại và có chỉ số

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
11 và số. Ví dụ,
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
58 chấp nhận các đối tượng dạng mảng

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
4

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
59 Không dùng nữa

Tham chiếu đến hàm hiện đang thực thi mà các đối số thuộc về. Bị cấm ở chế độ nghiêm ngặt

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
10

Số lượng đối số được truyền cho hàm

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
81

Trả về một đối tượng Array iterator mới chứa các giá trị cho mỗi chỉ mục trong

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3

Ví dụ này định nghĩa một hàm nối nhiều chuỗi. Đối số chính thức duy nhất của hàm là một chuỗi chứa các ký tự phân tách các mục để nối

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
9

Bạn có thể chuyển bao nhiêu đối số tùy thích cho hàm này. Nó trả về một danh sách chuỗi bằng cách sử dụng từng đối số trong danh sách

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
0

Ví dụ này định nghĩa một hàm tạo chuỗi chứa HTML cho danh sách. Đối số chính thức duy nhất cho hàm là một chuỗi có giá trị là

Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
83 nếu danh sách không có thứ tự [gạch đầu dòng] hoặc
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
84 nếu danh sách có thứ tự [được đánh số]. Hàm được định nghĩa như sau

function longestString[] {
  let longest = '';
  for [let i = 0; i  longest.length] {
      longest = arguments[i];
    }
  }
  return longest;
}
3

Bạn có thể chuyển bất kỳ số lượng đối số nào cho hàm này và nó thêm từng đối số dưới dạng một mục danh sách vào danh sách loại được chỉ định. Ví dụ

Làm cách nào để chuyển đối tượng bằng JavaScript tham chiếu?

JavaScript không chuyển qua tham chiếu . Tuy nhiên, JavaScript không tạo bản sao của các đối tượng khi chúng được truyền hoặc gán. Như vậy, đó là cùng một đối tượng có tên khác - những thay đổi được thực hiện đối với đối tượng [từ bất kỳ tên nào] ảnh hưởng đến đối tượng đã nói. Nó phụ thuộc vào những gì bạn có nghĩa là "vượt qua tham chiếu".

Bạn sẽ truyền đối tượng vào hàm bằng tham chiếu như thế nào?

Truyền theo tham chiếu có nghĩa là chuyển tham chiếu của một đối số trong hàm gọi đến tham số hình thức tương ứng của hàm được gọi . Hàm được gọi có thể sửa đổi giá trị của đối số bằng cách sử dụng tham chiếu của nó được truyền vào. Ví dụ sau đây cho thấy cách các đối số được truyền bằng tham chiếu.

Bạn có thể chuyển một đối tượng tới một hàm trong JavaScript không?

Chúng ta có thể truyền một đối tượng vào hàm JavaScript , nhưng các đối số phải có cùng tên với tên thuộc tính Đối tượng.

Bạn có thể chuyển một đối tượng bằng tham chiếu không?

Giá trị của một đối tượng có thể thay đổi có thể được thay đổi khi nó được truyền vào một phương thức. Không thể thay đổi giá trị của đối tượng bất biến, ngay cả khi nó được truyền một giá trị mới. "Chuyển theo giá trị" đề cập đến việc chuyển một bản sao của giá trị. “Truyền theo tham chiếu” có nghĩa là chuyển tham chiếu thực của biến vào bộ nhớ .

Chủ Đề