ฉันสับสนเล็กน้อยเกี่ยวกับ Javascript ที่ไม่ได้กำหนด & null
null
อย่าสับสนเกี่ยวกับ โดยทั่วไปแล้วจะมีเหตุผลและมีความคล้ายคลึงกับแนวคิดของภาษาสคริปต์อื่น ๆ เกี่ยวกับออบเจ็กต์นอกขอบเขต 'โมฆะ', 'ไม่มี' หรือ 'ไม่มี'
undefined
ในทางกลับกันเป็นจาวาสคริปต์ที่แปลกประหลาด null
มันเป็นวัตถุเดี่ยวที่แสดงถึงการออกจากวงของค่านิยมหลักที่สองคล้ายกัน แต่แตกต่างกัน มันเกิดขึ้น:
เมื่อคุณเรียกใช้ฟังก์ชั่นที่มีการขัดแย้งน้อยกว่ารายการข้อโต้แย้งในfunction
รายการคำสั่งข้อโต้แย้ง unpassed undefined
มีการกำหนดให้ คุณสามารถทดสอบสิ่งนั้นด้วยเช่น:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
ด้วยวิธีนี้คุณจะไม่สามารถบอกความแตกต่างระหว่างdosomething(1)
และdosomething(1, undefined)
; arg2
จะเป็นค่าเดียวกันทั้งคู่ หากคุณต้องการบอกความแตกต่างคุณสามารถดูได้arguments.length
แต่การทำข้อโต้แย้งเพิ่มเติมเช่นนั้นไม่สามารถอ่านได้โดยทั่วไป
เมื่อฟังก์ชั่นไม่มีreturn value;
มันจะกลับundefined
มา โดยทั่วไปไม่จำเป็นต้องใช้ผลลัพธ์การส่งคืนดังกล่าว
เมื่อคุณประกาศตัวแปรโดยมีvar a
คำสั่งในบล็อก undefined
แต่ยังไม่ได้กำหนดค่าให้มันเป็น อีกครั้งคุณไม่จำเป็นต้องพึ่งพาสิ่งนั้นจริงๆ
typeof
ผู้ประกอบการที่น่ากลัวกลับมา'undefined'
เมื่อตัวถูกดำเนินการเป็นตัวแปรง่ายที่ไม่มีอยู่แทนที่จะโยนข้อผิดพลาดตามปกติจะเกิดขึ้นหากคุณพยายามที่จะอ้างถึง (คุณสามารถให้มันเป็นตัวแปรง่ายๆที่อยู่ในวงเล็บ แต่ไม่ใช่นิพจน์เต็มรูปแบบที่เกี่ยวข้องกับตัวแปรที่ไม่มีอยู่) ไม่ได้ใช้งานมากนักสำหรับสิ่งนั้น
นี่คือข้อขัดแย้ง เมื่อคุณเข้าถึงคุณสมบัติของวัตถุที่ไม่มีอยู่คุณจะไม่ได้รับข้อผิดพลาดเช่นในภาษาอื่นทุกภาษาทันที แต่คุณจะได้รับundefined
วัตถุ (และเมื่อคุณพยายามใช้undefined
วัตถุนั้นในสคริปต์มันจะผิดไปในทางที่แปลกกว่านั้นยากที่จะติดตามมากกว่าถ้า JavaScript เพิ่งโยนข้อผิดพลาดทันที)
มักใช้เพื่อตรวจสอบการมีอยู่ของคุณสมบัติ:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
อย่างไรก็ตามเนื่องจากคุณสามารถกำหนดundefined
เช่นเดียวกับค่าอื่น ๆ :
o.prop= undefined;
ที่ไม่ได้ตรวจสอบจริง ๆ ว่าทรัพย์สินนั้นมีความน่าเชื่อถือ ดีกว่าที่จะใช้in
โอเปอเรเตอร์ซึ่งไม่ได้อยู่ใน JavaScript เวอร์ชัน Netscape ดั้งเดิม แต่สามารถใช้ได้ทุกที่ในขณะนี้:
if ('prop' in o)
...
โดยสรุปundefined
เป็นระเบียบเฉพาะ JavaScript ซึ่งสร้างความสับสนให้ทุกคน นอกเหนือจากอาร์กิวเมนต์ฟังก์ชันที่เป็นตัวเลือกที่ JS ไม่มีกลไกหรูหราอื่น ๆundefined
ควรหลีกเลี่ยง ไม่ควรเป็นส่วนหนึ่งของภาษา null
จะทำงานได้ดีสำหรับ (2) และ (3) และ (4) เป็นความผิดพลาดที่มีอยู่เพียงเพราะใน JavaScript เริ่มต้นไม่มีข้อยกเว้น
สิ่งที่ไม่if (!testvar)
จริงทำอย่างไร มันทดสอบสำหรับไม่ได้กำหนดและเป็นโมฆะหรือเพียงแค่ไม่ได้กำหนด?
เช่น 'truthiness' การตรวจสอบการทดสอบกับfalse
, undefined
, null
, 0
, NaN
และสตริงที่ว่างเปล่า แต่ในกรณีนี้ใช่มันเป็นเรื่องที่undefined
เกี่ยวข้องจริงๆ IMO if (testvar!==undefined)
มันควรจะเป็นมากขึ้นอย่างชัดเจนเกี่ยวกับที่และการพูด
เมื่อตัวแปรถูกกำหนดฉันสามารถล้างมันกลับเป็น undefined (ดังนั้นการลบตัวแปร)
คุณสามารถกำหนดให้undefined
กับมันได้อย่างแน่นอนแต่นั่นจะไม่ลบตัวแปร มีเพียงdelete object.property
ผู้ให้บริการเท่านั้นที่จะลบสิ่งต่าง ๆ
delete
มีความหมายจริงๆสำหรับคุณสมบัติมากกว่าตัวแปรเช่นนี้ เบราว์เซอร์จะช่วยให้คุณหนีออกไปได้อย่างอิสระdelete variable
แต่ไม่ใช่ความคิดที่ดีและจะไม่ทำงานในโหมดที่เข้มงวดของ ECMAScript Fifth Edition หากคุณต้องการเพิ่มการอ้างอิงถึงบางสิ่งบางอย่างเพื่อให้สามารถรวบรวมขยะvariable= null
ได้
ฉันจะส่งผ่านไม่ได้กำหนดเป็นพารามิเตอร์ได้หรือไม่
ใช่.