Cách kiểm tra xem một giá trị không phải là chuỗi rỗng và không phải chuỗi trống trong JS


82

Có bất kỳ kiểm tra nào nếu một giá trị không phải là chuỗi rỗng và không phải là chuỗi trống trong Javascript không? Tôi đang sử dụng cái sau:

var data; //get its value from db 
if(data != null && data != '') {
   // do something
}

Nhưng tôi đang tự hỏi nếu có một giải pháp khác tốt hơn. Cảm ơn.


6
if(data)sẽ là đủ vì nó nói ở đây
CIsForCookies

1
Tôi đã thử điều này nhưng trong một trong hai trường hợp, nó không hoạt động.
ivva

cảm ơn mọi người, tôi sẽ thử cái này. Tôi hy vọng nó sẽ làm việc.
ivva

undefinedlà một trong những trường hợp đặc biệt, theo logic của bạn, sẽ kích hoạt // do somethingnhưng sẽ không.
Salman A

Câu trả lời:


157

Nếu bạn thực sự muốn xác nhận rằng một biến không phải là null và không phải là một chuỗi rỗng, bạn sẽ viết:

if(data !== null && data !== '') {
   // do something
}

Lưu ý rằng tôi đã thay đổi mã của bạn để kiểm tra bình đẳng kiểu ( !==| ===).

Tuy nhiên, nếu bạn chỉ muốn đảm bảo rằng mã sẽ chỉ chạy cho các giá trị "hợp lý", thì bạn có thể, như những người khác đã nêu, hãy viết:

if (data) {
  // do something
}

Vì, trong javascript, cả giá trị null và chuỗi rỗng, đều bằng false (tức là null == false).

Sự khác biệt giữa 2 phần mã đó là, đối với phần đầu tiên, mọi giá trị không cụ thể là null hoặc một chuỗi rỗng, sẽ nhập if. Nhưng, một giây, từng giá trị thực-ish sẽ bước vào if: false, 0, null, undefinedvà chuỗi rỗng, thì không.


2
0 là một giá trị hợp lý trong nhiều trường hợp
Aequitas

3
Đó là lý do từ hợp lý được bọc với dấu ngoặc kép :)
Gershon Papi

@Adam Nếu không, bạn có thể để trống và sử dụng một cái khác. Điều đó sẽ luôn đảo ngược như mong đợi.
The Nate

Đây không phải là dữ liệu! == null || data! == '' thay vì sử dụng &&?
Imdad

@ Imdad OP yêu cầu kiểm tra xem giá trị có phải là null hay không VÀ không phải là chuỗi trống, vì vậy không.
Gershon Papi

18

Cả hai nullvà một chuỗi rỗng đều là các giá trị sai trong JS. Vì thế,

if (data) { ... }

là hoàn toàn đủ.

Tuy nhiên, một lưu ý ở bên: Tôi sẽ tránh có một biến trong mã của mình có thể hiển thị ở các kiểu khác nhau. Nếu dữ liệu cuối cùng sẽ là một chuỗi, thì ban đầu tôi sẽ xác định biến của mình bằng một chuỗi rỗng, vì vậy bạn có thể làm điều này:

if (data !== '') { ... }

mà không có null (hoặc bất kỳ thứ kỳ lạ nào như data = "0") cản trở.


11

Thay vì sử dụng

if(data !== null && data !== ''  && data!==undefined) {

// do something
}

Bạn có thể sử dụng mã đơn giản dưới đây

if(Boolean(value)){ 
// do something 
}
  • Các giá trị trực quan là "trống", như 0, một chuỗi rỗng, null, không xác định và NaN, trở thành sai
  • Các giá trị khác trở thành sự thật

6

Tôi thường kiểm tra giá trị trung thực và cả các khoảng trống trong chuỗi:

if(!(!data || data.trim().length === 0)) {
  // do something here
}

Nếu bạn có một chuỗi bao gồm một hoặc nhiều khoảng trống, nó sẽ đánh giá là true.


4
if (data?.trim().length > 0) {
   //use data
}

các ?. nhà khai thác chaining tùy chọn sẽ ngắn mạch và trở lại undefinednếu dữ liệu là nullish( nullhoặc undefined) mà sẽ đánh giá false trong ifbiểu thức.


Tôi thực sự không biết về nhà điều hành này .. tiếc là một số trình duyệt Android không hỗ trợ nó, nhưng nếu không thì hỗ trợ khá tốt!
brandonmack

2

Cả null và rỗng đều có thể được xác nhận như sau:

<script>
function getName(){
    var myname = document.getElementById("Name").value;
    if(myname != '' && myname != null){
        alert("My name is "+myname);
    }else{
        alert("Please Enter Your Name");
    }       
}


1

thử nó ----------

function myFun(){
var inputVal=document.getElementById("inputId").value;
if(inputVal){
document.getElementById("result").innerHTML="<span style='color:green'>The value is "+inputVal+'</span>';
}
else{
document.getElementById("result").innerHTML="<span style='color:red'>Something error happen! the input May be empty.</span>";
}
}
<input type="text" id="inputId">
<input type="button" onclick="myFun()" value="View Result">
<h1 id="result"></h1>


1

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ố ab , 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 đó.

0

Tôi đã quá chán với việc kiểm tra cụ thể các chuỗi rỗng và rỗng, đến mức bây giờ tôi thường chỉ viết và gọi một hàm nhỏ để làm việc đó cho mình.

/**
 * Test if the given value equals null or the empty string.
 * 
 * @param {string} value
**/
const isEmpty = (value) => value === null || value === '';

// Test:
isEmpty('');        // true
isEmpty(null);      // true
isEmpty(1);         // false
isEmpty(0);         // false
isEmpty(undefined); // false

0

function validateAttrs(arg1, arg2, arg3,arg4){
    var args = Object.values(arguments);
    return (args.filter(x=> x===null || !x)).length<=0
}
console.log(validateAttrs('1',2, 3, 4));
console.log(validateAttrs('1',2, 3, null));
console.log(validateAttrs('1',undefined, 3, 4));
console.log(validateAttrs('1',2, '', 4));
console.log(validateAttrs('1',2, 3, null));

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.