ฉันจะตรวจสอบสตริงว่าง / ไม่ได้กำหนด / null ใน JavaScript ได้อย่างไร


2852

ฉันเห็นคำถามนี้แต่ฉันไม่เห็นตัวอย่างเฉพาะ JavaScript มีง่ายๆstring.Emptyใน JavaScript หรือเป็นเพียงการตรวจสอบ""หรือไม่


2
เพียง FYI ผมคิดว่า API ที่มีประโยชน์มากที่สุดสำหรับการเรียน String อยู่ที่Mozillaและชุดจาวาสคริปต์ [elated.com] ( elated.com/articles/working-with-strings ) มีการสอนเกี่ยวกับคุณสมบัติวิธีการของ String ทั้งหมด ... โปรดทราบ: ลิงก์ Mozilla ได้รับการอัปเดตเป็นdeveloper.mozilla.org/en/ JavaScript / ข้อมูลอ้างอิง / Global_Objects / …
Gene T

ตรวจสอบสิ่งนี้: stackoverflow.com/a/36491147/7026966
Himanshu Shekhar

มันจะช่วยได้มากหากมีการระบุข้อกำหนดไว้อย่างชัดเจน สำหรับสิ่งที่มีค่าควรisEmptyกลับมาจริงหรือไม่? ตรวจสอบ "" infers ว่าควรส่งคืนจริงถ้าค่าเป็นประเภทสตริงและความยาว 0 คำตอบจำนวนมากที่นี่คิดว่ามันควรจะกลับจริงสำหรับบางส่วนหรือทั้งหมดค่าเท็จ
RobG

คำตอบ:


3568

หากคุณเพียงต้องการตรวจสอบว่ามีค่าใด ๆ คุณสามารถทำได้

if (strValue) {
    //do something
}

หากคุณต้องการที่จะตรวจสอบเฉพาะสำหรับสตริงว่างมากกว่าโมฆะฉันคิดว่าการตรวจสอบกับ""เป็นทางออกที่ดีที่สุดของคุณโดยใช้ประกอบการ (เพื่อให้คุณรู้ว่ามันเป็นในความเป็นจริงสตริงคุณกำลังเปรียบเทียบกับ)===

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

174
การทดสอบคุณสมบัติความยาวอาจเร็วกว่าการทดสอบสตริงกับ "" เนื่องจากล่ามไม่จำเป็นต้องสร้างวัตถุสตริงจากตัวอักษรของสตริง
Vincent Robert

26
@Vincent กำลังทำโปรไฟล์แบบไร้เดียงสาในเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของ Chrome การทดสอบ=== ''vs .lengthไม่แสดงการปรับปรุงที่มองเห็นได้ (และใช้.lengthงานได้ก็ต่อเมื่อคุณสามารถสันนิษฐานได้ว่าคุณมีสตริง)
bdukes

26
@bdukes เมื่อคุณเริ่มที่จะดูแลเกี่ยวกับชนิดของไมโครเพิ่มประสิทธิภาพนั้นผมไม่คิดว่า Chrome เป็นเบราว์เซอร์ที่คุณกำลังมีปัญหาส่วนใหญ่ของประสิทธิภาพการทำงานของคุณ ...
วินเซนต์โรเบิร์ต

15
เพียงแค่ต้องทราบถ้าคำจำกัดความของคุณ "สตริงว่าง" รวมถึงช่องว่างแล้วการแก้ปัญหานี้ไม่เหมาะสม สตริงของ 1 ช่องว่างหรือมากกว่าส่งคืนค่าความจริงด้านบน หากคุณกำลังใช้ JQuery คุณสามารถใช้สิ่งนี้: if ($ .trim (ref) .length === 0) - ตามคำตอบของคำถามที่คล้ายกันนี้: stackoverflow.com/questions/2031085/ …
CodeClimber

115
ตามที่คาดไว้.length > 0จริงเร็วกว่าการเปรียบเทียบกับตัวอักษรสตริง! ตรวจสอบjsPerf
Chad

1128

สำหรับการตรวจสอบว่าสตริงว่างเปล่าเป็นโมฆะหรือไม่ได้กำหนดฉันใช้:

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

สำหรับการตรวจสอบว่าสตริงว่างเปล่าเป็นโมฆะหรือไม่ได้กำหนดฉันใช้:

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

