จาวาสคริปต์ตรวจสอบว่าไม่เป็นโมฆะ


134

ด้านล่างนี้เป็นข้อมูลโค้ดที่เราดึงค่าแบบฟอร์ม ก่อนประมวลผลเพิ่มเติมให้ตรวจสอบว่าค่าไม่เป็นโมฆะ ..

var val = document.FileList.hiddenInfo.value;
alert("val is " + val);  // this prints null which is as expected
if (val != null)
{
   alert("value is "+val.length); // this returns 4
}
else
{
   alert("value* is null");
}

มีความคิดว่าทำไมมันถึงเกิดขึ้น .. ??


2
CW เกิดขึ้นเนื่องจากผู้ใช้ 6+ คนแก้ไขคำถาม
คุณ

! == แทน! =
GetBackerZ

คำตอบ:


78

เป็นเพราะ val ไม่ใช่nullแต่มี'null'เป็นสตริง

ลองตรวจสอบด้วย 'null'

if ('null' != val)

สำหรับคำอธิบายเมื่อและทำไมงานนี้ดูรายละเอียดด้านล่าง


2
ควรจะเป็น if (null! = val) อย่างใดมันใช้ไม่ได้กับคำพูด
อนันดา

Mr.x ในคำถาม null เท่ากับสตริง ... กรณีของคุณอาจแตกต่างออกไป
Arsen Mkrtchyan

146

นี่จะเป็นเคล็ดลับสำหรับคุณ

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}

22
ในขณะที่เทคนิคนี้ใช้งานได้ double not (!!) คือการเขียนโปรแกรม faux-pas มันเทียบเท่าจริงๆif(val)ซึ่งอ่านได้ชัดเจนกว่ามาก ฉันจะยึดติดกับสิ่งนั้น (fyi Ujwal, !! val ควรทำงานในทางเทคนิคใน C หรือ C ++ ด้วย) ดูที่นี่สำหรับค่า 'ความจริง' ของจาวาสคริปต์: janosch.woschitz.org/javascript-equality-comparison
Will Buck

2
แล้วถ้า (! Boolean (val))
thedjaney

1
!! เป็นเพียงลบสองเท่าดังนั้นจึงบอกได้ว่า if (val.exists) ฉันยังคงชอบที่มันดูเหมือน!
Kurai Bankusu

12
สิ่งนี้จะล้มเหลวหากval = 0ตั้งแต่!!0ประเมินเป็นเท็จ
punkrockpolly

3
มันไม่ใช่ลบสองเท่าง่ายๆ มันเป็นการเปลี่ยนค่าลบสองเท่า คุณกำลังเปลี่ยนตัวแปรเป็นบูลีน มีจำนวนมากที่จะพูดเกี่ยวกับเรื่องนี้ แต่พอจะพูดได้ว่าในกรณีที่มีตัวแปรของคุณคือเป็น0, false, null, undefinedหรือค่าดังกล่าวที่หายไปtrueกับหนึ่ง! คุณกำลังจะได้รับfalseสำหรับ !! ควรใช้เท่าที่จำเป็นถ้าเลย
Guy Passy

84

มี 3 วิธีในการตรวจสอบว่า "not null" คำแนะนำของฉันคือใช้ Strict Not Version

1. เวอร์ชั่นไม่เข้มงวด

if (val !== null) { ... }

เข้มงวดไม่เวอร์ชันใช้ "เข้มงวดเท่าเทียมกันเปรียบเทียบขั้นตอนวิธีการ" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 !==มีประสิทธิภาพการทำงานได้เร็วขึ้นกว่า!=ผู้ประกอบการเพราะเข้มงวดเท่าเทียมกันเปรียบเทียบขั้นตอนวิธีการไม่ typecast ค่า

2. ไม่เข้มงวดไม่ใช่เวอร์ชัน

if (val != 'null') { ... }

รุ่นไม่เข้มงวดใช้ "ความเท่าเทียมกันบทคัดย่อเปรียบเทียบขั้นตอนวิธีการ" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 !=มีประสิทธิภาพการทำงานที่ช้ากว่า!==ผู้ประกอบการเนื่องจากความเท่าเทียมกันบทคัดย่อเปรียบเทียบขั้นตอนวิธีการ typecasts ค่า

3. ดับเบิลไม่ใช่เวอร์ชัน

if (!!val) { ... }

Double Not Version !!มีประสิทธิภาพที่เร็วกว่าทั้ง Strict Not Version !==และ Non-Strict Not Version !=( https://jsperf.com/tfm-not-null/6 ) อย่างไรก็ตามจะพิมพ์ค่า "Falsey" เช่นundefinedและNaNเป็น False ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ) ซึ่งอาจนำไปสู่ผลลัพธ์ที่ไม่คาดคิดและมีความสามารถในการอ่านที่แย่ลงเนื่องจากnullไม่ได้ระบุไว้อย่างชัดเจน


มันแปลกมาก !!valทำงานให้ฉัน แต่val!==nullยังไม่ได้ เป็นเพราะอะไร?
TheLogicGuy

@TheLogicGuy - ประเภทข้อมูลvalคืออะไร? console.log(typeof val).
tfmontague

จำนวน. รหัสจะลบค่า "ไม่ดี" ออกจากอาร์เรย์ (null, 0 ฯลฯ ) นี่คือรหัส: pastebin.com/L7Z1BtuL
TheLogicGuy

1
@TheLogicGuy - ปัญหาที่แท้จริงของคุณไม่มีส่วนเกี่ยวข้องกับ null NaN กรองไม่ถูกต้องซึ่งจะคืนค่าจริงเสมอ สิ่งนี้ควรได้ผล:! (isNaN (val) && (typeof val! == "undefined")) ใน Javascript มีแนวคิดที่เรียกว่า "Truthy" และ "Falsey" คู่ไม่ได้ผู้ประกอบการจะลบมากกว่าเพียงแค่!! nullมันจะแปลงNaNและundefinedเป็นเท็จเช่นกัน !!และที่ว่าทำไมฟิลเตอร์อาร์เรย์ของคุณได้อย่างถูกต้องเมื่อใช้คู่ไม่ดำเนินการ
tfmontague

30

ใช้!==เป็น!=จะนำคุณเข้าสู่โลกของตารางความจริง JavaScript ที่ไม่แปรเปลี่ยน


ถ้าคุณต้องการที่จะตรวจสอบเฉพาะสำหรับหรือundefined nullซึ่งในกรณีนี้val != nullจะกลับมาtrueสำหรับundefinedหรือnullแต่ไม่ได้สำหรับค่า falsey อื่น ๆ 0เช่น
Eric H

8

คุณควรใช้ตัวnot equalsดำเนินการเปรียบเทียบที่เข้มงวด!==เพื่อที่ว่าหากผู้ใช้ป้อนข้อมูล"null"คุณจะไม่ไปที่ไฟล์else.


1
Susan Null จะไม่พอใจถ้าชื่อของเธอไม่ได้รับการยอมรับในแบบฟอร์มการป้อนข้อมูล lol
Andez





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