Hướng dẫn is javascript pass by reference or by value? - javascript được chuyển theo tham chiếu hay theo giá trị?

Hai xu của tôi ... đây là cách tôi hiểu nó. (Vui lòng sửa cho tôi nếu tôi sai)

Đã đến lúc vứt bỏ mọi thứ bạn biết về vượt qua giá trị / tham chiếu.

Bởi vì trong JavaScript, không quan trọng nó được truyền theo giá trị hay bằng tham chiếu hay bất cứ điều gì. Điều quan trọng là đột biến so với gán các tham số được truyền vào một hàm.

Được rồi, hãy để tôi cố gắng hết sức để giải thích ý tôi. Giả sử bạn có một vài đối tượng.

var object1 = {};
var object2 = {};

Những gì chúng tôi đã làm là "gán" ... chúng tôi đã gán 2 đối tượng trống riêng biệt cho các biến "Object1" và "object2".

Bây giờ, hãy nói rằng chúng tôi thích Object1 hơn ... vì vậy, chúng tôi "gán" một biến mới.

var favoriteObject = object1;

Tiếp theo, vì bất kỳ lý do gì, chúng tôi quyết định rằng chúng tôi thích đối tượng 2 hơn. Vì vậy, chúng tôi làm một chút phân bổ lại.

favoriteObject = object2;

Không có gì xảy ra với Object1 hoặc đối tượng2. Chúng tôi đã không thay đổi bất kỳ dữ liệu nào cả. Tất cả những gì chúng tôi đã làm là gán lại đối tượng yêu thích của chúng tôi là gì. Điều quan trọng là phải biết rằng đối tượng2 và yêu thích đều được gán cho cùng một đối tượng. Chúng ta có thể thay đổi đối tượng đó thông qua một trong hai biến đó.

object2.name = 'Fred';
console.log(favoriteObject.name) // Logs Fred
favoriteObject.name = 'Joe';
console.log(object2.name); // Logs Joe

Ok, bây giờ chúng ta hãy xem các nguyên thủy như chuỗi chẳng hạn

var string1 = 'Hello world';
var string2 = 'Goodbye world';

Một lần nữa, chúng tôi chọn một yêu thích.

var favoriteString = string1;

Cả hai biến yêu thích và chuỗi1 của chúng tôi đều được gán cho 'Hello World'. Bây giờ, điều gì sẽ xảy ra nếu chúng ta muốn thay đổi sự yêu thích của mình ??? Chuyện gì sẽ xảy ra???

favoriteString = 'Hello everyone';
console.log(favoriteString); // Logs 'Hello everyone'
console.log(string1); // Logs 'Hello world'

Uh oh .... chuyện gì đã xảy ra. Chúng tôi không thể thay đổi String1 bằng cách thay đổi yêu thích ... tại sao ?? Bởi vì chúng tôi không thay đổi đối tượng chuỗi của chúng tôi. Tất cả những gì chúng tôi đã làm là "gán lại" biến ưu tiên cho một chuỗi mới. Điều này về cơ bản đã ngắt kết nối nó với String1. Trong ví dụ trước, khi chúng tôi đổi tên đối tượng của mình, chúng tôi đã không gán bất cứ điều gì. . .

Bây giờ, trên các chức năng và các tham số truyền .... khi bạn gọi một hàm và chuyển một tham số, những gì bạn đang làm là một "gán" cho một biến mới và nó hoạt động giống h bằng (=) dấu.

Lấy những ví dụ này.

var myString = 'hello';

// Assign to a new variable (just like when you pass to a function)
var param1 = myString;
param1 = 'world'; // Re assignment

console.log(myString); // Logs 'hello'
console.log(param1);   // Logs 'world'

Bây giờ, điều tương tự, nhưng với một chức năng

function myFunc(param1) {
    param1 = 'world';

    console.log(param1);   // Logs 'world'
}

var myString = 'hello';
// Calls myFunc and assigns param1 to myString just like param1 = myString
myFunc(myString);

console.log(myString); // logs 'hello'

OK, bây giờ, hãy để cho một vài ví dụ sử dụng các đối tượng thay thế ... trước tiên, không có chức năng.

var myObject = {
    firstName: 'Joe',
    lastName: 'Smith'
};

// Assign to a new variable (just like when you pass to a function)
var otherObj = myObject;

// Let's mutate our object
otherObj.firstName = 'Sue'; // I guess Joe decided to be a girl

console.log(myObject.firstName); // Logs 'Sue'
console.log(otherObj.firstName); // Logs 'Sue'