สำหรับการตรวจสอบว่าสตริงว่างหรือมีเพียง white-space:

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

21
ทำไม 0 === str.length แทน str.length === 0
Vincent

66
เงื่อนไข @Vincent มักเขียนเช่นนี้if (variable == constant value)และถ้าคุณลืม '=' คุณจะกำหนดค่าคงที่ให้กับตัวแปรแทนที่จะทำการทดสอบ รหัสจะยังคงทำงานตามที่คุณสามารถกำหนดตัวแปรในถ้า วิธีที่ปลอดภัยกว่าในการเขียนเงื่อนไขนี้คือการย้อนกลับค่าคงที่และตัวแปร วิธีนี้เมื่อคุณทดสอบรหัสของคุณคุณจะเห็นข้อผิดพลาด (ด้านซ้ายมือที่ไม่ถูกต้องในการกำหนด) คุณสามารถใช้บางอย่างเช่น JSHint เพื่อไม่อนุญาตการมอบหมายในเงื่อนไขและได้รับการเตือนเมื่อคุณเขียน
florian

2
ความอัปยศที่/^\s*$/.test(str)ไม่สามารถอ่านได้จริง - อาจลบช่องว่างด้วยรหัสที่ง่ายกว่าหรือ regex จะดีกว่าไหม ดูstackoverflow.com/questions/6623231/…และstackoverflow.com/questions/10800355/…
Adrien Be

6
/^\s*$/.test(str) สามารถแทนที่ด้วย str.trim () ความยาว === 0
Schadenfreude

21
@Vincent นี้จะเรียกว่า "เงื่อนไข Yoda" if blue is the skyเช่น ดูdodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
AZ

316

คำตอบก่อนหน้าทั้งหมดดี แต่นี่จะดีกว่า ใช้ตัวดำเนินการ!!( ไม่ใช่ )

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

หรือใช้การหล่อแบบ:

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

ทั้งสองทำหน้าที่เดียวกัน พิมพ์ตัวแปรไปที่บูลีนโดยที่strเป็นตัวแปร
ก็จะส่งกลับสำหรับfalse มันจะส่งกลับสำหรับสตริง "0" และช่องว่าง ""null,undefined,0,000,"",false
true


61
ทำไมถึงดีกว่า?
Mene

33
มีความแตกต่างระหว่างพฤติกรรมของif(str)และif(!!str)?
Peter Olson

6
@PeterOlson ถ้าคุณพยายามบันทึกตัวแปรเป็นบูลีนที่ตรวจสอบหลายสายสำหรับเนื้อหาแล้วคุณต้องการทำเช่นนี้ .. การvar any = (!!str1 && !!str2 && !!str3)จัดการaka หากมีจำนวนอยู่ในนั้นเช่นกัน
John Ruddell

23
นี่คือทางออกที่ฉันมักจะใช้ !!str.trim()เพื่อให้แน่ใจว่าสายอักขระไม่ได้ทำจากช่องว่างเท่านั้น
Dario Oddenino

5
ไม่เหมือนแฮ็คBoolean(str)มันสามารถอ่านและ "wtfish" ได้ง่ายขึ้น
shinzou

105

สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถไปถึงstr.Empty(ด้วยเงื่อนไขที่ str คือสตริง) คือ:

if (!str.length) { ...

9
การโยนข้อยกเว้นจะไม่เป็น str หรือเปล่า?
Pic Mickael

3
@PicMickael ใช่! str.Emptyดังนั้นจะ
Ates Goral

99

หากคุณต้องการตรวจสอบให้แน่ใจว่าสตริงไม่ได้เป็นเพียงช่องว่างขนาดใหญ่ (ฉันสมมติว่านี่เป็นเพียงการตรวจสอบความถูกต้องของฟอร์ม) คุณต้องทำการแทนที่ช่องว่าง

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

8
แต่ทำงานถ้าสิ่งที่คุณต้องการทดสอบจริง ๆ คือสตริงที่มีเนื้อหาที่ไม่ใช่ที่ว่าง มีวิธีทดสอบราคาแพงน้อยกว่านี้ไหม
แฟลช

4
แล้วคุณสมบัติความยาวล่ะ?
driAn

27
แทนที่จะลบช่องว่างทั้งหมดทำไมไม่ลองตรวจสอบดูว่ามีที่ว่างหรือไม่ มีข้อได้เปรียบ 2 ประการที่สามารถประกันตัวได้ตั้งแต่เนิ่น ๆ หากมีอักขระที่ไม่ใช่ช่องว่างและจะไม่ส่งคืนสตริงใหม่ที่คุณจะตรวจสอบ if(str.match(/\S/g)){}
mpen

34
@ Mark FYI คุณไม่ต้องการตัวแก้ไขทั่วโลกเนื่องจากการจับคู่ที่เกิดขึ้นครั้งแรกของอักขระที่ไม่ใช่ช่องว่างหมายความว่าสตริงไม่ว่างเปล่า:str.match(/\S/)
neezer

1
ทำไมมันแพง ถ้าเป็นจริงทำไม jQuery ใช้วิธีนี้? คุณสามารถค้นหาได้ในแหล่งที่มาของ jQueryvar trimLeft = /^\s+/, trimRight = /\s+$/;
Marecky

66

ฉันใช้:

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
วิธีนี้เป็นวิธีที่ไม่เชื่อเรื่องภาษามากขึ้น คุณลักษณะ JavaScript เพียงอย่างเดียวที่ต้องใช้คือ typeof ดังนั้นจึงเป็นตัวอย่างที่ดีของโซลูชันที่คุณสามารถใช้เมื่อคุณไม่เชื่อถือการใช้งานในเบราว์เซอร์ที่แตกต่างกันและไม่มีเวลาที่จะคว้าโซลูชันที่ดีกว่า (IE ไม่มีอินเทอร์เน็ต) มันเป็นเหมือนหลักฐาน ไม่ใช่คนที่สะอาดที่สุด แต่คุณสามารถมั่นใจได้ว่ามันจะทำงานได้โดยไม่ต้องรู้จัก JavaScript มากเกินไป
Jeff Davis

2
ฉันจะไปอีกสักหน่อยและตอกตะปูกับตัวดำเนินการ === สำหรับคดีที่ไม่ได้กำหนด มิฉะนั้นมันเป็นเพียงคำตอบที่สมบูรณ์แบบ
xarlymg89

เดอะtypeofในswitchไม่ได้ทำงานสำหรับฉัน ฉันเพิ่มการif (typeof e == "undefined")ทดสอบและใช้งานได้ ทำไม?
ลูคัส

1
@ Lucas เพราะนี่เป็นตัวพิมพ์ใหญ่หรือการกำกับดูแล การดัดแปลงของคุณเป็นวิธีที่ถูกต้อง (ต้นฉบับหมายถึงบริบทของฟังก์ชั่นที่ว่างเปล่าไม่ใช่พารามิเตอร์ e ซึ่งเป็นสิ่งที่ฟังก์ชั่นควรจะตรวจสอบ)
beeThree

เราสามารถใช้case undefined:แทนได้case typeof(e) == "undefined":หรือไม่
Boris J.

43

คุณสามารถใช้lodash : _.isEmpty (ค่า)

มันครอบคลุมมากในกรณีเช่น{}, '', null, undefinedฯลฯ

แต่จะส่งคืนtrueสำหรับNumberชนิดของข้อมูลดั้งเดิมของJavaScriptเช่น_.isEmpty(10)หรือ_.isEmpty(Number.MAX_VALUE)ส่งคืนทั้งสองtrueอย่าง


_.isEmpty(" "); // => false
ริช

1
@Erich เพราะ" "ไม่ว่างเปล่า _.isEmpty("");ผลตอบแทนจริง
Moshii

1
ค่อนข้างจริง - ฉันพูดถึงเรื่องนี้เพราะบางคำตอบอื่น ๆ ที่นี่แสดงถึงการตรวจสอบรูปแบบและการตรวจสอบว่าสตริงประกอบด้วยช่องว่างเท่านั้นและฟังก์ชั่นเดียวบ้านพักเดี่ยวด้วยตัวเองจะไม่แก้ปัญหานั้น
ริช

@Erich ตอนนี้ฉันได้รับจุดของคุณขอบคุณที่พูดถึง
Moshii

36

ฟังก์ชั่น:

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: ใน JavaScript อย่าใช้ตัวแบ่งบรรทัดหลังจากreturn;


1
โอกาสใดที่คุณสามารถอธิบายสิ่งที่แต่ละเช็คทำอยู่ :)
DanV

