Thực ra đây không phải là câu hỏi khó, “Làm thế nào để chuyển một giá trị sang kiểu boolean để so sánh hoặc kiểm tra?”. Có hai cách kinh điển hay được giới giang hồ sử dụng đó là !!
double “cưỡng chế” :))) và dùng object Boolean
.
Các bạn copy đoạn code này chạy thử xem.
1 | const value = ''; // thử với giá trị khác xem |
9 giá trị convert về boolean luôn cho false
Các bạn ghi nhớ có 9 cái giá trị khi convert về boolean sẽ luôn cho false
(trên MDN web docs thì bảo là 8, mình thì thích 9), đó là:
false
undefined
null
NaN
0
-0
+0
0n
''
- chuỗi rỗng
Thực ra +0
với 0
cũng như nhau :D. Ngoài mấy cái đó ra sẽ cho về true
cả. Thử xem nhé.
1 | console.info(!!false); |
Ngoài các cái trên thì bạn thử kiểu gì nó cũng cho về true.
1 | console.info(!!'false'); |
Bởi vậy hãy lưu ý khi dùng để check điều kiện hoặc xài với toán tử logic ||
và &&
nhé. Bởi vì nhiều cái lỗi xảy ra như vậy nè, nhưng lại không biết là do đâu.
1 | // giả dụ value sẽ được set bằng mảng rỗng |
Hoặc như vầy
1 | let value = 'false'; |
Cái false trong ngoặc đơn kia thực chất là chuỗi ('false'
) mà chuỗi có giá trị nghĩa là chuỗi không rỗng, không rỗng thì méo nào false được, đúng không nào. Rứa mà lúc code JS mình lại nhầm đấy :))). Mất nguyên tiếng đồng hồ ngồi mò, vler.
Dấu !! nghĩa là gì
Theo như bài viết cách đây không lâu của mình Caret, carrot đọc là cà rét hay cà rốt 🥕 thì mình thích định nghĩa vài thứ. Nên mình sẽ gọi dấu !! là double cưỡng chế :v. Giỡn chớ thực chất nó hoạt động theo cỡ chế ép kiểu và phủ định thôi.
Cùng phân tích quá trình chuyển “cưỡng chế” !!''
nhé:
Đặt dấu !
trước giá trị, nó sẽ thực hiện hai bước “chuyển đổi nhỏ”
- Step 1: Đầu tiên chuyển nó về boolean (ép kiểu về), nghĩa là chuyển
''
về boolean,''
chuyển về boolean là false - Step 2: Bước hai sẽ phủ định lại cái kết quả ở step 1, chuyển thành
true
.
Dấu !
tiếp theo sẽ phủ định là kết quả ở trên, nghĩa là ở trên được true
thì sẽ phủ định thành false
.
1 | console.log(!''); // true |
Vậy là được kết quả như ý, ''
ép xong, lại phủ bỏ, à nhầm, phủ định thì thành false
.
Convert string number kết hợp với +
và ~~
Giả dụ bạn biết chắc chỗ đó trả về số, nhưng số này có thể là number
hoặc string number
, bạn muốn check khác 0 nữa thì làm thế nào, không thế dùng !!'0'
được bởi vì nó trả về true. Thì lúc này xài kết hợp ngay +
hoặc ~~
.
1 | const value = '0'; // or 'asd', '10', 'NaN', 'Infinity', '0.2' |
Dùng dấu +
và ~~
ở đây là với mục đích là ép kểu về int, sau đó !!
sẽ làm phần còn lại.
Với +
sẽ ép về kiểu Number
.
1 | console.info(+"1"); // 1 |
Với ~~
là double toán tử bitwise NOT, thường thay thế Math.floor()
, nhưng hai chúng nó khác nhau nhé.
Công thức như sau -(-(N + 1))
1 | console.info(~"1"); // -2 |
Tóm lại
Có cụm từ chuyên ngành truthy
và falsy
các bạn đọc thêm cho vui. Và trên đó là hai cách kinh điển trên bạn xài cái nào cũng được cả, nhưng phải đồng nhất nhé. Have fun.