Làm cách nào tôi có thể kiểm tra chuỗi rỗng / không xác định / null trong JavaScript?


2854

Tôi đã thấy câu hỏi này , nhưng tôi không thấy một ví dụ cụ thể về JavaScript. Có một đơn giản string.Emptycó sẵn trong JavaScript hay chỉ là một trường hợp kiểm tra ""?


2
chỉ FYI, tôi nghĩ rằng các API hữu ích nhất cho lớp String nằm ở bộ công cụ Mozillajavascript . [elated.com] ( elated.com/articles/usiness-with-strings ) có hướng dẫn về tất cả các thuộc tính, phương thức của String, ... Xin lưu ý: liên kết Mozilla đã được cập nhật lên developer.mozilla.org/en/ JavaScript / Reference / Global_Objects / Hoài
Gene T


Nó sẽ giúp rất nhiều nếu yêu cầu được chỉ định rõ ràng. Đối với những giá trị nào isEmpty trả về đúng? Kiểm tra "" cho biết nó chỉ nên trả về true nếu giá trị là Kiểu chuỗi và độ dài 0. Nhiều câu trả lời ở đây cho rằng nó cũng sẽ trả về true cho một số hoặc tất cả các giá trị falsey.
RobG

Câu trả lời:


3571

Nếu bạn chỉ muốn kiểm tra xem có giá trị nào không, bạn có thể làm

if (strValue) {
    //do something
}

Nếu bạn cần phải kiểm tra đặc biệt cho một chuỗi rỗng trên null, tôi sẽ nghĩ kiểm tra chống lại ""là đặt cược tốt nhất của bạn, sử dụng các ===nhà điều hành (để bạn biết rằng nó là, trên thực tế, một chuỗi bạn so sánh chống lại).

if (strValue === "") {
    //...
}

174
Việc kiểm tra thuộc tính độ dài thực sự có thể nhanh hơn so với kiểm tra chuỗi dựa trên "", bởi vì trình thông dịch sẽ không phải tạo một đối tượng Chuỗi từ chuỗi ký tự.
Vincent Robert

26
@Vincent thực hiện một số hồ sơ ngây thơ trong các công cụ dành cho nhà phát triển Chrome, thử nghiệm === ''so với .lengthkhông cho thấy sự cải thiện rõ rệt nào (và .lengthchỉ sử dụng hoạt động nếu bạn có thể cho rằng mình có một chuỗi)
bdukes

26
@bdukes khi bạn bắt đầu quan tâm đến loại tối ưu hóa vi mô đó, tôi không nghĩ Chrome là trình duyệt mà bạn gặp phải hầu hết các vấn đề về hiệu suất của mình ...
Vincent Robert

15
Chỉ cần lưu ý, nếu định nghĩa của bạn về "chuỗi rỗng" bao gồm khoảng trắng, thì giải pháp này không phù hợp. Một chuỗi từ 1 hoặc nhiều khoảng trắng trả về true ở trên. Nếu bạn đang sử dụng JQuery bạn chỉ có thể sử dụng này: if ($ .trim (ref) .length === 0) - như mỗi câu trả lời này cho một câu hỏi tương tự: stackoverflow.com/questions/2031085/...
CodeClimber

115
Như mong đợi .length > 0là thực sự nhanh hơn nhiều so với so với một chuỗi ký tự! Hãy xem jsPerf
Chad

1128

Để kiểm tra xem một chuỗi có trống không, null hoặc không xác định tôi sử dụng:

function isEmpty(str) {
    return (!str || 0 === str.length);
}

Để kiểm tra xem một chuỗi có trống, null hoặc không xác định tôi sử dụng:

function isBlank(str) {
    return (!str || /^\s*$/.test(str));
}

Để kiểm tra xem một chuỗi có trống hay chỉ chứa khoảng trắng:

String.prototype.isEmpty = function() {
    return (this.length === 0 || !this.trim());
};

21
tại sao 0 === str.length thay vì str.length === 0?
Vincent