2
-1 พวกเขากำลังทดสอบสิ่งต่าง ๆ มันไม่สมเหตุสมผลเลยที่จะนำพวกเขาทั้งหมดมารวมกันเป็นหนึ่งifประโยค
Bennett McElwee

1
typeof MyVariable == 'undefined' ไม่ได้แยกแยะระหว่างตัวแปรที่ถูกกำหนดค่าเริ่มต้นด้วยค่าที่ไม่ได้กำหนดและตัวแปรที่ไม่ได้ประกาศเว้นแต่ตัวแปรนั้นจะถูกประกาศในตอนแรกและเริ่มต้นเป็นโมฆะ การตรวจสอบคุณสมบัติความยาวทำให้สตริงดั้งเดิมถูกห่อในวัตถุสตริง
Scott Marcus

35

ลอง:

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

2
จำเป็นต้องใช้คุณสมบัติความยาวหรือไม่
frogcoder

str.trim().lengthจะทำเร็วกว่าstr.trim()ประมาณ 1% ตามผลการทดสอบของฉันเอง
devildelta

2
@devildelta - 1% ของคุณเป็นข้อผิดพลาดในการทดสอบของคุณ
Stephen M Irving

OP ต้องการทดสอบสตริงว่างเปล่าไม่ได้กำหนดหรือเป็นโมฆะ นี่เป็นการทดสอบสตริงที่ไม่มีเงื่อนไขใด ๆ เขาไม่ได้พูดอะไรเกี่ยวกับช่องว่างเท่านั้นทั้งสาย คุณสามารถทดสอบเงื่อนไขของ OP ได้เพียงแค่นี้ตราบใดที่คุณแน่ใจว่าไม่มีประเภทข้อมูลอื่นถูกเก็บไว้ในตัวแปร: if (!str) { ... }
Stephen M Irving

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

ไม่มีสิ่งใดที่แสดงถึงสตริงว่างใน JavaScript ตรวจสอบอย่างใดอย่างหนึ่งlength(ถ้าคุณรู้ว่า var จะเป็นสตริง) หรือต่อ""


29

ฉันจะไม่กังวลมากเกินไปเกี่ยวกับวิธีการที่มีประสิทธิภาพที่สุด ใช้สิ่งที่ชัดเจนที่สุดสำหรับความตั้งใจของคุณ strVar == ""สำหรับผมที่มักจะ

ตามความคิดเห็นจากConstantinถ้า strVar สามารถสรุปได้ว่ามีค่าจำนวนเต็ม 0 แล้วนั่นจะเป็นหนึ่งในสถานการณ์ที่ชัดเจนโดยเจตนา


11
ความคิดที่ไม่ดี คุณจะได้รับจริงถ้า strVar ได้รับมอบหมายโดยไม่ได้ตั้งใจ 0
Constantin

5
ฉันยอมรับว่าการทำให้ความตั้งใจของคุณชัดเจนนั้นสำคัญกว่าวิธีอื่น ๆ ที่อาจทำให้เกิดประโยชน์สูงสุด แต่การใช้ตัวดำเนินการเปรียบเทียบที่เข้มงวด ===จะดีกว่า มันจะส่งกลับจริงถ้าstrVarเป็นสตริงที่ว่างเปล่า
รหัสที่ไร้ประโยชน์

การตรวจสอบล้มเหลวหากไม่ได้กำหนด ดังนั้นหาก (str) ทำงานได้ดีขึ้น
Valentin Heinitz

3
@ValentinHeinitz หาก str ได้รับการกำหนดค่าความเท็จเป็น 0 หรือ "0" หาก (str) จะรายงานเท็จจริง วิธีที่ดีที่สุดคือถ้า (str === "") มันง่ายและจะไม่ล้มเหลว
Scott Marcus


20

คำตอบมากมายและมีความเป็นไปได้ต่าง ๆ มากมาย!

ไม่ต้องสงสัยเลยว่าการใช้งานอย่างรวดเร็วและง่ายดายผู้ชนะคือ: if (!str.length) {...}

อย่างไรก็ตามมีตัวอย่างให้เลือกมากมาย วิธีการทำงานที่ดีที่สุดที่จะไปเกี่ยวกับเรื่องนี้ฉันอยากจะแนะนำ:

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;
    }
}

ฉันรู้มากไปหน่อย


2
การตรวจสอบสำหรับไม่ได้กำหนดจะต้องถูกย้ายไปก่อนในการตรวจสอบหรือรายการที่ไม่ได้กำหนดจะโยนข้อยกเว้นในการตรวจสอบก่อนหน้านี้
SvdSinner

เห็นด้วยอย่างสมบูรณ์! รับได้สวย. ฉันจะแก้ไขคำตอบข้างต้นของฉัน!
จันทร์ที่

str.length === 0ผลตอบแทนจริงสำหรับฟังก์ชั่นใด ๆ ที่ไม่มีพารามิเตอร์ที่เป็นทางการ
RobG

20

คุณสามารถใช้นิพจน์ทั่วไป:

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

ตรวจสอบสตริงที่ว่างเปล่าหรือเติมด้วยช่องว่าง


มันใช้งานได้ แต่มันก็แพงเหมือนกัน ดีถ้าคุณแค่ต้องการตรวจสอบสิ่งหนึ่งหรือสองสิ่งไม่ใช่ชุดใหญ่
ออร์ฟัส

20

ประสิทธิภาพ

ฉันทำการทดสอบบนmacOS v10.13.6 (High Sierra) สำหรับโซลูชันที่เลือก 18 ข้อ โซลูชันทำงานแตกต่างกันเล็กน้อย (สำหรับข้อมูลอินพุตตัวพิมพ์มุม) ซึ่งแสดงในตัวอย่างด้านล่าง

สรุปผลการวิจัย

  • โซลูชั่นที่ง่ายขึ้นอยู่กับ!str, ==, ===และlengthมีความรวดเร็วสำหรับเบราว์เซอร์ (A, B, C, G, I, J)
  • วิธีการแก้ปัญหาขึ้นอยู่กับการแสดงออกปกติ ( test, replace) และcharAtช้าที่สุดสำหรับเบราว์เซอร์ทั้งหมด (H, L, M, P)
  • การแก้ปัญหาที่ทำเครื่องหมายว่าเร็วที่สุดนั้นเร็วที่สุดสำหรับการทดสอบครั้งเดียวเท่านั้น แต่ในการทดสอบหลายครั้งมันจะเปลี่ยนแปลงภายในกลุ่มโซลูชัน 'รวดเร็ว'

ป้อนคำอธิบายภาพที่นี่

รายละเอียด

ในตัวอย่างด้านล่างฉันเปรียบเทียบผลลัพธ์ของวิธีการที่เลือก 18 วิธีโดยใช้พารามิเตอร์อินพุตที่แตกต่างกัน

  • "" "a" " "- สตริงว่างสตริงด้วยตัวอักษรและสตริงที่มีช่องว่าง
  • [] {} f- อาร์เรย์วัตถุและฟังก์ชั่น
  • 0 1 NaN Infinity - ตัวเลข
  • true false - บูลีน
  • null undefined

ไม่ใช่วิธีการทดสอบทั้งหมดที่รองรับกรณีอินพุตทั้งหมด

และสำหรับทุกวิธีที่ฉันใช้ทดสอบเคสstr = ""สำหรับเบราว์เซอร์ Chrome v78.0.0, Safari v13.0.4 และ Firefox v71.0.0 - คุณสามารถรันการทดสอบบนเครื่องของคุณได้ที่นี่

ป้อนคำอธิบายภาพที่นี่


มันยอดเยี่ยมจริงๆ! ฉันชอบที่จะเห็นสิ่งเหล่านี้ทั้งหมดออกมา! ขอบคุณ!
WebWanderer

นั่นคือการศึกษาอย่างละเอียด - ขอบคุณ
Deian


17

นอกจากนี้ในกรณีที่คุณพิจารณาสตริงที่เติมช่องว่างเป็น "ว่างเปล่า"

คุณสามารถทดสอบด้วยนิพจน์ทั่วไปนี้:

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

14

ฉันมักจะใช้สิ่งนี้

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

3
เร็วที่สุดถ้าคุณรู้ว่าตัวแปรเป็นสตริง โยนข้อผิดพลาดหากตัวแปรไม่ได้กำหนด
Adrian Hope-Bailie

@ AdrianHope-Bailie ทำไมคุณถึงทดสอบตัวแปรที่ไม่ได้กำหนด?
Abimael Martell

2
@AbimaelMartell ทำไมล่ะ คุณมีตัวแปรที่คุณประกาศหรือถูกส่งให้คุณจากขอบเขตที่คุณไม่สามารถควบคุมได้เช่นในการตอบกลับจากวิธีหรือการเรียก API คุณสามารถสมมติว่ามันมีค่าและใช้การตรวจสอบข้างต้น แต่ถ้ามันไม่ได้กำหนดหรือเป็นโมฆะคุณจะได้รับข้อผิดพลาด var test = null; if (! test.length) {alert ("adrian is mis");}
Adrian Hope-Bailie

OP ขอให้ "วิธีตรวจสอบสตริงว่าง" ตัวแปรที่ไม่ได้กำหนดนั้นไม่ใช่สตริงว่างเปล่า อย่างไรก็ตามคุณสามารถตรวจสอบtypeof variable != "undefined"ก่อนที่จะตรวจสอบว่าว่างเปล่า
Abimael Martell

10

ฉันไม่ได้สังเกตเห็นคำตอบที่คำนึงถึงความเป็นไปได้ของตัวอักษร 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

เพื่อทดสอบความว่างเปล่าของมันเราสามารถทำสิ่งนี้:

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

มันทำงานบนสตริงที่เป็นโมฆะและในสตริงที่ว่างเปล่าและมันสามารถเข้าถึงได้สำหรับทุกสาย นอกจากนี้ยังสามารถขยายให้มีอักขระว่างเปล่าหรือตัวเว้นวรรค JavaScript อื่น ๆ (เช่นพื้นที่ว่าง, เครื่องหมายคำสั่งไบต์, ตัวคั่นบรรทัด / ย่อหน้า ฯลฯ )


2
การวิเคราะห์ที่น่าสนใจ ฉันไม่คิดว่ามันจะเกี่ยวข้องใน 99.9% ของกรณี แต่เมื่อเร็ว ๆ นี้ฉันพบว่า MySQL ประเมินคอลัมน์เป็น "null" ถ้า (และเฉพาะในกรณี) คอลัมน์นั้นมีอักขระ null ("\ 0") Oracle ในทางกลับกันจะไม่ประเมิน "\ 0" ว่าเป็นโมฆะโดยเลือกที่จะถือว่าเป็นสตริงที่มีความยาว 1 (โดยที่หนึ่งอักขระนั้นเป็นอักขระ null) สิ่งนี้อาจทำให้เกิดความสับสนหากไม่ได้รับการจัดการอย่างถูกต้องเนื่องจากผู้พัฒนาเว็บจำนวนมากทำงานกับฐานข้อมูลส่วนหลังซึ่งอาจผ่านค่า "null" ประเภทต่างๆ มันควรจะอยู่ด้านหลังของความคิดของนักพัฒนาทุกคน
cartbeforehorse

10

ขณะที่เราสามารถมีฟังก์ชั่นที่ตรวจสอบทั้งหมด 'เปล่า' เหมือนโมฆะ undefined, '', '', {} [] ดังนั้นฉันเพิ่งเขียนสิ่งนี้

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;
    }
}

ใช้เคสและผลลัพธ์

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

ณ ตอนนี้ไม่มีวิธีโดยตรงเช่น string.empty เพื่อตรวจสอบว่าสตริงว่างเปล่าหรือไม่ แต่ในรหัสของคุณคุณสามารถใช้การตรวจสอบ wrapper สำหรับสตริงว่างเช่น:

// 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.

}

การใช้สิ่งนี้คุณสามารถมั่นใจได้ว่าสตริงนั้นไม่ได้ถูกกำหนดหรือเป็นโมฆะ จำไว้ว่า undefined, null และ empty เป็นสามสิ่งที่แตกต่างกัน


