Những nhầm lẫn có thể gặp về kiểu dữ liệu khi làm việc với javascript

Tram Ho

1. Kiểu dữ liệu của NaN

NaN hay not a number. Nghe thì có vẻ đây không phải là 1 số thì dĩ nhiễn kiểu dữ liệu của nó sẽ không là number ?
Tuy nhiên khi mở trình duyệt và thực hiện console.log(type of NaN) thì lại nhận được output là number.

Thực tế thì NaN là 1 giá trị đặc biệt trong kiểu Number cùng với (Infinity, -Infinity) nữa. NaN sẽ được trả về khi thực hiện một phép tính có kết quả là giá trị số không xác định chẳng hạn

  • Chia 0 cho 0 (Chia một số khác 0 cho không thì ra Infinity)
  • Chia Infinity cho Infinity
  • Có một toán hạng trong phép tính là NaN
  • Convert từ string sang số một giá trị không phải là số.

Ngoài ra NaN cũng không có thứ tự tức là NaN không thể nhỏ hơn, bằng hay lớn hơn bất kỳ thứ gì.

2. Output của 99999999999999999999 (20 chữ số)

Bạn hy vong output của số trên sẽ bằng bao nhiêu ?

Lý giải cho việc này là bởi Javascript chỉ có duy nhất kiểu dữ liệu Number đại diện cho số. Và nó được triển khai dưới dạng số dấu phẩy động chính xác kép của IEEE 754. Điều đó có nghĩa là sẽ không có kiểu dữ liệu số nguyên Integer thực sự trong Javascript. Đây cũng không phải vấn đề quá lớn trong TH bạn muốn làm việc chỉ với số nguyên lớn trong Javascript bạn có thể sử dụng kiểu dữ liệu BigInt.

3. 0.1 + 0.2 = 0.3 ?

Lỗi này không chỉ xảy ra với riêng Javascript mà xảy ra

Bạn còn nhớ về số thập phân vô hạn và hữu hạn chứ. Ở hệ thập phân (hệ cơ số 10 mà con người tiếp xúc tốt nhất) nó chỉ có thể biểu thị các phân số sử dụng hệ số nguyên tố của 10 (Các thừa số nguyên tố của 10 là 2 và 5). Vì vậy, 1/2 (0.5), 1/4 (0.25), 1/5, 1/8 và 1/10 đều có thể được biểu thị rõ ràng vì tất cả các mẫu số đều sử dụng các thừa số nguyên tố là 10. Ngược lại, 1 / 3 (0.33333333….), 1/6 (0.1666666…) và 1/7 đều là các số thập phân vô hạn vì mẫu số của chúng sử dụng hệ số nguyên tố là 3 hoặc 7. Bạn có thể thắc mắc 0.1 và 0.2 có thể biểu thị rõ ràng là số thập phân hữu hạn mà ? Tuy nhiên vấn đề ở chỗ máy tính sử dụng cơ số 2 thay vì cơ số 10 giống như con người mà ở đó thừa số nguyên tố duy nhất của 2 là chính nó vậy nên các phân số 1/2, 1/4, 1/8 sẽ được biểu thị rõ ràng trong máy tính tuy nhiên các số 1/5 (0.1) và 1/10 (0.2) tuy được biểu diễn rõ ràng ở hệ cơ số 10 nhưng máy tính hoạt động ở hệ cơ số 2 sẽ biểu thị không thể chính xác được.

4. Math.max() và Math.min()

Thư viện Math là thư viện được sử dụng khá nhiều trong javascript. Tuy nhiên có 1 lưu ý nhỏ đối với 2 hàm này đó là trong TH bạn không truyền tham số cho nó thì nó sẽ trả về các giá trị mặc định như sau:

5 Javascript thường tự động convert ngầm kiểu dữ liệu trong các biểu thức

JavaScript là ngôn ngữ có kiểu dữ liệu lỏng lẻo và hầu hết các các biểu thức thường tự động chuyển đổi ngầm (Implicit Conversion) một giá trị thành đúng loại phù hợp để nó có thể thực hiện được. Tuy nhiên cũng có trường hợp kết quả của biểu thức là điều ta không mong muốn. Vậy nên hãy chú ý tới Implicit Conversion trong Javascript

Các Implicit Conversion thường gặp trong Javascript khi biểu thức đó là convert về string (toString) hoặc number(toNumber). Dưới đây là một số case bạn có thể hay bắt gặp đó là

  • [] + []
    Do mảng không phải là kiểu dữ liệu nguyên thủy (primitive) nên hàm toString sẽ được gọi và kết quả của mảng rỗng sẽ là ký tự rỗng. Do đó kết quả của phép cộng 2 mảng rỗng là phép cộng 2 ký tự string rỗng ==> ký tự rỗng

  • [] + {}
    Cái này cũng giống phần trên tuy nhiền hàm toString của {} sẽ trả về ‘[object Object]’

  • “1” + 0
    Phép cộng ở đây cũng là phép nối chuỗi. Do vậy Javascript ưu tiên xử lý string và convert số 0 về dạn String

  • “10” – “0”
    Phép trừ không có ý nghĩa trong Xâu do vậy Javascript convert cả ký tự “10” và “0” về dạng số

Tham khảo:

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo