วิธีที่ง่ายที่สุดในการตรวจสอบว่าสตริงเป็นโมฆะหรือว่างเปล่า


87

ฉันมีรหัสนี้ที่ตรวจสอบสตริงว่างหรือค่าว่าง มันทำงานในการทดสอบ

eitherStringEmpty= (email, password) ->
  emailEmpty = not email? or email is ''
  passwordEmpty = not password? or password is ''
  eitherEmpty = emailEmpty || passwordEmpty         

test1 = eitherStringEmpty "A", "B" # expect false
test2 = eitherStringEmpty "", "b" # expect true
test3 = eitherStringEmpty "", "" # expect true
alert "test1: #{test1} test2: #{test2} test3: #{test3}"

not email? or email is ''สิ่งที่ฉันสงสัยคือถ้ามีวิธีที่ดีกว่า ฉันสามารถเทียบเท่า C # string.IsNullOrEmpty(arg)ใน CoffeeScript ด้วยการโทรเพียงครั้งเดียวได้หรือไม่? ฉันสามารถกำหนดฟังก์ชันให้มันได้ตลอดเวลา (เหมือนฉัน) แต่ฉันสงสัยว่ามีบางอย่างในภาษาที่ฉันขาด

คำตอบ:


118

ได้:

passwordNotEmpty = not not password

หรือสั้นกว่า:

passwordNotEmpty = !!password

1
นี่คือ "javascript-y" เพิ่มเติมจากสองคำตอบ โดยเฉพาะอย่างยิ่งหากคุณใช้!!เวอร์ชันซึ่งเป็นวิธีทั่วไปในการแคสต์เป็นบูลีนเป็นหลัก ถ้าเป็นเรื่องสำคัญนี่เกือบจะเร็วกว่าการกำหนดฟังก์ชันตามที่เจเรมีแนะนำ
Aaron Dufour

ทุกอย่างได้ผล แต่อันนี้ได้รับการโหวตมากที่สุด ฉันชอบstackoverflow.com/q/8127920/30946สำหรับความสามารถในการอ่าน
jcollum

3
มันล้มเหลวสำหรับสตริงที่มีช่องว่างทั้งหมด ... ดังนั้นจึงไม่ทำงานให้ว่างเปล่า
Arkhitech

1
@Arkhitech blank ไม่ใช่สิ่งเดียวกับว่างเปล่าดังนั้นจึงใช้งานได้
jcollum

2
"ฉลาด" เกินไปสำหรับรสนิยมของฉันในการอ่าน; ไม่คิดว่าฉันจะใช้มัน แต่ก็ใช้ได้ดี
PandaWood

37

มันไม่เทียบเท่ากันทั้งหมด แต่email?.lengthจะเป็นจริงemailก็ต่อเมื่อไม่ใช่ค่าว่างและมี.lengthคุณสมบัติที่ไม่ใช่ศูนย์ หากคุณให้notค่านี้ผลลัพธ์ควรทำงานตามที่คุณต้องการสำหรับทั้งสตริงและอาร์เรย์

ถ้าemailมีnullหรือไม่มี.lengthก็email?.lengthจะประเมินnullเป็นเท็จ หากมี.lengthค่านี้จะประเมินตามความยาวซึ่งจะเป็นเท็จหากว่างเปล่า

ฟังก์ชันของคุณสามารถใช้งานได้ดังนี้:

eitherStringEmpty = (email, password) ->
  not (email?.length and password?.length)

1
@pyrotechnick คำถามไม่ได้ถามเกี่ยวกับการแยกแยะ Arrays จาก Strings มันถามเกี่ยวกับการแยกแยะค่า null และสตริงว่างจากสตริงที่ไม่ว่างเปล่า ประเด็นของฉันคือรหัสยังสามารถแยกแยะค่าว่างและอาร์เรย์ว่างจากอาร์เรย์ที่ไม่ว่างเปล่าได้ แต่นั่นก็เกินขอบเขตของคำถาม
Jeremy

อย่างไรก็ตาม "bothStringEmpty" เป็นชื่อที่ไม่ถูกต้องสำหรับวิธีการที่คุณระบุ
ดอกไม้ไฟ

