Javascript có chuyển tham số theo giá trị hoặc theo tham chiếu không?


Vượt qua giá trị

Trong chuyển theo giá trị, một hàm được gọi bằng cách chuyển trực tiếp giá trị của biến làm đối số. Thay đổi đối số bên trong hàm không ảnh hưởng đến biến được truyền từ bên ngoài hàm. Javascript luôn chuyển theo giá trị, vì vậy việc thay đổi giá trị của biến không bao giờ thay đổi nguyên hàm cơ bản (Chuỗi hoặc số)

Trong ví dụ sau, biến 'a' được gán giá trị 1. Nhưng bên trong chức năng 'thay đổi', nó được gán với giá trị 2. Vì javascript luôn là giá trị truyền qua nên đầu ra được hiển thị sẽ là '1' chứ không phải '2'

Thí dụ

Bản thử trực tiếp




đầu ra

1

Chuyển qua tham chiếu

Có một số trường hợp địa chỉ được chuyển thay vì đối số để gọi hàm. Khi đó, việc thay đổi giá trị bên trong hàm sẽ ảnh hưởng đến biến được truyền từ bên ngoài vào hàm. Điều này được gọi là vượt qua theo tham chiếu. Trong javascript, hầu hết các mảng và đối tượng đều theo sau bằng cách tham chiếu

Trong ví dụ sau, một đối tượng có tên 'a' được khai báo bên ngoài hàm 'change'. Ở đây, người ta nên lưu ý rằng biến 'a' đã bị thay đổi nhưng không được gán với giá trị 2, như trong ví dụ 2. Chuyển qua tham chiếu diễn ra khi đột biến đã xảy ra.   

Ví dụ 1

Bản thử trực tiếp




đầu ra

{"num":2}

Trong ví dụ sau thay vì đột biến, biến 'a' được gán với giá trị 2. Vì vậy, việc vượt qua giá trị diễn ra và sẽ không ảnh hưởng đến biến bên ngoài

Trong bài đăng này, chúng ta sẽ xem xét sự khác biệt giữa truyền giá trị và truyền tham chiếu trong JavaScript

0. Quan điểm cá nhân về chủ đề

Các khái niệm này đã được định nghĩa từ lâu trước khi JavaScript được tạo và do đó không thể hiện đầy đủ ngữ nghĩa của JavaScript. Tuy nhiên, nếu bạn vẫn muốn áp dụng chúng vào JavaScript, tôi sẽ cố gắng giải thích các khái niệm này dưới dạng JavaScript

1. Một số định nghĩa

Biến đổi. Một biểu tượng có nhiều ý nghĩa đề cập đến một giá trị tại một vị trí cụ thể trong bộ nhớ. Trong hầu hết các trường hợp, cụm từ này quá nặng để được sử dụng một mình khi đề cập đến các chi tiết cụ thể.

Giá trị. Các bit cụ thể được lưu trữ trong bộ nhớ được gọi bằng ký hiệu của biến

Vị trí bộ nhớ. Vị trí trong bộ nhớ mà giá trị của một biến được lưu giữ

Callee và người gọi. Callee là một chức năng đã được gọi bởi một chức năng khác, trong khi một người gọi là một chức năng gọi một chức năng khác (callee)

Tham số chính thức. Tham số hình thức là các giá trị được đặt trước mà hàm nhận được khi được gọi

thông số thực tế. Tham số thực tế là các giá trị được cung cấp trong lệnh gọi hàm

Một số lưu ý

Biến là con trỏ của giá trị

Việc gán lại một biến chỉ đơn giản là thay đổi giá trị của tham chiếu

Bởi vì mỗi biến có một con trỏ riêng, việc gán lại một biến không ảnh hưởng đến các biến khác đang trỏ đến cùng một đối tượng

2. Pass by Value là gì?

Thuật ngữ “chuyển theo giá trị” đề cập đến việc tạo một bản sao bộ nhớ của giá trị của tham số thực. Ví dụ: caller và callee có hai biến độc lập có cùng giá trị. Hệ quả của việc callee thay đổi giá trị tham số không hiển nhiên đối với người gọi. Đừng lo lắng nếu bạn không hiểu theo định nghĩa, tôi sẽ giải thích nó bằng một đoạn mã ví dụ một chút

3. Pass by Reference là gì?

Thuật ngữ “pass-by-reference” đề cập đến việc chuyển tham chiếu của một đối số trong hàm gọi đến tham số chính thức tương ứng của hàm được gọi. Sử dụng tham chiếu đã cho, hàm được gọi có thể thay đổi giá trị của đối số. Một lần nữa, đừng lo lắng nếu bạn không hiểu theo định nghĩa, tôi sẽ đưa ra các ví dụ mã sau một chút trong bài viết này

4. JavaScript là Pass by Value hay Pass by Reference?

Chúng tôi có các hàm trong JavaScript và các đối số mà chúng tôi đưa vào các hàm đó. Tuy nhiên, cách JavaScript xử lý dữ liệu bạn cung cấp không phải lúc nào cũng rõ ràng. Trong JavaScript, không có thứ gọi là "chuyển qua tham chiếu" cho bất kỳ biến nào. Tất cả các biến và đối số đều có giá trị được gán cho chúng, tuy nhiên giá trị của biến đối tượng là một tham chiếu. Kết quả là, nếu bạn cung cấp một đối tượng và thay đổi các thành viên của nó bên trong phương thức, thì những thay đổi đó sẽ nằm ngoài hàm. Điều này làm cho nó xuất hiện như thể nó là một hệ thống tham chiếu. Các giá trị nguyên thủy như số nguyên, chuỗi và boolean được cung cấp theo giá trị, nhưng các đối tượng và mảng, như đã nêu trước đó, được truyền theo tham chiếu

