Pass by Value trong JavaScirpt

Ngày đăng: 13/04/2021   -    Cập nhật: 13/04/2021
Trong bài viết này, mình sẽ giải thích cách hoạt động của Pass by value trong JavaScript và cung cấp cho bạn một số ví dụ về việc truyền các biến nguyên thủy và tham chiếu vào một hàm.


Pass by Value trong JavaScirpt


JavaScript sử dụng pass by value hay pass by reference?



Trong JavaScript, tất cả các đối số của hàm luôn được truyền bằng giá trị (pass by value). Nó có nghĩa là JavaScript sao chép các giá trị của các biến truyền vào các đối số bên trong 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 đều không ảnh hưởng đến các biến truyền bên ngoài hàm.


Nói cách khác, những thay đổi được thực hiện đối với các đối số không được phản ánh bên ngoài hàm.


Nếu các đối số của hàm được truyền bằng tham chiếu (pass by reference), thì những thay đổi của các biến mà bạn chuyển vào hàm sẽ được phản ánh bên ngoài hàm (Điều này không thể thực hiện được trong JavaScript)



#1: Pass by value với các giá trị nguyên thủy trong JS



Đầu tiên, hãy xem ví dụ này:



// Tạo hàm tính bình phương
function square(x) {
    x = x * x;
    return x;
}

var y = 10;
var result = square(y);

console.log(y); // 10
console.log(result); // 100 
 



Đầu tiên, chúng ta định nghĩa một hàm square() chấp nhận một đối số x.


Hàm này sau đó trả về giá trị x sau khi đã bình phương nó.




Tiếp theo, khai báo biến y và khởi tạo giá trị của nó thành 10:



var y = 10;
 


Sau đó, truyền biến y vào hàm square().



var result = square(y);
 


Khi truyền biến y vào hàm square(), JavaScript sẽ sao chép giá trị của y vào biến x.


Sau đó, hàm square() bình phương x.


Tuy nhiên, nó không ảnh hưởng đến giá trị của biến y. Điều này là do xy là các biến hoàn toàn khác nhau. Chúng không liên kết ngược.


Cuối cùng, giá trị của biến y không thay đổi sau khi hàm square() được gọi. Bởi vì quá trình này chỉ truyền giá trị của y (pass by value)


Nếu JavaScript sử dụng pass by reference, giá trị của biến y sẽ thay đổi thành 100.



#2: Pass by value với Object trong JS



Rõ ràng là các biến nguyên thủy được truyên theo cách pass by value. Tuy nhiên, đối với các đối tượng (object) thì lại khác.


Ví dụ:




function turnOn(objectX) {
    objectX.isOn = true;
}

var lamp = {
    isOn: false
};

// Bật đèn lên
turnOn(lamp);

// Kiểm tra xem đèn có đang sáng không?
console.log(lamp.isOn); // true;
 


Chương trình này hoạt động thế nào?


Đầu tiên, chúng ta định nghĩa một hàm turnOn() nhận một đối tượng X (objectX) làm đối số.




function turnOn(objectX) {
    objectX.isOn = true;
}
 


Hàm này đặt thuộc tính isOn của đối tượng X thành true.


Tiếp theo, khai báo lamp và gán cho nó một đối tượng có thuộc tính isOn được đặt thành false.




var lamp = {
    isOn: false
};
 


Về cơ bản, lamp là một biến tham chiếu đến đối tượng thực tế.


Sau đó, chuyển biến lamp vào hàm turnOn().




// Bật đèn lên
turnOn(lamp);
 


JavaScript lúc này sẽ sao chép giá trị của biến lamp sang biến objectX.


Kết quả là, cả biến lampobjectX đều tham chiếu đến cùng một đối tượng trong bộ nhớ:



Ví dụ pass by value với Object trong JavaScript (1)


Sau đó, bên trong hàm turnOn(), thuộc tính isOn của đối tượng được đặt thành true thông qua biến objectX



objectX.isOn = true;
 


Do đó, bây giờ cả lampobjectX cùng tham chiếu đến một đối tượng có thuộc tính isOntrue


Ví dụ pass by value với Object trong JavaScript (2)



Do đó, khi bạn log ra consle để xem thuộc tính isOn của lamp:



console.log(lamp.isOn);
 


Thì chúng ta có được kết quả như thế:


Ví dụ pass by value với Object trong JavaScript (3)


Có vẻ như JavaScript truyền một đối tượng theo tham chiếu (pass by value) vì các thay đổi đối với đối tượng được phản ánh bên ngoài hàm.


Tuy nhiên, trường hợp này thì không phải.


Trên thực tế, khi bạn truyền một đối tượng cho một hàm, bạn đang truyền tham chiếu của đối tượng đó, không phải đối tượng thực (máy tính). Do đó, hàm có thể sửa đổi các thuộc tính của đối tượng thông qua tham chiếu của nó.


Ngoài ra, khi bạn truyền một đối tượng vào một hàm, hàm không thể thay đổi biến tham chiếu để tham chiếu đến một đối tượng khác.


Điều này được chứng minh qua ví dụ sau:




function turnOn(objectX) {
    objectX = {
        isOn: true
    };
}

var lamp = {
    isOn: false
};

turnOn(lamp);

console.log(lamp.isOn); // false;
 


Lần này, hàm turnOn() thay đổi đối số của objectX để nó tham chiếu đến một đối tượng khác.


Trước khi truyền đối tượng lamp đến hàm turnOn(), thuộc tính isOn của đối tượng lampfalse.


Nếu biến lamp được chuyển bằng tham chiếu (pass by reference), biến lamp sẽ được thay đổi và tham chiếu đến đối tượng mới có thuộc tính isOntrue.


Tuy nhiên, khi chúng ta truy cập thuộc tính isOn bên ngoài hàm, ta vẫn nhận được false.


Điều này chỉ ra rằng tham chiếu ban đầu không thay đổi mặc dù đối số đã được thay đổi bên trong hàm.



Tóm lại



JavaScript sử dụng pass by value, truyền mọi đối số cho hàm bằng giá trị.


> Nếu bạn yêu thích JavaScript và muốn đi sâu hơn thì hãy tham gia HỌC FRONT END (Chuyên sâu với HTML, CSS, JavaScript và React) ngay và luôn!



---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp
Bình luận Facebook
Khóa học liên quan đến bài viết

KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS

56 giờ
Học Lập trình Front end hiện đại với ReactJS. Học làm chủ HTML, CSS, JS và thư viện JavaScript phổ biến nhất hiện nay. Sẵn sàng đi thực tập / đi làm ngay sau khóa học.

Khóa học PHP Full stack [2023] cho người mới bắt đầu

96 giờ
Khóa học Lập trình PHP Full stack, phiên bản cập nhật lần thứ 8. Dạy Lập trình PHP bài bản từ Front end đến Back end + Laravel. Hướng dẫn làm 2 Dự Án Web lớn

KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG

50 giờ
Khóa học giúp học viên sử dụng thành thạo ngôn ngữ Lập trình Python (3x). Hiểu và phát triển được Ứng dụng Web với Django Framework. Học thực hành với Giảng viên cao cấp.

Khóa học Java Full stack (IJFD)

104 giờ
Học lập trình Java Fullstack với khóa học được xây dựng theo lộ trình bài bản, từ JAVA CƠ BẢN đến JAVA WEB và nâng cao về JAVA FRAMEWORK như: Spring Boot, Hibernate
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!