66
Điều kiện @Vincent thường được viết như thế này if (variable == constant value)và nếu bạn quên '=' thì bạn sẽ gán giá trị không đổi cho biến thay vì kiểm tra. Mã vẫn sẽ hoạt động như bạn có thể gán biến trong if. Vì vậy, một cách an toàn hơn để viết điều kiện này là đảo ngược giá trị không đổi và biến. Bằng cách này khi bạn kiểm tra mã của mình, bạn sẽ thấy lỗi (phía tay trái không hợp lệ trong bài tập). Bạn cũng có thể sử dụng một cái gì đó như JSHint để không cho phép gán trong các điều kiện và được cảnh báo khi bạn viết.
florian

2
xấu hổ mà /^\s*$/.test(str)không thực sự có thể đọc được - có thể loại bỏ khoảng trắng bằng cách sử dụng mã đơn giản hơn hoặc regex sẽ tốt hơn? xem stackoverflow.com/questions/6623231/ và cả stackoverflow.com/questions/10800355/ Kẻ
Adrien Be

6
/ ^ \ s*$/.test(str) có thể được thay thế bằng str.trim (). length === 0
Schadenfreude

21
@Vincent này còn được gọi là "Điều kiện Yoda", như thế if blue is the sky. Xem dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
AZ.

316

Tất cả các câu trả lời trước là tốt, nhưng điều này sẽ còn tốt hơn. Sử dụng toán tử !!( không phải ).

if(!!str){
    // Some code here
}

Hoặc sử dụng kiểu đúc:

if(Boolean(str)){
    // Code here
}

Cả hai đều làm cùng một chức năng. Kiểu chữ biến thành Boolean, trong đó strlà một biến.
Nó trả về falsecho null,undefined,0,000,"",false.
Nó trả về truechuỗi "0" và khoảng trắng "".


61
Tại sao điều này "thậm chí tốt hơn"?
Mene

33
Có sự khác biệt nào giữa hành vi của if(str)if(!!str)không?
Peter Olson

6
@PeterOlson nếu bạn đang cố lưu một biến dưới dạng boolean kiểm tra nhiều chuỗi cho nội dung thì bạn sẽ muốn làm điều này .. còn gọi là var any = (!!str1 && !!str2 && !!str3)xử lý nếu có một số trong đó
John Ruddell 10/03/2015

23
Đây là giải pháp tôi luôn sử dụng. !!str.trim()để đảm bảo chuỗi không chỉ được tạo từ khoảng trắng.
Dario Oruptino

5
Không giống như một bản hack, Boolean(str)dễ đọc hơn và ít "wtfish" hơn.
shinzou

105

Điều gần nhất bạn có thể nhận được str.Empty(với điều kiện tiên quyết là str là Chuỗi) là:

if (!str.length) { ...

9
Sẽ không ném một ngoại lệ là str là null?
Pic Mickael

3
@PicMickael Vâng! Vì vậy, sẽ str.Empty.
Ates Goral

99

Nếu bạn cần đảm bảo rằng chuỗi không chỉ là một loạt các khoảng trống (tôi giả sử đây là để xác thực mẫu), bạn cần phải thay thế trên các khoảng trắng.

if(str.replace(/\s/g,"") == ""){
}

8
Nhưng thực hiện công việc nếu những gì bạn thực sự muốn kiểm tra là một chuỗi có nội dung không gian. Có một cách ít tốn kém để kiểm tra điều này?
flash

4
Làm thế nào về tài sản chiều dài?
DriAn

27
Thay vì xóa tất cả các khoảng trắng, tại sao không kiểm tra xem có không phải không gian không? Có 2 ưu điểm là nó có thể giải cứu sớm nếu có một nhân vật không phải không gian và nó không trả về một chuỗi mới mà sau đó bạn kiểm tra lại. if(str.match(/\S/g)){}
mở

34
@Mark FYI, bạn sẽ không cần công cụ sửa đổi toàn cầu, vì trận đấu xuất hiện lần đầu tiên của một nhân vật không phải không gian sẽ có nghĩa là chuỗi không trống:str.match(/\S/)
neezer

1
tại sao nó đắt Nếu thực sự là vậy thì tại sao jQuery lại sử dụng phương thức này? Bạn có thể tìm thấy điều này trong nguồn của jQueryvar trimLeft = /^\s+/, trimRight = /\s+$/;
Marecky

66

Tôi sử dụng:

function empty(e) {
  switch (e) {
    case "":
    case 0:
    case "0":
    case null:
    case false:
    case typeof(e) == "undefined":
      return true;
    default:
      return false;
  }
}

empty(null) // true
empty(0) // true
empty(7) // false
empty("") // true
empty((function() {
    return ""
})) // false

5
Giải pháp này là bất khả tri ngôn ngữ hơn. Tính năng JavaScript duy nhất mà nó dựa vào là typeof. Vì vậy, đây là một ví dụ điển hình về giải pháp bạn có thể sử dụng khi bạn không tin tưởng vào việc triển khai trong các trình duyệt khác nhau và không có thời gian để nắm bắt giải pháp tốt hơn. (IE, không có truy cập internet). Nó giống như một bằng chứng. Không phải là sạch nhất nhưng bạn có thể chắc chắn rằng nó sẽ hoạt động mà không biết quá nhiều về JavaScript.
Jeff Davis

2
Tôi sẽ đi xa hơn một chút và đóng đinh nó bằng toán tử === cho trường hợp không xác định. Nếu không, nó chỉ đơn giản là câu trả lời hoàn hảo.
xarlymg89

Các typeoftrong switchkhông làm việc cho tôi. Tôi đã thêm một if (typeof e == "undefined")bài kiểm tra và nó hoạt động. Tại sao?
Lucas

1
@Lika Bởi vì đây là một lỗi đánh máy hoặc giám sát. Sửa đổi của bạn là cách tiếp cận chính xác. (bản gốc đề cập đến ngữ cảnh của hàm trống, không phải tham số e, đây là chức năng cần kiểm tra)
beeThree

Chúng ta có thể sử dụng case undefined:thay vì case typeof(e) == "undefined":?
Boris J.

43

Bạn có thể sử dụng lodash : _.isEmpty (giá trị).

Nó bao gồm rất nhiều trường hợp như thế {}, '', null, undefinedvv

Nhưng nó luôn luôn trả truecho Numberloại Javascript kiểu dữ liệu nguyên thủy như _.isEmpty(10)hoặc _.isEmpty(Number.MAX_VALUE)cả lợi nhuận true.


_.isEmpty(" "); // => false
Erich

1
@Erich Vì " "không trống. _.isEmpty("");trả về đúng
Moshii

1
hoàn toàn đúng - tôi đã đề cập đến điều này bởi vì một vài câu trả lời khác ở đây ngụ ý xác thực mẫu và kiểm tra xem một chuỗi chỉ bao gồm khoảng trắng và chính hàm lodash này sẽ không giải quyết được vấn đề đó.
Erich

@Erich, bây giờ tôi đã có quan điểm của bạn, cảm ơn vì đã đề cập.
Moshii

36

Chức năng:

function is_empty(x)
{
    return (
        (typeof x == 'undefined')
                    ||
        (x == null)
                    ||
        (x == false)  //same as: !x
                    ||
        (x.length == 0)
                    ||
        (x == "")
                    ||
        (x.replace(/\s/g,"") == "")
                    ||
        (!/[^\s]/.test(x))
                    ||
        (/^\s*$/.test(x))
    );
}

PS: Trong JavaScript, không sử dụng ngắt dòng sau return;


1
Bất kỳ cơ hội bạn có thể giải thích những gì mỗi kiểm tra đang làm? :)
DanV

2
-1 Họ đang thử nghiệm cho những thứ khác nhau. Thật vô nghĩa khi đặt tất cả chúng vào một iftuyên bố.
Bennett McElwee

1
typeof MyVariable == 'không xác định' không phân biệt giữa một biến được khởi tạo với một giá trị không xác định và một biến không được khai báo trừ khi biến ban đầu được khai báo và khởi tạo thành null. Kiểm tra thuộc tính độ dài làm cho chuỗi nguyên thủy được bọc trong một đối tượng chuỗi.
Scott Marcus

35

Thử:

if (str && str.trim().length) {  
    //...
}

2
Là tài sản chiều dài cần thiết?
ếch mã hóa

str.trim().lengthsẽ làm nhanh hơn str.trim(), khoảng 1% theo kết quả thử nghiệm của riêng tôi.
devildelta

2
@devildelta - 1% của bạn là một lỗi trong bài kiểm tra của bạn.
Stephen M Irving

OP đang tìm cách kiểm tra chuỗi rỗng, không xác định hoặc null. Đây là thử nghiệm cho một chuỗi không phải là bất kỳ điều kiện nào. Anh ta cũng không nói gì về khoảng trắng. Bạn có thể kiểm tra các điều kiện của OP chỉ với điều này, miễn là bạn chắc chắn không có loại dữ liệu nào khác được lưu trữ trong biến: if (!str) { ... }
Stephen M Irving

34
var s; // undefined
var s = ""; // ""
s.length // 0

Không có gì đại diện cho một chuỗi rỗng trong JavaScript. Thực hiện kiểm tra đối với một trong hai length(nếu bạn biết rằng var sẽ luôn là một chuỗi) hoặc chống lại""


29

Tôi sẽ không lo lắng quá nhiều về phương pháp hiệu quả nhất . Sử dụng những gì rõ ràng nhất với ý định của bạn. Đối với tôi đó là thường xuyên strVar == "".

Theo nhận xét từ Constantin , nếu strVar có thể kết thúc bằng cách chứa giá trị số nguyên 0 thì đó thực sự sẽ là một trong những tình huống làm rõ ý định đó.


11
Ý kiến ​​tồi. Bạn sẽ thành sự thật nếu strVar vô tình được gán 0.
Constantin

5
Tôi đồng ý rằng làm cho ý định của bạn rõ ràng quan trọng hơn bất kỳ phương pháp tối ưu hóa vi mô nào mà các phương pháp khác có thể mang lại, nhưng sử dụng toán tử so sánh nghiêm ngặt === sẽ tốt hơn. Nó chỉ trả về true nếu strVarlà một chuỗi rỗng.
Mã vô dụng

Việc kiểm tra thất bại nếu không xác định. Vì vậy, nếu (str) hoạt động tốt hơn
Valentin Heinitz

3
@ValentinHeinitz nếu str được gán giá trị falsey là 0 hoặc "0", nếu (str) sẽ báo cáo sai sự thật. Cách tiếp cận tốt nhất là nếu (str === ""). Nó đơn giản và nó sẽ không bao giờ thất bại.
Scott Marcus


20

Rất nhiều câu trả lời, và rất nhiều khả năng khác nhau!

Không nghi ngờ gì để thực hiện nhanh chóng và đơn giản, người chiến thắng là: if (!str.length) {...}

Tuy nhiên, như nhiều ví dụ khác có sẵn. Phương pháp chức năng tốt nhất để thực hiện điều này, tôi muốn đề xuất:

function empty(str)
{
    if (typeof str == 'undefined' || !str || str.length === 0 || str === "" || !/[^\s]/.test(str) || /^\s*$/.test(str) || str.replace(/\s/g,"") === "")
    {
        return true;
    }
    else
    {
        return false;
    }
}

Một chút quá mức, tôi biết.


2
Kiểm tra không xác định sẽ cần phải được chuyển đến đầu tiên trong kiểm tra, hoặc các mục không xác định sẽ ném ngoại lệ cho các kiểm tra trước đó.
SvdSinner

Hoàn toàn đồng ý! MÙA ĐÔNG. Tôi sẽ chỉnh sửa câu trả lời trên của tôi!
tfont

str.length === 0trả về true cho bất kỳ hàm nào không có tham số chính thức.
RobG

20

Bạn cũng có thể đi với các biểu thức thông thường:

if((/^\s*$/).test(str)) { }

Kiểm tra các chuỗi trống hoặc chứa đầy khoảng trắng.


Nó hoạt động, nhưng nó cũng đắt khủng khiếp. Tốt nếu bạn chỉ muốn kiểm tra một hoặc hai thứ, không phải là một bộ lớn.
Orpheus

20

Hiệu suất

Tôi thực hiện các thử nghiệm trên macOS v10.13.6 (High Sierra) cho 18 giải pháp được chọn. Các giải pháp hoạt động hơi khác nhau (đối với dữ liệu nhập trường hợp góc) được trình bày trong đoạn trích dưới đây.

Kết luận

  • các giải pháp đơn giản dựa trên !str, ==, ===lengthđang nhanh chóng cho tất cả các trình duyệt (A, B, C, G, I, J)
  • các giải pháp dựa trên biểu thức chính quy ( test, replace) và charAtchậm nhất cho tất cả các trình duyệt (H, L, M, P)
  • các giải pháp được đánh dấu là nhanh nhất chỉ nhanh nhất cho một lần chạy thử - nhưng trong nhiều lần chạy, nó thay đổi trong nhóm giải pháp 'nhanh'

Nhập mô tả hình ảnh ở đây

Chi tiết

Trong đoạn trích dưới đây, tôi so sánh kết quả của 18 phương thức được chọn bằng cách sử dụng các tham số đầu vào khác nhau

  • "" "a" " "- chuỗi rỗng, chuỗi có chữ và chuỗi có khoảng trắng
  • [] {} f- mảng, đối tượng và chức năng
  • 0 1 NaN Infinity - số
  • true false - Boolean
  • null undefined

Không phải tất cả các phương pháp được thử nghiệm đều hỗ trợ tất cả các trường hợp đầu vào.

Và sau đó, đối với tất cả các phương pháp tôi thực hiện trường hợp kiểm tra tốc độ str = ""cho trình duyệt Chrome v78.0.0, Safari v13.0.4 và Firefox v71.0.0 - bạn có thể chạy thử nghiệm trên máy của mình tại đây

Nhập mô tả hình ảnh ở đây


Điều này thực sự tuyệt vời! Tôi thích nhìn thấy tất cả những điều này đặt ra! Cảm ơn bạn!
WebWanderer

đó là nghiên cứu kỹ lưỡng - cảm ơn
Deian

19
  1. kiểm tra xem có var a;tồn tại không
  2. cắt ra false spacestrong giá trị, sau đó kiểm traemptiness

    if ((a)&&(a.trim()!=''))
    {
      // if variable a is not empty do this 
    }

17

Ngoài ra, trong trường hợp bạn coi một chuỗi chứa khoảng trắng là "trống".

Bạn có thể kiểm tra nó với biểu thức chính quy này:

!/\S/.test(string); // Returns true if blank.

14

Tôi thường sử dụng một cái gì đó như thế này,

if (!str.length) {
    // Do something
}

3
Nhanh nhất nếu bạn biết rằng biến là một chuỗi. Ném một lỗi nếu biến không xác định.
Adrian Hope-Bailie

@ AdrianITH-Bailie tại sao bạn sẽ kiểm tra một biến không xác định?
Abimael Martell

2
@ AbimaelMartell Tại sao không? Bạn có một biến mà bạn đã khai báo hoặc được chuyển cho bạn từ một số phạm vi mà bạn không kiểm soát được, chẳng hạn như trong phản hồi từ một cuộc gọi phương thức hoặc API. Bạn có thể giả sử nó chứa một giá trị và sử dụng kiểm tra ở trên nhưng nếu nó không được xác định hoặc là null, bạn sẽ gặp lỗi. kiểm tra var = null; if (! test.length) {alert ("adrian là sai");}
Adrian Hope-Bailie

OP đã yêu cầu "làm thế nào để kiểm tra một chuỗi rỗng", biến không xác định không phải là một chuỗi rỗng. Dù sao bạn có thể kiểm tra typeof variable != "undefined"trước khi kiểm tra nếu trống.
Abimael Martell

10

Tôi đã không nhận thấy một câu trả lời có tính đến khả năng của các ký tự null trong một chuỗi. Ví dụ: nếu chúng ta có chuỗi ký tự null:

var y = "\0"; // an empty string, but has a null character
(y === "") // false, testing against an empty string does not work
(y.length === 0) // false
(y) // true, this is also not expected
(y.match(/^[\s]*$/)) // false, again not wanted

Để kiểm tra tính vô hiệu của nó, người ta có thể làm một cái gì đó như thế này:

String.prototype.isNull = function(){ 
  return Boolean(this.match(/^[\0]*$/)); 
}
...
"\0".isNull() // true

Nó hoạt động trên một chuỗi rỗng và trên một chuỗi trống và nó có thể truy cập được cho tất cả các chuỗi. Ngoài ra, nó có thể được mở rộng để chứa các ký tự trống hoặc khoảng trắng JavaScript khác (nghĩa là không gian không phá vỡ, dấu thứ tự byte, dấu tách dòng / đoạn, v.v.).


2
Phân tích thú vị. Tôi không nghĩ rằng điều này sẽ có liên quan trong 99,9% trường hợp. NHƯNG gần đây tôi thấy rằng MySQL đánh giá một cột thành "null" nếu (và chỉ khi) cột đó chứa ký tự null ("\ 0"). Mặt khác, Oracle sẽ không đánh giá "\ 0" là null, thích coi nó là một chuỗi có độ dài 1 (trong đó một ký tự là ký tự null). Điều này có thể gây nhầm lẫn nếu không được xử lý đúng cách, vì nhiều nhà phát triển web làm việc với cơ sở dữ liệu phía sau, có thể chuyển qua các loại giá trị "null" khác nhau. Nó nên ở phía sau tâm trí của mỗi nhà phát triển.
cartb Beforehorse

10

Trong khi đó, chúng ta có thể có một chức năng kiểm tra tất cả các 'trống' như null, không xác định, '', '', {}, [] . Vì vậy, tôi chỉ viết này.

var isEmpty = function(data) {
    if(typeof(data) === 'object'){
        if(JSON.stringify(data) === '{}' || JSON.stringify(data) === '[]'){
            return true;
        }else if(!data){
            return true;
        }
        return false;
    }else if(typeof(data) === 'string'){
        if(!data.trim()){
            return true;
        }
        return false;
    }else if(typeof(data) === 'undefined'){
        return true;
    }else{
        return false;
    }
}

Trường hợp sử dụng và kết quả.

console.log(isEmpty()); // true
console.log(isEmpty(null)); // true
console.log(isEmpty('')); // true
console.log(isEmpty('  ')); // true
console.log(isEmpty(undefined)); // true
console.log(isEmpty({})); // true
console.log(isEmpty([])); // true
console.log(isEmpty(0)); // false
console.log(isEmpty('Hey')); // false

10

Cho đến bây giờ không có phương thức trực tiếp nào như string.empty để kiểm tra xem một chuỗi có trống hay không. Nhưng trong mã của bạn, bạn có thể sử dụng kiểm tra trình bao bọc cho một chuỗi trống như:

// considering the variable in which your string is saved is named str.

if (str && str.length>0) { 

  // Your code here which you want to run if the string is not empty.

}

Sử dụng điều này, bạn cũng có thể đảm bảo rằng chuỗi không được xác định hoặc null quá. Hãy nhớ rằng, không xác định, null và trống là ba điều khác nhau.


Nó sẽ đưa ra một lỗi về null hoặc không xác định nguyên nhân, chúng ta không nên trực tiếp thực hiện một thao tác trên một biến là null hoặc không xác định - kiểm tra str có tồn tại trước khi thực hiện điều này như đã nêu trong các câu trả lời khác không và cũng lưu ý rằng điều này sẽ hoạt động trên let abc = '' nhưng không cho phép abc = '', hai cái này khác nhau.
whoami

Xem xét let rand = ()=>Math.random(), sau đó rand && rand.length > 0)trả về false, nhưng rõ ràng fn không "trống". Tức là nó trả về false cho bất kỳ chức năng nào không có tham số định dạng.
RobG

@RobG Math.random()trả về một số và không phải là một chuỗi. Và câu trả lời này là về chuỗi. ;-)
Harshit Agarwal

10

Tất cả những câu trả lời là tốt đẹp.

Nhưng tôi không thể chắc chắn rằng biến đó là một chuỗi, không chỉ chứa khoảng trắng (điều này rất quan trọng đối với tôi) và có thể chứa '0' (chuỗi).

Phiên bản của tôi:

function empty(str){
    return !str || !/[^\s]+/.test(str);
}

empty(null); // true
empty(0); // true
empty(7); // false
empty(""); // true
empty("0"); // false
empty("  "); // true

Mẫu trên jsfiddle .


1
Huh? Nếu bạn đang mong đợi một chuỗi empty(0)empty(7)sẽ trả về cùng một giá trị.
Bennett McElwee

Trong trường hợp cụ thể của tôi - empty("0")phải trả về false(vì đó không phải là chuỗi trống), nhưng empty(0)phải trả về truevì nó trống :)
Andron

Nhưng 0 không trống! Đó là một số và các số không thể đầy hoặc trống. Tất nhiên, đó là chức năng của bạn và do đó phải đáp ứng yêu cầu của bạn, nhưng emptylà một tên gây hiểu lầm trong trường hợp này.
Bennett McElwee