5. Ví dụ JavaScript Pass by Value

Giả sử bạn có 2 biến số nguyên (kiểu dữ liệu nguyên thủy) được xác định

var num1 = 1;
var num2 = 2;

Sau đó, giả sử bạn xác định số nguyên thứ 3, num3 và gán num1 cho nó. Sau đó làm một giao diện điều khiển. nhật ký của cả num3 và num1. Sau khi bạn làm điều tương tự bằng cách gán num2 cho num3

var num3 = num1;
console.log(num1); //outputs 1
console.log(num3); //also outputs 1
num3 = num2;
console.log(num1); //outputs 2
console.log(num2); //also 2

Vì vậy, trong ví dụ mã này, không có gì thay đổi trên num1 và num2 vì chúng ta chỉ gán chúng cho một biến khác, num3, nói cách khác, chúng ta đã chuyển giá trị của chúng cho num3 và num3 hiện có giá trị con trỏ mới trong bộ nhớ và nó không có gì để làm . Hãy đi sâu vào nhiều hơn. Bây giờ, chúng ta sẽ gán lại num1 cho num3 và thay đổi giá trị của num3 và console. đăng nhập lại

num3 = num1;
num3 = 3;
console.log(num1); //outputs 1
console.log(num3); //outputs 3

Vì vậy, ở đây chúng ta thấy cả hai giá trị num1 và num3 đều khác nhau trong khi trước đó chúng ta chỉ gán num3 cho num1. Điều này cho thấy rằng cả hai biến đều trỏ đến các giá trị khác nhau trong bộ nhớ, do đó việc thay đổi giá trị ở một trong số chúng không ảnh hưởng gì đến biến khác

6. Ví dụ JavaScript Pass by Reference

Giả sử bạn có 2 đối tượng được xác định

var obj1 = {name: "Vəndam"};
var obj2 = {name: "Tofiy"};

Sau đó, giả sử bạn xác định đối tượng thứ 3, obj3 và gán obj1 cho nó. Sau đó làm một giao diện điều khiển. nhật ký của cả obj3 và obj1. Sau khi bạn làm điều tương tự bằng cách gán obj2 cho obj3

________số 8_______

Vì vậy, trong ví dụ mã này, không có gì thay đổi trên obj1 và obj2 vì chúng ta chỉ gán chúng cho một biến khác, obj3, nói cách khác, chúng ta đã chuyển tham chiếu của chúng vào bộ nhớ cho obj3. Hãy đi sâu vào nhiều hơn. Bây giờ, chúng ta sẽ gán lại obj1 cho obj3 và thay đổi tham số đối tượng của obj3 và console. đăng nhập lại

obj3 = obj1;
obj3.name = "Mürşüd";
console.log(obj1); //outputs {name: "Mürşüd"}
console.log(obj3); //also outputs {name: "Mürşüd"}

Vì vậy, ở đây chúng ta thấy cả giá trị tham số đối tượng obj1 và obj3 đều được thay đổi trong khi chúng ta chỉ thay đổi obj3. giá trị tên. Điều này cho thấy rằng cả hai đối tượng đang trỏ đến cùng một tham chiếu trong bộ nhớ, do đó việc thay đổi tham số ở một trong số chúng sẽ phản ánh ở một đối tượng khác

7. Phần kết luận

Tóm lại, trong JavaScript, tất cả các biến và đối số đều có giá trị được gán cho chúng, nghĩa là chúng được truyền theo giá trị (Kiểu dữ liệu nguyên thủy) tuy nhiên giá trị của biến của đối tượng là một tham chiếu, do đó các loại phức hợp trong JavaScript được truyền theo tham chiếu

Các đối số JavaScript có được chuyển qua tham chiếu không?

Trong JavaScript, mảng và đối tượng theo sau chuyển qua thuộc tính tham chiếu . Trong Truyền theo tham chiếu, các tham số được truyền dưới dạng đối số không tạo bản sao của chính nó, nó đề cập đến giá trị ban đầu nên những thay đổi được thực hiện bên trong hàm sẽ ảnh hưởng đến giá trị ban đầu.

Các tham số được truyền trong JavaScript như thế nào?

Các đối số được truyền theo giá trị . 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ố. Nếu một hàm thay đổi giá trị của đối số, thì nó không thay đổi giá trị ban đầu của tham số.

Cách truyền đối số hoạt động như giá trị so với tham chiếu trong JavaScript?

Trong giá trị chuyển qua trong JavaScript, một bản sao của biến ban đầu được tạo, vì vậy mọi thay đổi được thực hiện đối với biến được sao chép đều không ảnh hưởng đến biến ban đầu. Trong tham chiếu chuyển qua trong JavaScript, chúng tôi chuyển tham chiếu của tham số thực tế. Không có bản sao nào được tạo trong bộ nhớ

Các biến có được truyền theo giá trị trong JavaScript không?

Javascript luôn chuyển theo giá trị nên việc thay đổi giá trị của biến không bao giờ thay đổi giá trị nguyên thủy bên dưới (Chuỗi hoặc số). Trong ví dụ sau, biến 'a' được gán giá trị 1.