ความหมายที่ไม่ได้นิยามใน JavaScript คืออะไร? ทำไมถึงอยู่ที่นั่น? ประเพณีมีอะไรบ้าง? มันจะมีประโยชน์อย่างไร


11

ใน JavaScript เรามีสิ่งที่เรียกว่าไม่ได้กำหนด ฉันพูดอะไรบางอย่างเพราะฉันไม่รู้ว่ามันเป็นคลาสพื้นฐานหรือตัวแปรบิวด์อินหรือคำหลักหรืออย่างอื่น ฉันเพิ่งรู้ว่ามันมี

หากต้องการดูการทำงานคุณสามารถเขียน:

undefined;
typeof undefined;

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

เราจะใช้สิ่งนี้ใน JavaScript ได้อย่างไร?



สิ่งนี้ถูกกล่าวถึงอาการคลื่นไส้ที่นี่stackoverflow.com/questions/6999291/…
พอล

คำตอบ:


13

มีสองสิ่งที่คุณต้องเข้าใจเกี่ยวกับการไม่ได้กำหนด ...

  • ชนิด undefinedที่สามารถมีได้เพียงหนึ่งค่า
  • ตัวแปร undefined

ตอนนี้อ่านต่อไปนี้อย่างระมัดระวัง ...

  • มีประเภทค่ามากมายnumber(10, 10.01, 1e1) แต่จะมีเพียงหนึ่งค่าประเภทundefinedและค่าที่undefinedถูกเก็บไว้ในตัวแปร ค่าที่มีตัวแทนที่แท้จริง NO - ตัวอย่างเช่นค่าจำนวน1, 100, 1e-1มีตัวอักษรทั้งหมดของจำนวนชนิด แต่ค่าที่เก็บไว้ในตัวแปรundefinedไม่มีรูปแบบอักษร

  • undefinedเป็นตัวแปรเพียงแค่ตัวแปรปกติที่ JavaScript ประกาศและกำหนดค่าประเภทundefinedในขอบเขตส่วนกลาง ดังนั้นคุณสามารถทำสิ่งต่อไปนี้ ...

  พิมพ์ไม่ได้กำหนด; // "ไม่ได้กำหนด"

  undefined = 100;
  พิมพ์ไม่ได้กำหนด; // "หมายเลข"

  undefined = void 0;
  พิมพ์ไม่ได้กำหนด; // "ไม่ได้กำหนด"

  window.undefined === ไม่ได้กำหนด; // จริง
  window.undefined === โมฆะ 0; // จริง
  
  • ถ้าคุณไม่ต้องการที่จะใช้ตัวแปรundefinedคุณสามารถสร้างมูลค่าของชนิดundefinedโดยการแสดงออกvoid 0- undefinedมีวัตถุประสงค์เพียงอย่างเดียวคือการกลับค่าของประเภท

... ใครก็ได้ช่วยอธิบายหน่อยได้ไหมว่าทำไมสิ่งนี้ถึงถูกแทรกลงใน JavaScript ...

NO เหมือนไม่มีใครสามารถอธิบายได้ว่าทำไมตัวแปรที่ไม่ได้ประกาศจึงไปยังขอบเขตทั่วโลกแทนที่จะเป็นโลคัล คุณเพียงแค่ต้องฝึกตัวเองให้ใช้มันอย่างชาญฉลาดแทนที่จะพยายามหาเหตุผลว่ามีอยู่จริง

... เรามีค่า Null ...

แม้ว่าจะnullสามารถทำสิ่งต่าง ๆundefinedได้มันเกี่ยวข้องกับobjectsสเกลาร์มากกว่าหรือน้อยกว่า อันที่จริงจาวาสคริปต์ถือว่าnullตัวเองวัตถุ - typeof nullส่งคืน "วัตถุ"

ในความคิดของบรรทัดล่างคือที่จะไม่พยายามที่จะเหตุผลวัตถุประสงค์ที่แน่นอนของundefinedและnull- และใช้พวกเขาในรหัสของคุณ intelligibly เพื่อให้รหัสของคุณสามารถอ่านได้, การบำรุงรักษาและนำมาใช้ใหม่


2
คำอธิบายที่ดี @greengit the bottom line is to NOT try to reason the absolute purposes of undefined and nullดูเหมือนว่า JavaScript นั้นเล็กกว่าที่จะเป็นภาษาเชิงตรรกะและเราก็ต้องคุ้นเคยกับมันเช่นทดลองโลกใหม่
Saeed Neamati

1
"ซึ่งมีวัตถุประสงค์เพียงอย่างเดียวคือส่งคืนค่าประเภทundefined" voidประเมินนิพจน์จริงโดยไม่สนใจค่าส่งคืนและส่งคืนundefinedค่า สำหรับความแตกต่าง undefinedถูกใช้โดยเอ็นจิน JS เพื่อบอกว่าสิ่งนี้ไม่มีค่า nullถูกใช้โดยคุณเพื่อบอกว่าสิ่งนี้ไม่มีค่า มีความแตกต่างที่ชัดเจน
Raynos

