Khi chúng tôi viết mã trống về bản chất có thể có nghĩa là bất kỳ điều nào sau đây với các trường hợp;
- 0 như trong giá trị số
- 0,0 như trong giá trị float
- '0' như trong giá trị chuỗi
- '0.0' như trong giá trị chuỗi
- null như trong giá trị Null, tùy theo cơ hội nó cũng có thể nắm bắt không xác định hoặc có thể không
- không xác định như trong giá trị không xác định
- false như trong giá trị true true, theo cơ hội 0 cũng như true nhưng điều gì xảy ra nếu chúng ta muốn bắt false như nó vốn có
- '' giá trị sting trống không có khoảng trắng hoặc tab
- '' chuỗi chỉ có khoảng trắng hoặc tab
Trong tình huống thực tế như OP đã nêu, chúng tôi có thể muốn kiểm tra tất cả hoặc đôi khi chúng tôi chỉ muốn kiểm tra trong một số điều kiện hạn chế.
Nói chung if(!a){return true;}hầu hết phục vụ mục đích của nó, tuy nhiên nó sẽ không bao gồm các nhóm điều kiện rộng hơn.
Một bản hack khác đã được thực hiện là return (!value || value == undefined || value == "" || value.length == 0);
Nhưng nếu chúng ta cần kiểm soát toàn bộ quá trình thì sao?
Không có giải pháp whiplash đơn giản nào trong JavaScript lõi nguyên bản mà nó phải được áp dụng. Xem xét chúng tôi bỏ hỗ trợ cho IE11 cũ (thành thật mà nói ngay cả các cửa sổ cũng vậy) giải pháp dưới đây được sinh ra từ sự thất vọng hoạt động trong tất cả các trình duyệt hiện đại;
function empty (a,b=[])
{if(!Array.isArray(b)) return;
var conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(conditions.includes(a)|| (typeof a === 'string' && conditions.includes(a.toString().trim())))
{return true;};
return false;};`
Logic đằng sau lời giải là hàm có hai tham số a và b , a là giá trị chúng ta cần kiểm tra, b là một mảng với các điều kiện đã đặt chúng ta cần loại trừ khỏi các điều kiện xác định trước như đã liệt kê ở trên. Giá trị mặc định của b được đặt thành một mảng trống [].
Lần chạy đầu tiên của hàm là kiểm tra xem b có phải là một mảng hay không, nếu không thì hãy sớm thoát khỏi hàm.
bước tiếp theo là tính toán sự khác biệt của mảng từ [null,'0','0.0',false,undefined,'']và từ mảng b. nếu b là một mảng trống các điều kiện được xác định trước sẽ không thay đổi, nó sẽ loại bỏ các giá trị phù hợp.
điều kiện = [tập hợp được xác định trước] - [được loại trừ tập hợp]
chức năng bộ lọc thực hiện chính xác việc sử dụng nó. Bây giờ chúng ta có các điều kiện trong tập hợp mảng, tất cả những gì chúng ta cần làm là kiểm tra xem giá trị có nằm trong mảng điều kiện hay không.
hàm bao gồm thực hiện chính xác mà không cần phải viết các vòng lặp khó chịu của riêng bạn, hãy để công cụ JS thực hiện công việc nặng nhọc.
Gotcha
nếu chúng ta chuyển đổi một thành chuỗi để so sánh thì 0 và 0.0 sẽ chạy tốt tuy nhiên Null và Undefined sẽ thông qua lỗi chặn toàn bộ tập lệnh. Chúng tôi cần giải pháp trường hợp cạnh. Dưới đây đơn giản || bao gồm các trường hợp cạnh nếu điều kiện đầu tiên không được thỏa mãn. Chạy kiểm tra sớm khác bao gồm thoát sớm nếu không được đáp ứng.
if(conditions.includes(a)|| (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim())))
Hàm trim () sẽ bao gồm các khoảng trắng rộng hơn và các tab chỉ có giá trị và sẽ chỉ phát huy tác dụng trong trường hợp cạnh.
Sân chơi
function empty (a,b=[]){
if(!Array.isArray(b)) return;
conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(conditions.includes(a)||
(['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
return true;
}
return false;
}
console.log('1 '+empty());
console.log('2 '+empty(''));
console.log('3 '+empty(' '));
console.log('4 '+empty(0));
console.log('5 '+empty('0'));
console.log('6 '+empty(0.0));
console.log('7 '+empty('0.0'));
console.log('8 '+empty(false));
console.log('9 '+empty(null));
console.log('10 '+empty(null,[null]));
console.log('11 dont check 0 as number '+empty(0,['0']));
console.log('12 dont check 0 as string '+empty('0',['0']));
console.log('13 as number for false as value'+empty(false,[false]));
Hãy làm cho nó phức tạp - điều gì sẽ xảy ra nếu giá trị của chúng ta để so sánh là mảng của chính nó và có thể được lồng sâu như vậy. điều gì sẽ xảy ra nếu chúng ta kiểm tra xem có bất kỳ giá trị nào trong mảng trống không, nó có thể là một trường hợp kinh doanh cạnh.
function empty (a,b=[]){
if(!Array.isArray(b)) return;
conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(Array.isArray(a) && a.length > 0){
for (i = 0; i < a.length; i++) { if (empty(a[i],b))return true;}
}
if(conditions.includes(a)||
(['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
return true;
}
return false;
}
console.log('checking for all values '+empty([1,[0]]));
console.log('excluding for 0 from condition '+empty([1,[0]], ['0']));
nó đơn giản và chức năng trường hợp sử dụng rộng hơn mà tôi đã áp dụng trong khuôn khổ của mình;
- Cung cấp quyền kiểm soát đối với định nghĩa chính xác của trống trong một tình huống nhất định
- Cung cấp quyền kiểm soát để xác định lại các điều kiện trống
- Có thể so sánh cho hầu hết mọi thứ từ chuỗi, số, float, true, null, undefined và mảng sâu
- Giải pháp được rút ra là lưu ý đến khả năng phục hồi và tính linh hoạt. Tất cả các câu trả lời khác phù hợp trong trường hợp nếu một hoặc hai trường hợp đơn giản cần được giải quyết. Tuy nhiên, luôn có trường hợp định nghĩa về các thay đổi trống trong khi mã hóa các đoạn mã ở trên làm cho công việc trở nên hoàn hảo trong trường hợp đó.
if(data)sẽ là đủ vì nó nói ở đây