Kiểm tra biến tồn tại 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!

>> Xem ngay Tài liệu Java Core giúp bạn “Nâng Cấp” kỹ năng lập trình

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.

Kiểm tra biến tồn tại trong javascript
Kiểm tra biến tồn tại trong javascript

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).

Kiểm tra biến tồn tại trong javascript
Kiểm tra biến tồn tại trong javascript

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:

const message = new String('This will not work'); console.log(typeof message); //=> "object"

Code language: JavaScript (javascript)
0

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 message = new String('This will not work'); console.log(typeof message); //=> "object"

Code language: JavaScript (javascript)
1

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: