Hướng dẫn closure trong javascript viblo

Vấn đề đầu tiên mà mình muốn trình bày đó là kiểu dữ liệu trong Js. Có người nói là Js có 5 kiểu hay thậm chí 7 kiểu. OK, nhưng với mình Js chỉ có 2 kiểu dữ liệu đó là kiểu dữ liệu nguyên thủy [Primitive Types] và kiểu đối tượng [Object]

2.1. Kiểu dữ liệu nguyên thủy

Trong kiểu dữ liệu nguyên thủy gồm 3 kiểu chính đó là Numbers, String, Boolean [3 kiểu kinh điển

]. Ngoài ra một số kiểu undefined, null, NaN dễ gây khó hiểu

1. undefined: Đây là kiểu dữ liệu đại diện cho một biến. 3 loại biến sẽ trả về undefined

  • Một biến không được khởi tạo giá trị
var x;
if [x == undefined] {} //true
  • Một thuộc tính không tồn tại [hoặc đã bị xóa] trong các đối tượng
var customer = {
    name: 'Jerry'
};
if [customer.phoneNumber == undefined] {} // true
  • Các phần tử của mảng chưa được khởi tạo giá trị

2. null : null sẽ đại diện cho một đối tượng không có @@. Null thường được sử dụng để check đối tượng trả về của một hàm, check như vậy để sử dụng các thuộc tính, các phương thức của đối tượng đó không gây lỗi. Một ví dụ phổ biến là check giá trị trả về khi lấy các elements từ DOM

var header = document.getElementById["header"];
if [header == null] {
    // okay, something is seriously wrong if we have no header
}

3. NaN: đúng tư tên gọi của kiểu này, cái gì không phải là số thì là kiểu này. Vậy làm sao biết kiểu nào là số [phần này sẽ đề cập trong phần chuyển kiểu phía sau]. Một lưu ý nhỏ là khi kiểm tra một biến có phải NaN hay không, sẽ không kiểm tra bằng phép so sánh == mà sẽ sử dụng phương thức isNaN

isNaN[123]             //true
isNaN["123]            //true
isNaN["hehe"]          //false
isNaN["123hehe"]       //true @@

2.2. Kiểu đối tượng

Tất cả các kiểu dữ liệu không thuộc kiểu dữ liệu nguyên thủy sẽ là kiểu dữ liệu đối tượng. Có thể kể tới một số đối tượng mặc định trong Js như Document, Function, ... hoặc các đối tượng người dùng định nghĩa thêm như Dog, Cat ...

2.3. So sánh kiểu dữ liệu nguyên thủy và kiểu Object

OK, vậy bạn có hỏi là tự nhiên sao lại phân kiểu dữ liệu ra có 2 loại này. Câu trả lời chính là sự khác biệt khi thực hiện phép gán giá trị cho chúng. Hãy coi tên biến là các cốc, khi truyền dữ liệu cho kiểu nguyên thủy, ta truyền trực tiếp giá trị vào cốc này, còn khi gán giá trị cho Object, ta chỉ thực hiện gán tham chiếu vào cốc này [tham chiếu hiểu là địa chỉ hay con trỏ trong C,C++ cho dễ :v]

Phép gán này có ảnh hưởng gì? Nó ảnh hưởng lớn khi bạn truyền các dữ liệu này vào hàm. Cách truyền dữ liệu vào hàm trong Js sẽ là "pass by value" tức là nó sẽ copy giá trị của các đối số để truyền vào hàm. Như vậy nếu tham số của hàm nhận đối số biến kiểu dữ liệu nguyên thủy, nó copy giá trị này truyền vào đối số, chẳng ảnh hưởng gì đến giá trị của biến, nhưng khi tham số là một mảng hay Object [mảng bản chất cũng là Object do nó không là kiểu nguyên thủy], nó copy giá trị địa chỉ truyền cho hàm, rõ ràng không có ý nghĩa vì khi thay đổi giá trị lưu tại địa chỉ cũng chính là thay đổi giá trị của tất cả các biến trỏ tới nó rồi còn gì @@.

Đó chính là bản chất của việc sau truyền Object vào hàm, khi thay đổi các đối tượng thì thay đổi trực tiếp giá trị của biến luôn [đọc thêm chương 5 trong cuốn Head First sẽ viết rất chi tiết và ví dụ đầy đủ] Ngoài ra, các chuyển kiểu trong các toán tử [+, -, *, /, >,

Chủ Đề