14

นี่เป็นกรณีที่ "ความจริง" มีประโยชน์ คุณไม่จำเป็นต้องกำหนดฟังก์ชันสำหรับสิ่งนั้นด้วยซ้ำ:

test1 = not (email and password)

ทำไมมันถึงได้ผล?

'0'       // true
'123abc'  // true
''        // false
null      // false
undefined // false

1
ฉันถือว่าคุณได้เรียก.trim()ค่านี้เป็นส่วนหนึ่งของตรรกะการตรวจสอบความถูกต้องของคุณแล้ว คำตอบคือข้อมูลเพิ่มเติมเกี่ยวกับไวยากรณ์ CS
Ricardo Tomasi

5
unless email? and email
  console.log 'email is undefined, null or ""'

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



1

หากคุณต้องการตรวจสอบว่าเนื้อหาเป็นสตริงไม่ใช่ null และไม่ใช่อาร์เรย์ให้ใช้การเปรียบเทียบ typeof แบบง่าย:

 if typeof email isnt "string"

typeof email isnt "string"ส่งคืนเท็จสำหรับทั้งสอง''และ'a'
jcollum

1

นี่คือjsfiddle ที่สาธิตวิธีที่ง่ายมากในการทำสิ่งนี้

โดยพื้นฐานแล้วคุณเพียงแค่ทำสิ่งนี้คือจาวาสคริปต์:

var email="oranste";
var password="i";

if(!(email && password)){
    alert("One or both not set");        
}
else{
    alert("Both set");   
}

ในกาแฟ:

email = "oranste"
password = "i"
unless email and password
  alert "One or both not set"
else
  alert "Both set"

หวังว่านี่จะช่วยใครสักคน :)


1

ฉันคิดว่าเครื่องหมายคำถามเป็นวิธีที่ง่ายที่สุดในการเรียกใช้ฟังก์ชันบนสิ่งของหากสิ่งนั้นมีอยู่จริง

ตัวอย่างเช่น

car = {
  tires: 4,
  color: 'blue' 
}

อยากได้สี แต่ถ้ามีรถอยู่ ...

กาแฟ

 car?.color

แปลเป็น javascript:

if (car != null) {
  car.color;
}

เรียกว่าตัวดำเนินการอัตถิภาวนิยมhttp://coffeescript.org/documentation/docs/grammar.html#section-63


สตริงว่างส่งคืนจริงสำหรับการตรวจสอบการมีอยู่
jcollum

1

ฉันค่อนข้างแน่ใจว่าคำตอบของ @thejh นั้นดีพอที่จะตรวจสอบสตริงว่าง แต่ฉันคิดว่าเราต้องตรวจสอบบ่อยๆว่า 'มีอยู่จริงหรือไม่' จากนั้นเราต้องตรวจสอบว่า "ว่างไหม รวมสตริงอาร์เรย์และวัตถุ '

นี่เป็นวิธีที่สั้นลงสำหรับ CoffeeScript ในการทำสิ่งนี้

tmp? and !!tmp and !!Object.keys(tmp).length

ถ้าเราเก็บคำสั่งคำถามนี้ไว้คำสั่งนี้จะถูกตรวจสอบ 1. มีอยู่หรือไม่? 2. สตริงไม่ว่างเปล่า? 3. ไม่ใช่วัตถุว่างเปล่า?

ดังนั้นจึงไม่มีปัญหาใด ๆ สำหรับตัวแปรทั้งหมดแม้ว่าจะไม่มีอยู่ก็ตาม



0

แทนที่จะเป็นคำตอบที่ยอมรับpasswordNotEmpty = !!passwordคุณสามารถใช้ได้

passwordNotEmpty = if password then true else false

ให้ผลลัพธ์เดียวกัน (ความแตกต่างเฉพาะในรูปแบบไวยากรณ์)

ในคอลัมน์แรกเป็นค่าในคอลัมน์ที่สองเป็นผลลัพธ์ของif value:

0 - false
5 - true
'string' - true
'' - false
[1, 2, 3] - true
[] - true
true - true
false - false
null - false
undefined - false
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.