24/01/2019, 15:23

[Javascript] Truyền tham trị và truyền tham chiếu

Trong bài đăng này, chúng ta sẽ xem xét truyền tham trị và truyền tham chiếu trong Javascript. Hàm được gọi bằng cách truyề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 luôn truyền tham trị và không ...

Trong bài đăng này, chúng ta sẽ xem xét truyền tham trị và truyền tham chiếu trong Javascript.

Hàm được gọi bằng cách truyề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 luôn truyền tham trị và không bao giờ thay đổi giá trị với kiểu dữ liệu nguyên thủy (String, number hoặc boolen)

function callByValue(varOne, varTwo) { 
  console.log("Inside Call by Value Method"); 
  varOne = 100; 
  varTwo = 200; 
  console.log("varOne =" + varOne +"varTwo =" +varTwo); 
} 
let varOne = 10; 
let varTwo = 20; 
console.log("Before Call by Value Method"); 
console.log("varOne =" + varOne +"varTwo =" +varTwo); 
callByValue(varOne, varTwo) 
console.log("After Call by Value Method"); 
console.log("varOne =" + varOne +"varTwo =" +varTwo); 

output will be : 
--------------- 
Before Call by Value Method 
varOne =10 varTwo =20 
Inside Call by Value Method 
varOne =100 varTwo =200 
After Call by Value Method 
varOne =10 varTwo =20

Tuy nhiên, khi một biến tham chiếu đến một đối tượng bao gồm mảng, giá trị là tham chiếu đến đối tượng.

Hàm được gọi bằng cách chuyển trực tiếp tham chiếu / địa chỉ của biến làm đối số. Thay đổi đối số bên trong hàm ảnh hưởng đến biến được truyền từ bên ngoài hàm. Trong các đối tượng Javascript và mảng theo sau thông qua tham chiếu.

function callByReference(varObj) { 
  console.log("Inside Call by Reference Method"); 
  varObj.a = 100; 
  console.log(varObj); 
} 
let varObj = {a:1};
console.log("Before Call by Reference Method"); 
console.log(varObj);
callByReference(varObj) 
console.log("After Call by Reference Method"); 
console.log(varObj);
output will be : 
--------------- 
Before Call by Reference Method 
{a: 1} 
Inside Call by Reference Method 
{a: 100} 
After Call by Reference Method 
{a: 100}

Vì vậy, nếu chúng ta truyền đối tượng hoặc mảng làm đối số cho phương thức, thì các giá trị của đối tượng có thể thay đổi.

Thường thì với những object đơn giản một cấp thế này, bạn có thể sử dụng Object.assign. Ví dụ như

let x1 = {'name': 'John'};
let x2 = Object.assign({}, x1);
x2['name'] = 'Peter';

console.log(x2);
=> {name: 'Peter'}
console.log(x1);
=> {name: 'John'}

Tuy nhiên, nếu gán object phức tạp hơn thì Object.assign không thể như mong muốn được. Ví dụ như

let x1 = {
    'odd': [1, 3, 5],
    'even': [0, 2, 4]
}

let x2 = Object.assign({}, x1);
x2['odd'].push(7);

console.log(x1);
=>
{
    'odd': [1, 3, 5, 7],
    'even': [0, 2, 4]
}

=> Giải pháp

Đơn giản nhất bạn có thể biến đổi object phức tạp đó sang string(kiểu dữ liệu nguyên thủy), sau đó parse lại để chuyển string đó thành object JSON hoàn toàn mới.

let x1 = {
    'odd': [1, 3, 5],
    'even': [0, 2, 4]
}

let x2 = JSON.parse(JSON.stringify(x1));

Trên đây là một số thông tin mà mình mong muốn các bạn đọc xong có thể nắm được cơ bản hoạt động về các kiểu giá trị truyền/nhận trong javascript, có góp ý vui lòng comment. Chân thành cảm ơn!

Bài liên quan

[Javascript] Truyền tham trị và truyền tham chiếu

Trong bài đăng này, chúng ta sẽ xem xét truyền tham trị và truyền tham chiếu trong Javascript. Hàm được gọi bằng cách truyề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 luôn truyền tham trị và không ...

Bùi Văn Nam viết 4 tuần trước

Khi nào nên dùng tham chiếu, tham trị, biến toàn cục?

Như tiêu đề thì hôm nay mình chia sẻ về việc dùng tham chiếu, tham trị, biến toàn cục, để các bạn hiểu rõ hơn và không phải băn khoan về cách dùng cũng như khi nào dùng nó nữa! Về lý thuyết thì mình không nói nữa, các bạn có thể tham khảo trên các diễn đàn, blogs khác. 1. Tổng ...

Tạ Quốc Bảo viết 14:13 ngày 02/10/2018

LÀM CHẬM VIỆC KIỂM TRA RÀNG BUỘC VÀ DUY TRÌ TOÀN VẸN THAM CHIẾU

I. Làm chậm kiểm tra ràng buộc: Trong hệ quản trị cơ sở dữ liệu Oracle thì mỗi lần xuất hiện một sửa đổi cơ sở dữ liệu => ràng buộc toàn vẹn sẽ được kiểm tra ngay sau đó nếu phép sửa đổi đòi hỏi kiểm tra (NON DEFERABLE). Nhưng có thể thay đổi bằng cách sử dụng: DEFERRABLE. Nếu một ...

Tạ Quốc Bảo viết 09:31 ngày 07/09/2018

Tham chiếu trong C++

Một biến tham chiếu là một alias , đó là tên khác cho một biến đã đang tồn tại. Khi một tham chiếu được khởi tạo với một biến, thì: hoặc tên biến hoặc tên tham chiếu có thể được sử dụng để tham chiếu tới biến đó. Tham chiếu và con trỏ trong C++ Sử dụng tham chiếu có thể thường gây bối rối ...

Tạ Quốc Bảo viết 12:36 ngày 14/08/2018

Tham chiếu Database trong MongoDB

Như đã được trình bày trong chương Relationship trong MongoDB, để triển khai một cấu trúc cơ sở dữ liệu tiêu chuẩn hóa trong MongoDB, chúng ta sử dụng khái niệm Referenced Relationship , còn được gọi là Manual References , trong đó chúng ta thao tác để lưu giữ id của các Document được ...

Trịnh Tiến Mạnh viết 11:40 ngày 14/08/2018
0