// Now, let's reassign the variable
otherObj = {
    firstName: 'Jack',
    lastName: 'Frost'
};

// Now, otherObj and myObject are assigned to 2 very different objects
// And mutating one object has no influence on the other
console.log(myObject.firstName); // Logs 'Sue'
console.log(otherObj.firstName); // Logs 'Jack';

Bây giờ, điều tương tự, nhưng với một cuộc gọi chức năng

var favoriteObject = object1;
0

OK, nếu bạn đọc qua toàn bộ bài đăng này, có lẽ bây giờ bạn hiểu rõ hơn về cách gọi chức năng hoạt động trong JavaScript. Không quan trọng liệu một cái gì đó được thông qua bởi tham chiếu hay theo giá trị ... điều quan trọng là gán so với đột biến.

Mỗi khi bạn chuyển một biến cho một hàm, bạn đang "gán" cho bất kỳ tên nào của biến tham số, giống như nếu bạn sử dụng dấu hiệu (=) bằng nhau.

Luôn nhớ rằng dấu bằng (=) có nghĩa là gán. Luôn nhớ rằng chuyển một tham số cho một hàm trong JavaScript cũng có nghĩa là gán. Chúng giống nhau và 2 biến được kết nối chính xác theo cùng một cách (có nghĩa là chúng không, trừ khi bạn tính rằng chúng được gán cho cùng một đối tượng).

Lần duy nhất "sửa đổi một biến" ảnh hưởng đến một biến khác là khi đối tượng cơ bản bị đột biến (trong trường hợp bạn chưa sửa đổi biến, nhưng chính đối tượng.

Không có điểm nào trong việc phân biệt giữa các đối tượng và nguyên thủy, bởi vì nó hoạt động giống chính xác như thể bạn không có chức năng và chỉ sử dụng dấu bằng để gán cho một biến mới.

Gotcha duy nhất là khi tên của biến bạn chuyển vào hàm giống như tên của tham số hàm. Khi điều này xảy ra, bạn phải xử lý tham số bên trong hàm như thể nó là một biến hoàn toàn mới riêng tư cho hàm (vì nó là)

var favoriteObject = object1;
1

JavaScript có vượt qua bởi tham chiếu hay giá trị không?

Nó luôn luôn vượt qua giá trị, nhưng đối với các đối tượng, giá trị của biến là một tham chiếu. Bởi vì điều này, khi bạn vượt qua một đối tượng và thay đổi các thành viên của nó, những thay đổi đó vẫn tồn tại bên ngoài chức năng. Điều này làm cho nó trông giống như vượt qua bởi tài liệu tham khảo.. Because of this, when you pass an object and change its members, those changes persist outside of the function. This makes it look like pass by reference.

Các hàm JavaScript có được chuyển qua giá trị không?

Trong JavaScript, tất cả các đối số hàm luôn được truyền bởi giá trị.Nó có nghĩa là JavaScript sao chép các giá trị của các biến vào các đối số hàm.Bất kỳ thay đổi nào bạn thực hiện đối với các đối số bên trong hàm không phản ánh các biến vượt qua bên ngoài hàm.all function arguments are always passed by value. It means that JavaScript copies the values of the variables into the function arguments. Any changes that you make to the arguments inside the function do not reflect the passing variables outside of the function.

Có phải Java đều vượt qua tham chiếu và vượt qua giá trị?

Java luôn được truyền theo giá trị và không vượt qua tham chiếu, chúng ta có thể chứng minh nó bằng một ví dụ đơn giản.Giả sử chúng ta có một quả bóng lớp như dưới đây.Và chúng tôi có một chương trình đơn giản với một phương pháp chung để trao đổi hai đối tượng, lớp trông giống như bên dưới., we can prove it with a simple example. Let's say we have a class Balloon like below. And we have a simple program with a generic method to swap two objects, the class looks like below.

JavaScript có vượt qua chuỗi bằng cách tham khảo không?

Trên thực tế, các chuỗi trong JavaScript thực sự được thông qua bằng cách tham khảo.Do đó, gọi một hàm với một chuỗi không liên quan đến việc sao chép nội dung của chuỗi.Tuy nhiên, chuỗi JavaScript là bất biến;Trái ngược với chuỗi C ++, một khi chuỗi JavaScript đã được tạo ra, nó không thể được sửa đổi.Strings in Javascript are indeed passed “by reference”. Thus, calling a function with a string does not involve copying the string's contents. However, JavaScript Strings are immutable; in contrast to C++ strings, once a JavaScript string has been created it cannot be modified.