NỘI DUNG BÀI VIẾT
Kiểm tra kiểu dữ liệu trong JavaScript
Xử lý kiểu dữ liệu là một nhiệm vụ phổ biến trong bất kỳ ngôn ngữ lập trình nào, dù là kiểu động hay kiểu tĩnh, kiểu mạnh hay kiểu yếu,… JavaScript cũng không ngoại lệ. Bạn đã bao giờ cần kiểm tra kiểu dữ liệu trong JavaScript chưa? Bạn đã bao giờ phải nhức đầu vì kiểu dữ liệu trong JavaScript khi không thể biết nó đang là cái gì. Trong bài viết này, chúng ta sẽ xem đi qua một số cách kiểm tra kiểu dữ liệu trong JavaScript. Bắt đầu nào!
Kiểu dữ liệu trong JavaScript
Trước tiên, hãy thảo luận ngắn gọn về khái niệm kiểu dữ liệu, hoặc ít nhất là ý nghĩa kiểu dữ liệu trong bài viết này và trong ngữ cảnh là ngôn ngữ JavaScript. Mặc dù khái niệm này về mặt lịch sử là một trong những chủ đề được tranh luận nhiều nhất trong lập trình, nhưng cách giải thích về kiểu dữ liệu ở đây là cực kỳ thực tế và phi học thuật.
Trong bài viết này, những thứ như Object, Array, Function, Number, NaN và những thứ khác sẽ được coi là các kiểu riêng biệt.
String
Các chuỗi là các giá trị nguyên thủy và việc kiểm tra chúng thực sự đơn giản. Bạn chỉ cần sử dụng toán tử typeof:
function printMessage(message) {
if (typeof message !== 'string') {
return;
}
// ...
}
Code language: JavaScript (javascript)
Thật đơn giản phải không? Tuy nhiên, có một trường hợp đặc biệt mà biểu thức này sẽ trả về là false: nếu chuỗi được khởi tạo bằng cách sử dụng trực tiếp hàm tạo chuỗi.
const message = new String('This will not work');
console.log(typeof message); //=> "object"
Code language: JavaScript (javascript)
Tất nhiên, việc này chẳng phổ biến và không bao giờ được khuyến khích. Nếu bạn cần tạo một chuỗi, hãy luôn ưu tiên cú pháp theo nghĩa đen. Tuy nhiên, nếu vì lý do nào đó, bạn cần đảm bảo rằng một giá trị đã cho là một chuỗi, có thể là nguyên thủy hoặc một đối tượng, bạn có thể kết hợp toán tử instanceof và typeof:
const isString = value => typeof value === 'string' || value instanceof String;
const message1 = 'This is a string primitive';
const message2 = new String('This is a string object');
console.log(isString(message1)); //=> true
console.log(isString(message2)); //=> true
Code language: JavaScript (javascript)
Null và undefined
Trong JavaScript, null và undefined thường bị nhầm lẫn với nhau. Nói một cách đơn giản, undefined là giá trị mặc định cho các biến chưa được khởi tạo và null luôn được đặt rõ ràng thành một biến.
Nếu bạn sử dụng toán tử typeof để kiểm tra cả hai, đây là những gì bạn nhận được:
console.log(typeof undefined); //=> "undefined"
console.log(typeof null); //=> "object"
Code language: JavaScript (javascript)
Chà, chúng ta đã nhận ‘undefined’ cho undefined. Điều đó có ý nghĩa. Tuy nhiên, JavaScript đã cho chúng ta “object” cho null. Đây không phải là do thiết kế, mà là một lỗi lâu rồi, có từ khi triển khai ngôn ngữ gốc. Lỗi này chưa bao giờ được sửa, vì một phần đáng kể của cơ sở mã JavaScript hiện tại (rất lớn) sẽ bị hỏng nếu typeof null đột nhiên thay đổi thành “null”.
Để kiểm tra null hoặc undefined, bạn chỉ có thể sử dụng toán tử bình đẳng nghiêm ngặt (===):
if(a === undefined) {}
if(a === null) {}
Code language: JavaScript (javascript)
Nếu bạn muốn kiểm tra xem một biến là null hay undefined, tất nhiên, bạn có thể kết hợp hai cách ở trên (a === undefined || a === null). Tuy nhiên, có một cách ngắn gọn hơn để làm như vậy, bằng cách sử dụng toán tử bình đẳng trừu tượng (==):
if (a == null) {}
Code language: JavaScript (javascript)
Biểu thức trên trả về là true chỉ khi a là null hoặc undefined. Một số người cố gắng tìm ra logic đằng sau hành vi này, lập luận rằng vì null và undefined là các giá trị sai, cả hai sẽ bằng nhau nếu được so sánh với toán tử bình đẳng trừu tượng. Điều này không có ý nghĩa, vì các giá trị sai khác như 0, “” (chuỗi trống) hoặc NaN, khi được so sánh với null hoặc không xác định, sẽ không dẫn đến bằng nhau.
console.log(null == ''); //=> false
console.log(null == NaN); //=> false
console.log(null == 0); //=> false
console.log(undefined == ''); //=> false
console.log(undefined == NaN); //=> false
console.log(undefined == 0); //=> false
Code language: JavaScript (javascript)
Thực tế là không có logic thực sự đằng sau điều này. Nó chỉ xảy ra bởi vì đặc tả ECMAScript nói như vậy (chỉ cần kiểm tra phần thứ hai và thứ ba của phần 11.9.3).
Array
Mảng là các đối tượng. Nếu bạn cố gắng sử dụng toán tử typeof đối với một mảng, kết quả là bạn sẽ nhận được “object”. Cách đúng để kiểm tra xem một biến có phải là một mảng hay không là sử dụng phương thức tĩnh Array.isArray() (IE9+):
Array.isArray(someVar);
Array.isArray([11, 22, 33]); //=> true
Array.isArray({}); //=> false
Code language: JavaScript (javascript)
Function
Hàm cũng là đối tượng. Tuy nhiên, khác với mảng, có thể kiểm tra các hàm bằng cách sử dụng toán tử typeof:
const f = function() {};
console.log(typeof f === 'function'); //=> true
Code language: JavaScript (javascript)
Object
Để kiểm tra xem một biến có phải là một đối tượng hay không, bạn có thể so sánh nó với đối tượng tương đương của nó. Nếu cả hai đều bằng nhau, điều đó có nghĩa là biến của bạn đã là một đối tượng. Trả về true cho bất kỳ loại đối tượng nào, bao gồm các mảng và hàm:
const a = {};
console.log(a === Object(a)); //=> true
const b = [];
console.log(b === Object(b)); //=> true
const c = function() {};
console.log(c === Object(c)); //=> true
const d = 123;
console.log(d === Object(d)); //=> false
const e = '';
console.log(e === Object(e)); //=> false
Code language: JavaScript (javascript)
Number và Boolean
Number và Boolean thực sự tương tự như Strings về cách kiểm tra. Hầu hết thời gian, bạn chỉ cần sử dụng typeof:
if (typeof a === 'string') {}
if (typeof b === 'boolean') {}
Code language: JavaScript (javascript)
Tuy nhiên, trong trường hợp bạn cần kiểm tra các đối tượng wrapper và các giá trị nguyên thủy, bạn có thể kết hợp typeof và instanceof:
const isBoolean = value => typeof value === 'boolean' || value instanceof Boolean;
const isNumber = value => typeof value === 'number' || value instanceof Number;
Code language: JavaScript (javascript)
NaN, Infinity và -Infinity
Nếu bạn sử dụng typeof với NaN (từ viết tắt của Not a Number), Infinity (số dương vô cùng của JavaScript) hoặc -Infinity (số âm vô cùng của JavaScript), thì kết quả là bạn sẽ nhận được ‘number’. Nhìn ó vẻ kỳ lạ, nhưng theo đặc điểm kỹ thuật của ECMAScript, kiểu Number bao gồm các giá trị số đặc biệt này. Để kiểm tra các giá trị này, bạn có thể sử dụng các hàm cụ thể sau:
if (isNaN(value)) {} // Checks if value is NaN
if (!isFinite(value)) {} // Checks if value is Infinity or -Infinity
Code language: JavaScript (javascript)
Hoặc, nếu bạn cần kiểm tra xem một biến cụ thể là dương hay âm vô cùng:
if (value === Number.POSITIVE_INFINITY) {} // Checks if value is Infinity
if (value === Number.NEGATIVE_INFINITY) {} // Checks if value is -Infinity
Code language: JavaScript (javascript)
Kết luận
- Trong JavaScript, các kiểu dữ liệu khác nhau yêu cầu các cách kiểm tra kiểu dữ liệu khác nhau
- Có thể dễ dàng kiểm tra các String, Number, Boolean và Function bằng cách sử dụng toán tử typeof
- Đối với null và undefined, bạn có thể sử dụng một phép so sánh đơn giản với toán tử bình đẳng nghiêm ngặt
- Mảng có thể được nhận dạng bằng cách sử dụng phương thức tĩnh Array.isArray
- Bạn có thể kiểm tra các đối tượng thuộc bất kỳ loại nào bằng cách so sánh chúng với giá trị wrapper của chúng
- Với trường hợp đặc biệt như isNaN và isFinite, chúng sẽ kiểm tra các giá trị số như NaN, Infinity và -Infinity
Cảm ơn bạn đã theo dõi bài viết!
Các bạn có thể tham khảo các bài viết hay về JavaScript tại đây.
Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.
TỔNG HỢP TÀI LIỆU HỌC LẬP TRÌNH CƠ BẢN CHO NGƯỜI MỚI BẮT ĐẦU
KHOÁ HỌC BOOTCAMP JAVA/PHP/.NET TRỞ THÀNH LẬP TRÌNH VIÊN TRONG 5-6 THÁNG