Tôi nghĩ rằng tên đó emptylà tốt. Trong tài liệu php cho hàm rỗng : Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE.Sự khác biệt giữa PHPvà hàm này - chuỗi đó '0'sẽ không được xác định là trống.
Andron

Như tôi nói, đó là chức năng của bạn: gọi nó là những gì bạn muốn. Nhưng emptylà một tên không chính xác và sai lệch. Thật thú vị khi PHP cũng có một emptyhàm được đặt tên kém , nhưng các lỗi của PHP không liên quan gì đến JavaScript.
Bennett McElwee

10

Tôi không thấy câu trả lời hay ở đây (ít nhất không phải là câu trả lời phù hợp với tôi)

Vì vậy, tôi quyết định tự trả lời:

value === undefined || value === null || value === "";

Bạn cần bắt đầu kiểm tra nếu nó không được xác định. Mặt khác, phương thức của bạn có thể phát nổ, và sau đó bạn có thể kiểm tra xem nó bằng null hay bằng một chuỗi rỗng.

Bạn không thể có !! hoặc chỉ if(value)vì nếu bạn kiểm tra 0nó sẽ cung cấp cho bạn một câu trả lời sai (0 là sai).

Như đã nói, hãy gói nó theo một phương thức như:

public static isEmpty(value: any): boolean { return value === undefined || value === null || value === ""; }

Tái bút: Bạn không cần kiểm tra typeof , vì nó sẽ phát nổ và ném ngay cả trước khi nó đi vào phương thức


Có thể sử dụng tốt hơn cấu trúc Boolean (value) xử lý các giá trị null và null (và 0, -0, false, NaN) là sai. Xem stackoverflow.com/questions/856324/
Mạnh

9

Nếu một người cần phát hiện không chỉ các chuỗi trống mà cả các chuỗi trống, tôi sẽ thêm vào câu trả lời của Goral:

function isEmpty(s){
    return !s.length;    
}

function isBlank(s){
    return isEmpty(s.trim());    
}

8

Thử cái này

str.value.length == 0

3
"".value.lengthsẽ gây ra lỗi. Nó nên làstr.length === 0
AndFisher

Điều này trow a TypeErrorNếu strbằng undefinedhoặcnull
RousseauAlexandre

8

Bạn có thể dễ dàng thêm nó vào đối tượng Chuỗi gốc trong JavaScript và sử dụng lại nhiều lần ...
Một cái gì đó đơn giản như mã dưới đây có thể thực hiện công việc cho bạn nếu bạn muốn kiểm tra ''các chuỗi trống:

String.prototype.isEmpty = String.prototype.isEmpty || function() {
  return !(!!this.length);
}

Mặt khác, nếu bạn muốn kiểm tra cả ''chuỗi trống và ' 'với khoảng trắng , bạn có thể làm điều đó bằng cách chỉ cần thêm trim(), một cái gì đó giống như mã dưới đây:

String.prototype.isEmpty = String.prototype.isEmpty || function() {
   return !(!!this.trim().length);
}

và bạn có thể gọi nó theo cách này:

''.isEmpty(); //return true
'alireza'.isEmpty(); //return false

Có lợi ích gì để làm !(!!this.length)hơn là chỉ !this(hoặc !this.trim()cho tùy chọn thứ hai)? Một chuỗi có độ dài bằng 0 đã bị sai lệch, các dấu ngoặc đơn là thừa và việc phủ định nó ba lần hoàn toàn giống như phủ định nó một lần.
John Montgomery

8

Thử cái này:

export const isEmpty = string => (!string || !string.length);

8

Tôi đã thực hiện một số nghiên cứu về những gì xảy ra nếu bạn chuyển một giá trị không phải là chuỗi và không rỗng / null cho hàm kiểm tra. Như nhiều người biết, (0 == "") là đúng trong JavaScript, nhưng vì 0 là một giá trị và không trống hoặc null, nên bạn có thể muốn kiểm tra nó.

Hai hàm sau chỉ trả về true cho các giá trị không xác định, null, rỗng / khoảng trắng và false cho mọi thứ khác, chẳng hạn như số, Boolean, đối tượng, biểu thức, v.v.

function IsNullOrEmpty(value)
{
    return (value == null || value === "");
}
function IsNullOrWhiteSpace(value)
{
    return (value == null || !/\S/.test(value));
}

Các ví dụ phức tạp hơn tồn tại, nhưng đây là những đơn giản và cho kết quả phù hợp. Không cần kiểm tra không xác định, vì nó được bao gồm trong kiểm tra (value == null). Bạn cũng có thể bắt chước hành vi C # bằng cách thêm chúng vào Chuỗi như thế này:

String.IsNullOrEmpty = function (value) { ... }

Bạn không muốn đặt nó trong nguyên mẫu Chuỗi, vì nếu thể hiện của lớp String là null, nó sẽ báo lỗi:

String.prototype.IsNullOrEmpty = function (value) { ... }
var myvar = null;
if (1 == 2) { myvar = "OK"; } // Could be set
myvar.IsNullOrEmpty(); // Throws error

Tôi đã thử nghiệm với mảng giá trị sau. Bạn có thể lặp nó qua để kiểm tra các chức năng của mình nếu nghi ngờ.

// Helper items
var MyClass = function (b) { this.a = "Hello World!"; this.b = b; };
MyClass.prototype.hello = function () { if (this.b == null) { alert(this.a); } else { alert(this.b); } };
var z;
var arr = [
// 0: Explanation for printing, 1: actual value
    ['undefined', undefined],
    ['(var) z', z],
    ['null', null],
    ['empty', ''],
    ['space', ' '],
    ['tab', '\t'],
    ['newline', '\n'],
    ['carriage return', '\r'],
    ['"\\r\\n"', '\r\n'],
    ['"\\n\\r"', '\n\r'],
    ['" \\t \\n "', ' \t \n '],
    ['" txt \\t test \\n"', ' txt \t test \n'],
    ['"txt"', "txt"],
    ['"undefined"', 'undefined'],
    ['"null"', 'null'],
    ['"0"', '0'],
    ['"1"', '1'],
    ['"1.5"', '1.5'],
    ['"1,5"', '1,5'], // Valid number in some locales, not in JavaScript
    ['comma', ','],
    ['dot', '.'],
    ['".5"', '.5'],
    ['0', 0],
    ['0.0', 0.0],
    ['1', 1],
    ['1.5', 1.5],
    ['NaN', NaN],
    ['/\S/', /\S/],
    ['true', true],
    ['false', false],
    ['function, returns true', function () { return true; } ],
    ['function, returns false', function () { return false; } ],
    ['function, returns null', function () { return null; } ],
    ['function, returns string', function () { return "test"; } ],
    ['function, returns undefined', function () { } ],
    ['MyClass', MyClass],
    ['new MyClass', new MyClass()],
    ['empty object', {}],
    ['non-empty object', { a: "a", match: "bogus", test: "bogus"}],
    ['object with toString: string', { a: "a", match: "bogus", test: "bogus", toString: function () { return "test"; } }],
    ['object with toString: null', { a: "a", match: "bogus", test: "bogus", toString: function () { return null; } }]
];

Nếu bạn chỉ đơn giản dừng sử dụng == và sử dụng ===, thì điều này sẽ giải quyết vấn đề if (s === "").
Scott Marcus

8

Để kiểm tra xem nó có chính xác là một chuỗi rỗng không:

if(val==="")...

Để kiểm tra xem đó có phải là một chuỗi rỗng HOẶC tương đương logic cho không có giá trị (null, không xác định, 0, NaN, false, ...):

if(!val)...

7

Không có isEmpty()phương pháp, bạn phải kiểm tra loại và độ dài:

if (typeof test === 'string' && test.length === 0){
  ...

Vui lòng cung loại là cần thiết để tránh các lỗi runtime khi testundefinedhay null.


7

Bỏ qua các chuỗi khoảng trắng, bạn có thể sử dụng chuỗi này để kiểm tra null, trống và không xác định:

var obj = {};
(!!obj.str) // Returns false

obj.str = "";
(!!obj.str) // Returns false

obj.str = null;
(!!obj.str) // Returns false

Nó ngắn gọn và nó hoạt động cho các thuộc tính không xác định, mặc dù nó không phải là dễ đọc nhất.

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.