1
undefined = 100; typeof undefined;ส่งกลับ "undefined" สำหรับฉันถ้าคุณพยายามที่จะกำหนดให้เป็นโมฆะคุณจะได้รับข้อผิดพลาด แค่อยากจะชี้แจงว่าสำหรับผู้อ่านในอนาคต
Josh Rumbut

6

ขออภัยที่ตอบคำถามที่เก่ากว่า แต่เหตุผลที่คุณต้องการทั้ง undefined และ null นั้นง่าย: ในภาษาที่ใช้การพิมพ์โดยใช้เป็ดคุณต้องแยกความแตกต่างระหว่าง "วัตถุนี้ไม่ได้กำหนดค่าสำหรับ X" และ "วัตถุนี้บอกว่า X คือ ไม่มีอะไร / null / ว่างเปล่า"

หากไม่มีความสามารถนี้จะไม่มีทางที่จะเดินโซ่ต้นแบบและการสืบทอดไม่สามารถทำได้ คุณต้องสามารถระบุได้ว่า obj.someProp นั้นไม่ได้ถูกกำหนดดังนั้นคุณสามารถดู obj.prototype.someProp และขึ้นไปบนลูกโซ่จนกว่าคุณจะพบค่า ถ้า obj.someProp คืนค่า null จะไม่มีทางรู้ได้ว่าเป็นโมฆะหรือหมายถึง "ดูต้นแบบของฉัน" วิธีอื่นในการทำเช่นนี้คือการฉีดเวทย์มนตร์ kludgy ที่อยู่เบื้องหลังซึ่งทำให้ความสามารถของคุณเลือนด้วยโซ่ต้นแบบและทำเวทมนต์ JS ดำอื่น ๆ

เช่นเดียวกับจาวาสคริปต์ส่วนใหญ่ความคิดที่ไม่ได้นิยามและไม่มีค่าดูเหมือนไร้ประโยชน์และโง่เง่าในตอนแรกจากนั้นก็สดใสในภายหลัง (จากนั้นกลับสู่ความสับสนและโง่เขลา

ภาษาอย่าง C # จะไม่คอมไพล์ถ้าคุณเข้าถึงพร็อพเพอร์ตี้ที่ไม่มีอยู่และภาษาไดนามิกอื่น ๆ มักจะโยนข้อยกเว้นตอนรันไทม์เมื่อคุณสัมผัสพร็อพเพอร์ตี้ที่ไม่มีอยู่หมายความว่าคุณต้องใช้โครงสร้างพิเศษเพื่อทดสอบ คลาสพลัสหมายถึงเมื่อมีการสร้างอินสแตนซ์ของออบเจ็กต์ให้คุณทราบถึงห่วงโซ่การสืบทอดและคุณสมบัติทั้งหมดที่มี - ใน JS I สามารถแก้ไขต้นแบบ 15 ขั้นตอนขึ้นไปในเชนและการเปลี่ยนแปลงเหล่านั้นจะปรากฏบนวัตถุที่มีอยู่


3

มีตัวแปรโกลบอลundefinedซึ่งถูกตั้งค่าเป็น undefined คนชั่วร้ายอาจกำหนดให้เป็นอย่างอื่นดังนั้นจึงเป็นการดีที่สุดที่จะไม่ไว้วางใจ

  • ค่าที่ไม่ได้กำหนดคือค่าส่งคืนของฟังก์ชันที่ไม่ส่งคืนค่า
  • ค่าที่ไม่ได้กำหนดคือค่าของตัวแปรที่ไม่ได้รับมอบหมาย
  • ค่าที่ไม่ได้กำหนดคือค่าของพารามิเตอร์ที่ไม่ได้ผ่าน
  • ค่าที่ไม่ได้กำหนดคือค่าของคุณสมบัติที่ยังไม่ได้รับมอบหมาย
  • 'undefined' เป็นประเภทของตัวแปรที่ไม่ได้ประกาศ ( typeof undeclaredVariable == 'undefined'. การพยายามอ่านค่าของตัวแปร underfined จะทำให้คุณถูกโยนทิ้งReferenceError)

nulltypeof null == 'object'เสียอย่างละเอียดเพราะ ฉันไม่รู้ว่าทำไมเราถึงมีundefinedและnullอาจเป็นอุบัติเหตุทางประวัติศาสตร์


2

ดีundefinedคุ้มค่าแมวมองที่ได้รับโดยการประเมินสิ่งที่ไม่ได้กำหนดไว้เมื่อเทียบกับnullซึ่งเป็นค่าที่กำหนดไว้ว่าจะเป็นตัวแทนของอะไร

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

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

คุณสามารถคิดถึงความสัมพันธ์ของundefinedและnullระหว่างNaNและ0กับ


"ค่าส่งคืนของฟังก์ชันที่ไม่ได้กำหนดค่าส่งคืนไม่ได้ถูกกำหนด" คุณหมายถึงสิ่งundefinedนั้นvoidหรือไม่
Saeed Neamati

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