Các kiểu dữ liệu có thể là một khái niệm khó hiểu. Nhưng với tư cách là lập trình viên, chúng ta sử dụng các kiểu dữ liệu hàng ngày – vì vậy chúng là thứ chúng ta nên hiểu
Câu hỏi đặt ra là máy tính lưu trữ các loại dữ liệu này như thế nào?
Trong JavaScript, các loại dữ liệu được chia thành hai loại và máy tính xử lý từng loại khác nhau. Chúng tôi có các kiểu dữ liệu nguyên thủy và các kiểu dữ liệu tham chiếu. Nhưng những cái này là gì?
Các kiểu dữ liệu nguyên thủy trong JavaScriptCác kiểu dữ liệu này khá đơn giản và đôi khi được coi là mức triển khai thấp nhất của ngôn ngữ lập trình. Chúng không phải là đối tượng và không có phương thức
Ví dụ về các kiểu dữ liệu như vậy là số, chuỗi, booleans, null và không xác định
Nhưng bạn có thể thắc mắc về các chuỗi, bởi vì chúng có các phương thức. Thực tế là, JavaScript chuyển đổi các chuỗi nguyên thủy thành các đối tượng chuỗi, do đó có thể sử dụng các phương thức đối tượng chuỗi
Các kiểu dữ liệu nguyên thủy được xử lý như thế nào trong JavaScript?Khi bạn khai báo một kiểu dữ liệu nguyên thủy trong JavaScript, nó sẽ được lưu trữ trên một ngăn xếp. Ngăn xếp là một cấu trúc dữ liệu đơn giản mà máy tính sử dụng để lưu trữ và truy xuất dữ liệu nhanh chóng
Kiểu dữ liệu nguyên thủy trên ngăn xếp được xác định bằng tên biến mà bạn đã sử dụng để khai báo trong chương trình của mình. Với mỗi kiểu dữ liệu nguyên thủy bạn tạo, dữ liệu sẽ được thêm vào ngăn xếp
Để thực hiện điều này, giả sử chúng ta khai báo một biến, numOne
và đặt giá trị cho nó là 50. Chúng tôi tiếp tục tạo một biến khác, numTwo
và gán cho nó cùng một giá trị là 50. Vì vậy, cả hai biến có cùng giá trị
Điều xảy ra trên ngăn xếp là máy tính tạo chỗ cho numOne
và lưu trữ giá trị được chỉ định của nó trên ngăn xếp. Khi numTwo
được tạo, máy tính lại tạo chỗ và lưu trữ 50 trên ngăn xếp. Không quan trọng là cả hai biến được gán cùng một giá trị
Điều gì sẽ xảy ra nếu trong quá trình mã hóa, chúng tôi quyết định cập nhật giá trị của numOne
thành 100?
Vì numOne
và numTwo
được lưu trữ khác nhau trên ngăn xếp nên việc cập nhật một trong số chúng sẽ không ảnh hưởng đến cái kia. Và chúng tôi có thể thử nghiệm điều đó bằng cách thực sự dùng thử trong trình chỉnh sửa mã của chúng tôi
Ghi nhật ký numOne
vào bảng điều khiển sẽ xuất ra 100 và ghi nhật ký numTwo
sẽ xuất ra 50. Vì vậy, trên thực tế, hai biến không có mối quan hệ với nhau
let numOne = 50;
let numTwo = numOne; //numTwo=numOne=50
numOne = 100;
console.log[numOne]; //outputs 100
console.log[numTwo]; //outputs 50
Bây giờ chúng ta đã thấy việc xử lý các kiểu dữ liệu nguyên thủy dễ dàng như thế nào, hãy xem các kiểu dữ liệu tham chiếu tương tự hoạt động như thế nào.
Các kiểu dữ liệu tham chiếu trong JavaScriptCác kiểu dữ liệu tham chiếu, không giống như các kiểu dữ liệu nguyên thủy, có bản chất động. Đó là, chúng không có kích thước cố định
Hầu hết chúng được coi là đối tượng, và do đó có các phương thức. Ví dụ về các kiểu dữ liệu như vậy bao gồm mảng, hàm, tập hợp và tất cả các kiểu đối tượng khác
Sự khác biệt xuất hiện khi máy tính phải lưu trữ kiểu dữ liệu tham chiếu. Khi bạn tạo một biến và gán cho nó một giá trị là kiểu dữ liệu tham chiếu, máy tính không lưu trực tiếp kiểu dữ liệu đó vào biến đó [như trường hợp của kiểu nguyên thủy]
Những gì bạn đã gán cho biến đó là một con trỏ trỏ đến vị trí của kiểu dữ liệu đó trong bộ nhớ. Gây nhầm lẫn?
Như bạn có thể thấy trong hình trên, chúng tôi hiện có hai cấu trúc dữ liệu. Một ngăn xếp, và một đống. Giả sử chúng ta đã khai báo một đối tượng, chẳng hạn. Bản thân đối tượng được lưu trữ trên một đống và con trỏ của nó được lưu trữ trên một ngăn xếp. Con trỏ được xác định bởi tên biến của đối tượng và trỏ tới đối tượng đó
Bây giờ, chúng ta có thể tạo một biến,
let object1 = {
name:'Bingeh',
age:18
};
let object2 = object1;
//updating object1,
object1.age = 20;
console.log[object2]; //we see that object2 also updates the age attribute
2, và gán một đối tượng cho nó. Nếu như trước đây, chúng ta tạo một biến khác là let object1 = {
name:'Bingeh',
age:18
};
let object2 = object1;
//updating object1,
object1.age = 20;
console.log[object2]; //we see that object2 also updates the age attribute
3 và gán nó cho let object1 = {
name:'Bingeh',
age:18
};
let object2 = object1;
//updating object1,
object1.age = 20;
console.log[object2]; //we see that object2 also updates the age attribute
2. Điều đó có nghĩa là một đối tượng khác sẽ được tạo trên heap? Vì đối tượng đã tồn tại trên heap, nên cả
let object1 = {
name:'Bingeh',
age:18
};
let object2 = object1;
//updating object1,
object1.age = 20;
console.log[object2]; //we see that object2 also updates the age attribute
3 và let object1 = {
name:'Bingeh',
age:18
};
let object2 = object1;
//updating object1,
object1.age = 20;
console.log[object2]; //we see that object2 also updates the age attribute
2 đều trỏ đến cùng một đối tượngMột sự khác biệt khác xuất hiện khi chúng tôi cập nhật
let object1 = {
name:'Bingeh',
age:18
};
let object2 = object1;
//updating object1,
object1.age = 20;
console.log[object2]; //we see that object2 also updates the age attribute
2. Nếu chúng tôi ghi cả hai biến vào bảng điều khiển, chúng tôi sẽ thấy rằng thay đổi đã ảnh hưởng đến cả hai. Điều này là do chúng đang trỏ đến cùng một đối tượng trên heap – và việc cập nhật một biến tất nhiên sẽ ảnh hưởng đến biến kialet object1 = {
name:'Bingeh',
age:18
};
let object2 = object1;
//updating object1,
object1.age = 20;
console.log[object2]; //we see that object2 also updates the age attribute
Bây giờ bạn đã biết sự khác biệt giữa các kiểu dữ liệu nguyên thủy và tham chiếu. Điều quan trọng là phải biết những điểm khác biệt này – đặc biệt là khi bạn gặp lỗi như 'tham chiếu con trỏ null' - để bạn có thể tìm ra lý do tại sao chúng lại xảy ra
Điều này đôi khi xảy ra với các nhà phát triển Java, vì vậy tôi hy vọng rằng bài viết này sẽ giúp bạn giải tỏa mọi nghi ngờ
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
Kỹ thuật máy tính đại học, tập trung vào phát triển frontend. HTML/CSS/Bootstrap/JS/Tailwind. Nghiện Canva quá. ]
Nếu bạn đọc đến đây, hãy tweet cho tác giả để cho họ thấy bạn quan tâm. Tweet một lời cảm ơn
Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu