Hướng dẫn are javascript objects passed by value or passed by reference? - các đối tượng javascript được truyền bởi giá trị hay được truyền bởi tham chiếu?

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

Các đối tượng JS có được truyền qua tham chiếu không?

Đối tượng và mảng các đối tượng trong JavaScript được truyền bằng tham chiếu. Khi có nhiều hơn một biến được đặt để lưu trữ một đối tượng, mảng hoặc hàm, các biến đó sẽ trỏ đến cùng một không gian được phân bổ trong bộ nhớ.Objects in JavaScript are passed by reference. When more than one variable is set to store either an object , array or function , those variables will point to the same allocated space in the memory.

Các đối tượng được truyền bởi tham chiếu hoặc giá trị?

Tài liệu tham khảo đối tượng được truyền theo giá trị Lý do là các biến đối tượng Java chỉ đơn giản là các tham chiếu chỉ vào các đối tượng thực trong đống bộ nhớ.Do đó, mặc dù Java chuyển các tham số cho các phương thức theo giá trị, nếu biến trỏ đến một tham chiếu đối tượng, đối tượng thực cũng sẽ được thay đổi. The reason is that Java object variables are simply references that point to real objects in the memory heap. Therefore, even though Java passes parameters to methods by value, if the variable points to an object reference, the real object will also be changed.

Làm thế nào các đối tượng được truyền trong JavaScript?

Các đối tượng được truyền bằng tham chiếu trong JavaScript, tham chiếu đối tượng là các giá trị.Bởi vì điều này, các đối tượng sẽ hoạt động giống như chúng được thông qua bởi tham chiếu: nếu một hàm thay đổi thuộc tính đối tượng, nó sẽ thay đổi giá trị ban đầu.Các thay đổi đối với các thuộc tính đối tượng có thể nhìn thấy (phản xạ) bên ngoài hàm.by Reference In JavaScript, object references are values. Because of this, objects will behave like they are passed by reference: If a function changes an object property, it changes the original value. Changes to object properties are visible (reflected) outside the function.

Các biến được truyền bởi giá trị trong javascript?

JavaScript luôn vượt qua giá trị để thay đổi giá trị của biến không bao giờ thay đổi nguyên thủy cơ bản (chuỗi hoặc số).Tuy nhiên, khi một biến đề cập đến một đối tượng bao gồm mảng, giá trị là tham chiếu đến đối tượng. so changing the value of the variable never changes the underlying primitive (String or number). However, when a variable refers to an object which includes array, the value is the reference to the object.