มันจะโยนข้อผิดพลาดเป็นโมฆะหรือไม่ได้กำหนดสาเหตุที่เราไม่ควรทำการดำเนินการโดยตรงกับตัวแปรที่เป็นโมฆะหรือไม่ได้กำหนด - ตรวจสอบว่ามี str ก่อนที่จะทำสิ่งนี้ตามที่ระบุไว้ในคำตอบอื่น ๆ = '' แต่ไม่อนุญาตให้ abc = '' ทั้งสองนี้แตกต่างกัน
whoami

พิจารณาlet rand = ()=>Math.random()แล้วrand && rand.length > 0)ส่งกลับเท็จ แต่fnชัดเจนไม่ใช่ "ว่าง" นั่นคือมันส่งกลับค่า false สำหรับฟังก์ชันใด ๆ ที่ไม่มีพารามิเตอร์รูปแบบ
RobG

@RobG Math.random()ส่งคืนตัวเลขและไม่ใช่สตริง และคำตอบนี้เป็นเรื่องเกี่ยวกับสตริง ;-)
Harshit Agarwal

10

คำตอบทั้งหมดเหล่านี้เป็นสิ่งที่ดี

แต่ฉันไม่แน่ใจว่าตัวแปรนั้นเป็นสตริงไม่ได้มีแค่ช่องว่าง (สิ่งนี้สำคัญสำหรับฉัน) และสามารถมี '0' (สตริง)

รุ่นของฉัน:

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

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

ตัวอย่างในjsfiddle


1
ฮะ? หากคุณคาดหวังสตริงempty(0)และempty(7)ควรส่งคืนค่าเดียวกัน
Bennett McElwee

ในกรณีของฉันโดยเฉพาะ - empty("0")ต้องส่งคืนfalse(เพราะนั่นไม่ใช่สตริงว่าง) แต่empty(0)ต้องส่งคืนtrueเนื่องจากมันว่างเปล่า :)
Andron

แต่ 0 ไม่ว่างเปล่า! มันคือตัวเลขและตัวเลขต้องไม่เต็มหรือว่างเปล่า แน่นอนมันเป็นฟังก์ชั่นของคุณดังนั้นต้องเป็นไปตามข้อกำหนดของคุณ แต่emptyเป็นชื่อที่ทำให้เข้าใจผิดในกรณีนี้
Bennett McElwee

ฉันคิดว่าชื่อemptyดี ใน php docs สำหรับฟังก์ชันว่าง : Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE.ความแตกต่างระหว่างPHPและฟังก์ชันนี้ - สตริง'0'นั้นจะไม่ถูกระบุว่าว่างเปล่า
Andron

อย่างที่ฉันพูดมันเป็นหน้าที่ของคุณ: เรียกมันว่าสิ่งที่คุณต้องการ แต่emptyเป็นชื่อที่ไม่ถูกต้องและทำให้เข้าใจผิด เป็นที่น่าสนใจว่า PHP ยังมีemptyฟังก์ชั่นที่ตั้งชื่อไม่ดีแต่ความล้มเหลวของ PHP ไม่มีส่วนเกี่ยวข้องกับ JavaScript
Bennett McElwee

10

ฉันไม่เห็นคำตอบที่ดีที่นี่ (อย่างน้อยก็ไม่ใช่คำตอบที่เหมาะกับฉัน)

ดังนั้นฉันตัดสินใจที่จะตอบตัวเอง:

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

คุณต้องเริ่มตรวจสอบว่ามันไม่ได้กำหนด มิฉะนั้นวิธีการของคุณสามารถระเบิดและจากนั้นคุณสามารถตรวจสอบว่ามันเป็นโมฆะหรือเท่ากับสตริงที่ว่างเปล่า

คุณไม่มี !! หรือเพียงif(value)เพราะถ้าคุณตรวจสอบ0มันจะให้คำตอบที่ผิด (0 เป็นเท็จ)

ด้วยวิธีที่กล่าวมาห่อมันด้วยวิธีดังนี้:

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

ป.ล. : คุณไม่จำเป็นต้องตรวจสอบ typeofเพราะมันจะระเบิดและขว้างก่อนที่มันจะเข้าสู่วิธีการ


อาจใช้ Boolean (ค่า) การสร้างที่ดีกว่าที่ไม่ได้กำหนดและค่า null (และ 0, -0, เท็จ, NaN) เป็นเท็จ ดูstackoverflow.com/questions/856324/…
Zhuravlev A.

9

หากต้องการตรวจสอบไม่เพียง แต่ว่างเปล่า แต่ยังสตริงว่างฉันจะเพิ่มคำตอบของ Goral:

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

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


8

คุณสามารถเพิ่มไปยังวัตถุStringดั้งเดิมในJavaScriptและนำมาใช้ซ้ำแล้วซ้ำอีก ...
สิ่งที่ง่ายเช่นรหัสด้านล่างสามารถทำงานให้คุณได้ถ้าคุณต้องการตรวจสอบ''สตริงว่าง:

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

มิฉะนั้นหากคุณต้องการตรวจสอบทั้ง''สตริงว่างและ' 'มีช่องว่างคุณสามารถทำได้โดยเพิ่มเพียงtrim()บางอย่างเช่นโค้ดด้านล่าง:

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

และคุณสามารถเรียกมันด้วยวิธีนี้:

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

การทำเช่นนั้นมีประโยชน์อะไร!(!!this.length)มากกว่าเพียงแค่!this(หรือ!this.trim()ตัวเลือกที่สอง) สตริงที่มีความยาวเป็นศูนย์นั้นมีความผิดพลาดอยู่แล้ววงเล็บคือซ้ำซ้อนและลบล้างสามครั้งนั้นเหมือนกับลบทิ้งหนึ่งครั้ง
John Montgomery


8

ฉันได้ทำการวิจัยบางอย่างเกี่ยวกับสิ่งที่เกิดขึ้นถ้าคุณส่งค่าที่ไม่ใช่สตริงและไม่ว่าง / ไม่มีค่าเป็นฟังก์ชันผู้ทดสอบ หลายคนรู้ว่า (0 == "") เป็นความจริงใน JavaScript แต่เนื่องจาก 0 เป็นค่าและไม่ว่างเปล่าหรือเป็นโมฆะคุณอาจต้องการทดสอบ

สองฟังก์ชันต่อไปนี้จะคืนค่าเป็นจริงเฉพาะสำหรับค่าที่ไม่ได้กำหนดค่าว่างค่าว่าง / ช่องว่างและค่าเท็จสำหรับทุกอย่างเช่นตัวเลขบูลีนวัตถุนิพจน์ ฯลฯ

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

มีตัวอย่างที่ซับซ้อนมากขึ้น แต่สิ่งเหล่านี้เรียบง่ายและให้ผลลัพธ์ที่สอดคล้องกัน ไม่จำเป็นต้องทดสอบสำหรับไม่ได้กำหนดเนื่องจากมันรวมอยู่ในการตรวจสอบ (ค่า == null) คุณอาจเลียนแบบพฤติกรรมC #โดยเพิ่มลงใน String ดังนี้:

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

คุณไม่ต้องการที่จะใส่มันไว้ในต้นแบบ Strings เพราะถ้าอินสแตนซ์ของ String-class เป็นโมฆะมันจะเกิดข้อผิดพลาด:

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

ฉันทดสอบกับอาร์เรย์ค่าต่อไปนี้ คุณสามารถวนซ้ำเพื่อทดสอบการทำงานของคุณหากมีข้อสงสัย

// 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; } }]
];

หากคุณเพียงหยุดใช้ == และใช้ === นี่จะช่วยแก้ปัญหาได้หาก (s === "")
Scott Marcus

8

ในการตรวจสอบว่าเป็นสตริงว่างหรือไม่:

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

ในการตรวจสอบว่าเป็นสตริงว่างหรือเทียบเท่าเชิงตรรกะสำหรับไม่มีค่า (null, ไม่ได้กำหนด, 0, NaN, false, ... ):

if(!val)...

7

ไม่มีisEmpty()วิธีใดคุณต้องตรวจสอบประเภทและความยาว:

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

การตรวจสอบชนิดเป็นสิ่งจำเป็นในการสั่งซื้อเพื่อหลีกเลี่ยงข้อผิดพลาดเมื่อtestเป็นหรือundefinednull


7

ไม่สนใจสตริง whitespace คุณสามารถใช้สิ่งนี้เพื่อตรวจสอบค่าว่างเปล่าและไม่ได้กำหนด:

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

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

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

มันกระชับและใช้งานได้กับคุณสมบัติที่ไม่ได้กำหนดแม้ว่ามันจะไม่สามารถอ่านได้มากที่สุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.