เหตุใดจึงมีค่า "null" ใน JavaScript


116

ใน JavaScript มีสองค่าซึ่งโดยทั่วไปจะบอกว่า 'ฉันไม่อยู่ - และundefinednull

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

ฉันเคยคิดว่ามีความจำเป็นnullเพราะundefinedเป็นค่าดั้งเดิมและnullวัตถุ มันไม่ได้ถึงแม้ว่าtypeof nullจะให้ผลผลิต'object': ที่จริงทั้งสองมีค่าดั้งเดิม - ซึ่งหมายความว่าค่าundefinedมิได้nullสามารถกลับมาจากการทำงานของผู้สร้างขณะที่ทั้งสองจะถูกแปลงเป็นวัตถุที่ว่างเปล่า (หนึ่งที่มีการโยนข้อผิดพลาดความล้มเหลวจงประกาศในการก่อสร้าง)

ทั้งคู่ยังประเมินfalseในบริบทบูลีน ข้อแตกต่างที่แท้จริงที่ฉันสามารถคิดเป็นที่หนึ่งประเมินเพื่อNaNการอื่น ๆ เพื่อ0ในบริบทที่เป็นตัวเลข

เหตุใดจึงมีทั้งสองอย่างundefinedและnullเพียงแค่สร้างความสับสนให้โปรแกรมเมอร์ที่ตรวจสอบไม่ถูกต้องnullเมื่อพยายามค้นหาว่ามีการตั้งค่าคุณสมบัติหรือไม่?

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

ดังนั้นฉันทามติทั่วไปดูเหมือนจะundefinedหมายความว่า 'ไม่มีคุณสมบัติดังกล่าว' ในขณะที่nullหมายถึง 'ทรัพย์สินนั้นมีอยู่จริง แต่ไม่มีค่า'

ฉันสามารถใช้ชีวิตแบบนั้นได้หากการใช้งาน JavaScript บังคับใช้พฤติกรรมนี้จริง - แต่undefinedเป็นค่าดั้งเดิมที่ถูกต้องอย่างสมบูรณ์ดังนั้นจึงสามารถกำหนดให้กับคุณสมบัติที่มีอยู่เพื่อทำลายสัญญานี้ได้อย่างง่ายดาย ดังนั้นหากคุณต้องการตรวจสอบว่ามีคุณสมบัติอยู่หรือไม่คุณต้องใช้ตัวinดำเนินการหรือhasOwnProperty()อย่างไรก็ตาม อีกครั้ง: การใช้ประโยชน์สำหรับค่าที่แยกต่างหากสำหรับundefinedและnullคืออะไร

ฉันใช้จริงundefinedเมื่อต้องการยกเลิกการตั้งค่าคุณสมบัติที่ไม่ได้ใช้งานอีกต่อไป แต่ไม่ต้องการdeleteใช้ ฉันควรใช้nullแทนหรือไม่?


3
undefinedที่จะตอบคำถามสุดท้ายของคุณไม่มีคุณไม่ควรตั้งค่าคุณสมบัติ
Shog9

4
"ไม่ได้กำหนด" เป็นเพียงตัวแปรในขอบเขตส่วนกลางที่มีค่าดั้งเดิม "ไม่ได้กำหนด" เป็นไปได้ที่จะกำหนดค่าอื่นให้กับตัวแปร: {undefined = "Hello"; alert (undefined);} วิธีทดสอบ undefined ที่เชื่อถือได้มากขึ้น: {if (typeof myvar === "undefined") alert ("undefined")}
บาง

1
ดูหัวข้อ 4.3.9 - 12 ในecma-international.org/publications/files/ECMA-ST/Ecma-262.pdfสำหรับ undefined / null และ 15.1.1.3 สำหรับตัวแปร "ไม่ได้กำหนด" ในขอบเขตส่วนกลาง
บางที่

1
คุณควรลบออบเจ็กต์หรือตั้งค่าเป็นโมฆะหากเหมาะสมกว่า แต่ไม่ควรระบุ
บางที่

4
In JavaScript, there are two values which basically say 'I don't exist' - undefined and null.ไม่เพียง แต่undefinedพูดอย่างนั้น
Lightness Races ใน Orbit

คำตอบ:


78

คำถามไม่ได้เป็น "เหตุใดจึงมีค่า null ใน JS" - มีค่า null ของการจัดเรียงบางอย่างในภาษาส่วนใหญ่และโดยทั่วไปถือว่ามีประโยชน์มาก

คำถามคือ "เหตุใดจึงมีค่าที่ไม่ได้กำหนดใน JS" สถานที่สำคัญที่ใช้:

  1. เมื่อคุณประกาศvar x;แต่ไม่มอบหมายให้xถือไม่ได้กำหนดไว้
  2. เมื่อฟังก์ชันของคุณได้รับอาร์กิวเมนต์น้อยกว่าที่ประกาศ
  3. เมื่อคุณเข้าถึงคุณสมบัติอ็อบเจ็กต์ที่ไม่มีอยู่จริง

nullแน่นอนจะใช้งานได้ดีสำหรับ (1) และ (2) * (3) ควรโยนข้อยกเว้นออกไปทันทีและความจริงที่ว่ามันไม่ได้แทนที่จะส่งคืนสิ่งแปลก ๆundefinedที่จะล้มเหลวในภายหลังกลับเป็นปัญหาใหญ่ในการแก้ไขจุดบกพร่อง

*: คุณสามารถโต้แย้งได้ว่า (2) ควรมีข้อยกเว้น แต่คุณจะต้องระบุกลไกที่ดีกว่าและชัดเจนกว่าสำหรับอาร์กิวเมนต์เริ่มต้น / ตัวแปร

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

ฉันใช้ undefined เมื่อฉันต้องการยกเลิกการตั้งค่าของคุณสมบัติที่ไม่ได้ใช้งานอีกต่อไป แต่ฉันไม่ต้องการลบ ฉันควรใช้ null แทนหรือไม่?

ใช่. เก็บundefinedเป็นค่าพิเศษสำหรับการส่งสัญญาณเมื่อภาษาอื่นอาจทำให้เกิดข้อยกเว้นแทน

nullโดยทั่วไปจะดีกว่ายกเว้นในอินเทอร์เฟซ IE DOM บางตัวที่การตั้งค่าบางอย่างnullอาจทำให้คุณเกิดข้อผิดพลาดได้ บ่อยครั้งในกรณีนี้การตั้งค่าเป็นสตริงว่างมีแนวโน้มที่จะทำงาน


10
Args สามารถขยายได้ คุณสามารถวางได้มากเท่าที่คุณต้องการและฟังก์ชันอาจวนซ้ำและใช้ประโยชน์จากฟังก์ชันทั้งหมดได้ ออบเจ็กต์สามารถกำหนดคุณสมบัติใหม่ได้ตลอดเวลา สิ่งเหล่านี้เป็นคุณสมบัติที่ทรงพลังทั้งคู่ แต่ฉันสงสัยว่าการมีข้อยกเว้นตามที่คุณต้องการจะเป็นค่าใช้จ่ายจำนวนมาก IMO คุ้มค่ากับการแลกเปลี่ยน ฉันใช้เวลาในการตรวจสอบการมีอยู่ใน JS น้อยกว่าการแคสต์ด้วยกระบวนทัศน์ภาษาที่เข้มงวดกว่ามาก
Erik Reppen

ตลกดีที่คำตอบที่ยอมรับสำหรับคำถามเริ่มต้นด้วย "นี่ไม่ใช่คำถามจริงๆ ... "
ฟิลลิป

@bobince รุ่นแรกของ JS ไม่มีตัวinดำเนินการหรือhasOwnProperty? เนื่องจากเป็นวิธีที่ปลอดภัยกว่าobj.hello !== undefinedการตรวจสอบว่ามีทรัพย์สินอยู่บนวัตถุหรือไม่
Andy

ไม่เป็นไรฉันตอบคำถามของตัวเอง จากข้อมูลของ MDN ทั้งคู่ได้รับการแนะนำใน ES3
Andy

37

อธิบายได้ดีที่สุดที่นี่แต่โดยสรุป:

ไม่ได้กำหนดคือการขาดประเภทและค่าและค่าว่างคือการขาดค่า

นอกจากนี้หากคุณทำการเปรียบเทียบแบบธรรมดา '==' คุณพูดถูกมันก็ออกมาเหมือนกัน แต่ลอง === ซึ่งเปรียบเทียบทั้งประเภทและค่าแล้วคุณจะสังเกตเห็นความแตกต่าง


1
ฉันรู้ว่าnull !== undefined- คำถามของฉันคือทำไมต้องมีสองสิ่งที่แสดงออกถึงแนวคิดเชิงความหมายเดียวกัน นอกจากนี้ลิงก์ของคุณยังระบุว่า 'null is an object' - นั่นผิดมันเป็นเรื่องดั้งเดิม ...
Christoph

2
ไม่ใช่แนวคิดเชิงความหมายเดียวกัน สำหรับฉันอย่างน้อยก็มีความแตกต่างอย่างมีนัยสำคัญระหว่างคุณสมบัติที่กำหนดค่าว่างและคุณสมบัติที่ไม่มีอยู่
Daniel Schaffer

แต่นั่นไม่ใช่แนวคิดเชิงความหมายเดียวกัน Null ถูกบีบบังคับเมื่อใช้ == เป็นนัยเดียวกันเพื่อความสะดวกของโปรแกรมเมอร์
Eddie Parker

1
@EricElliott: typeofโกหก - อ่านข้อมูลจำเพาะหรือลองกลับnullจากผู้สร้าง
Christoph

5
@EricElliott: ค่าส่งคืนของตัวสร้างไม่มีส่วนเกี่ยวข้องกับ falsy-ness แต่ด้วย object-ness: ถ้าค่าที่ส่งคืนเป็นวัตถุให้ส่งคืนสิ่งนั้น ถ้าเป็นแบบดั้งเดิมเช่นnullหรือ42ให้ทิ้งค่าที่ส่งคืนและส่งคืนวัตถุที่สร้างขึ้นใหม่แทน
Christoph

17

ฉันไม่คิดว่าไม่มีเหตุผลใด ๆ ที่จะมีทั้งสองอย่างnullและundefinedเพราะเหตุผลเดียวที่หลายคนแนะนำ (" undefinedหมายความว่าไม่มีตัวแปร / คุณสมบัติดังกล่าว") ไม่ถูกต้องอย่างน้อยก็ใน JavaScript undefinedไม่สามารถบอกคุณได้ว่ามีตัวแปร / คุณสมบัติอยู่หรือไม่

console.log(foo);               // "ReferenceError: foo is not defined"
                                // foo does not exist
var foo;
console.log(foo);               // "undefined", a different response
console.log(foo === undefined); // "true", but it does exist

var obj = {};
console.log(obj.hasOwnProperty("foo")); // "false", no such property
obj.foo = undefined;
console.log(obj.hasOwnProperty("foo")); // "true", it exists and has the value "undefined"
console.log(obj.foo === undefined);     // "true", but it does exist

obj.bar = "delete me";
obj.bar = undefined;
console.log(obj.hasOwnProperty("bar")); // "true", not actually deleted
delete obj.bar;
console.log(obj.hasOwnProperty("bar")); // "false", deleted

ที่คุณสามารถดูการตรวจสอบfoo === undefinedไม่ได้บอกคุณได้ว่าfooมีอยู่และการตั้งค่าไม่จริงลบobj.bar = undefinedbar

อาจเป็นความตั้งใจดั้งเดิมของผู้เขียน JavaScript ที่undefinedควรแสดงถึง "ไม่มีอยู่จริง" อย่างไรก็ตามการนำไปใช้งานไม่ได้เป็นอย่างนั้น


1
แทนที่undefinedด้วยnullในตัวอย่างโค้ดด้านบนของคุณและการตอบกลับจะเหมือนกันทั้งหมด ฉันไม่แน่ใจว่าสิ่งนี้ตอบคำถามอย่างไร นี่หมายความว่าเป็นการแสดงความคิดเห็นในคำตอบของคนอื่นหรือไม่?
Eric Elliott

1
@EricElliott คำตอบของฉันสำหรับคำถามคือไม่มีเหตุผลที่จะมีทั้งสองอย่างnullและundefinedเพราะเหตุผลเดียวที่หลายคนแนะนำนั้นไม่ถูกต้อง
Lei Zhao

คุณควรแก้ไขคำตอบของคุณและพูดตามจริง ฉันอาจโหวตให้คะแนนถ้าคุณให้คำตอบนั้น =)
Eric Elliott

@EricElliott ฉันคิดว่าคุณพูดถูก ฉันได้แก้ไขคำตอบของฉันแล้ว ขอบคุณ!
Lei Zhao

3
ตัวอย่างนี้แสดงให้เห็นว่าจริง ๆ undefinedแล้วถ้าคุณไม่ได้กำหนดตัวแปรก็จะส่งกลับ แต่ถ้าคุณมอบหมายundefinedให้มันไม่ได้เป็นจริงundefined- มันถูกกำหนดundefinedและมีการอ้างอิงถึงมัน ความแตกต่างเพียงอย่างเดียวระหว่างundefinedและnullคือการใช้งานและวัตถุประสงค์ทางประวัติศาสตร์ พวกเขาทั้งสองเป็นปรมาณู
Aleksej Komarov

6

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


6

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

ฉันจะต้องยอมรับว่าการใช้งานนั้นแปลกเพราะหลายครั้งความแตกต่างจะเบลอ อย่างไรก็ตามฉันคิดว่าใน JavaScript ความแตกต่างเป็นสิ่งสำคัญ และความสามารถในการมอบหมายundefinedเป็นสิ่งสำคัญ

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


คุณช่วยแบ่งปัน RPG นี้ได้ไหม
Michael

3

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


1
แต่คุณสามารถใช้ได้undefinedดีในการกำหนดให้กับคุณสมบัติดังนั้นสัญญานี้ (ส่งคืนเฉพาะในundfinedกรณีที่ไม่มีคุณสมบัติดังกล่าว) โปรแกรมเมอร์สามารถทำลายได้อย่างง่ายดาย ...
คริสตอฟ

2
คุณทำได้แต่คุณไม่ควรอย่างแน่นอนที่สุด Undefined ใช้เป็นรูปแบบข้อยกเว้นพื้นฐาน / เรียบง่ายใน JavaScript - อย่าใช้เป็นค่าและกำหนดให้กับคุณสมบัติบางอย่าง! คนบ้านั่น
rfunduk

3

ในฐานะโปรแกรมเมอร์ Java ฉันเห็นความแตกต่างอย่างมากระหว่าง undefined และ null การเข้ารหัส JavaScript ไม่มากนักเนื่องจาก JavaScript ไม่ได้ถูกพิมพ์อย่างรุนแรงและความแตกต่างระหว่างไม่ได้กำหนดและ null จะเบลอโดยการแปลงอัตโนมัติที่มักเกิดขึ้นตามเวลาทำงาน BTW ฉันใช้ประโยชน์จากการแปลงเหล่านั้นบ่อยๆ ทำให้โค้ด JS ของฉันกะทัดรัดและอ่านง่ายขึ้น

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

null หมายความว่า "ไม่มีค่า" ถูกตั้งค่าไว้อย่างชัดเจน ในทางปฏิบัติคุณกำลังบอกฉันบางอย่างเกี่ยวกับคุณสมบัติบางทีอาจจะไม่ได้ใช้ในบริบทนี้หรือยังไม่ได้กำหนดมูลค่า

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


0

ลองดูตัวอย่างนี้:

<html>
<head>
    <script type="text/javascript">
        function ShowObjProperties(obj) {
            var property, propCollection = "";

            for(property in obj) {
                propCollection += (property + ": " + obj[property] + "\n");
            }

            alert(propCollection);
        }

        var obj = {
            userid: 3,
            name: 'me!',
            speak: function() { alert('Hi! My name is ' + this.name + ' and my ID is ' + this.userid + '.'); }
        }

        //Shows all properties
        ShowObjProperties(obj);

        //The Speak function is no longer in the list!
        delete obj.speak;
        alert(typeof obj.speak);
        ShowObjProperties(obj);

        //The UserID is still listed, it just has no value!
        obj.userid = null;
        ShowObjProperties(obj);
    </script>
</head>
<body>

</body>
</html>

ฉันคิดว่ามีการใช้งานจริงมากสำหรับ 2 ประเภทที่แตกต่างกันที่นี่


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

แต่สิ่งนี้ใช้ได้ตราบเท่าที่ไม่มีใครพยายามทำลายมัน - ถ้าฉันตั้งไว้obj.userid = undefinedมันจะล้มเหลว - ดูการแก้ไขครั้งสุดท้ายสำหรับคำถามของฉัน
Christoph

0

สิ่งที่ลงมาคือลักษณะไดนามิกของจาวาสคริปต์

สิ่งต่างๆอาจไม่ได้กำหนดไว้เพื่อให้สามารถเพิ่มได้ในภายหลัง นี่เป็นเหตุผลว่าทำไมจาวาสคริปต์จึงมีประสิทธิภาพและขยายได้


และสิ่งนี้เกี่ยวข้องกับคำถามของฉันในทางใด?
Christoph

2
มีความเกี่ยวข้องเพราะตอบคำถามของคุณ 'null' คือ 'singleton' ซึ่งหมายความว่า 'ไม่มีค่า' 'ไม่ได้กำหนด' กำลังบอกคุณว่ามีบางอย่าง ... น่าตกใจฉันรู้ ... ไม่ได้กำหนดไว้ สิ่งเหล่านี้แตกต่างกันอย่างสิ้นเชิง
rfunduk

0

เป็นคุณลักษณะทางภาษาที่สำคัญหากคุณรวมโปรแกรมของคุณไว้ในกระบวนทัศน์ของจาวาสคริปต์

// a key exists as a placeholder for something
if(obj[name] === null) 
// no key exists int eh hashtable that is in this object
if(obj[name] === undefined)

สิ่งนี้มีประโยชน์มากหากคุณกำลังจัดการกับชุดข้อมูลที่ต้องการค่าเพื่อแสดงถึง 'nothing' เพื่อระบุการกระทำบางอย่างที่แตกต่างจากการใช้ 'nothing' เพื่อระบุการกระทำเริ่มต้น

filter_func_pt = {
  date:function(d){ return Math.round(d.getTime()/1000);},
  user: null,
}

function transform(obj){
    var ret = {};
    for( var prop in obj){
       var f = filter_func_pt[prop];
       if(f)
          ret[prop] = f(obj);
       else if(filter_func_pt[prop] === null)
         continue;
       else
         ret[prop] == obj;
    }
  return ret;
}

var a = {
   date: new Date(),
   user: 'sam'
   votes: [23, 41, 55] 
};

var b = transform(a);

/* b = {
 *    date: 1298582417
 *    votes: [23, 41, 55]
 * }
 */

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


ตัวอย่างนี้สร้างขึ้นและเป็นเรื่องไร้สาระเล็กน้อย Null ไม่ได้ชี้แจงเจตนาของคุณเลย - แต่เป็นการปิดบังไว้ คุณสามารถใช้สตริงที่ชัดเจนกว่านี้เพื่อชี้แจงความหมาย เช่น 'ระงับ' หรือ 'แถบ' จากนั้นคุณยังสามารถระบุประเภทฟังก์ชันได้อย่างชัดเจนมากขึ้นและตรวจสอบว่ามีฟังก์ชันอยู่หรือไม่
Eric Elliott

0

เป็นโมฆะที่สวยงาม

เช่นเดียวกับ Live Script ประเภทอื่น ๆ ทั้งหมด

อ้างอิง: ใน JavaScript มีค่าสองค่าซึ่งโดยพื้นฐานแล้วบอกว่า 'ฉันไม่มีอยู่จริง' - ไม่ได้กำหนดและเป็นโมฆะ

ทำไมถึงอยากพูดผิด ๆ ถูก ๆ !

"null"เป็น"วัตถุว่างเปล่า"เช่นเดียวกับ "0" เป็น"เลขที่ว่างเปล่า" 0 ไม่มีอะไรเลย - มีอยู่เป็น Type of a Number nullเป็นหลักสูตรที่ยังว่างเปล่า แต่ "มันคือ" และมันเป็นสิ่งที่กำหนดไว้อย่างดีของชนิดของวัตถุ

เป็นเรื่องปกติที่จะพูดถึงสิ่งเหล่านี้ในฐานะ "ประเภท" เมื่อมันไม่ใช่ จริงๆแล้วมันคือ "หมวดหมู่" แต่ตอนนี้จบแล้ว

ดังนั้นจะติดว่า "null" เป็น Type of Object ที่ไม่มี Kind และ "null" บอกว่า "ฉันมีอยู่มาก [!] แต่ฉันไม่มีเนื้อหาในแบบของฉัน"

ในขณะที่undefinedขาดทั้ง Type และ Kind โดยที่undefinedเป็นนิยาม Type ด้วย ประเภทที่ไม่ได้กำหนดจะกลายเป็นประเภทที่โดดเด่น ประเภทของคำถาม [ไม่ "ไม่มีอะไร" และคุณกำหนดคำถาม "ไม่มีอะไร" ได้อย่างไร?

อ้าง: ไม่ได้กำหนดหรือ null สามารถส่งคืนจากฟังก์ชันตัวสร้างเนื่องจากทั้งสองจะถูกแปลงเป็นวัตถุว่างเปล่า

คุณได้พูดสิ่งที่ไม่ถูกต้องอีกครั้ง ไม่แน่นอน "ไม่ได้กำหนด" ไม่ใช่วัตถุ แต่เป็น Token ธรรมดาที่มนุษย์เราเข้าใจ แต่ตรงกันข้ามกับโมฆะนั้นคือ - และมันกำลังบอกคุณว่า: ประเภทของมันถูกต้อง แต่ชนิดที่คุณกำลังมองหานั้นไม่มีอยู่ในนั้นหรืออย่างน้อยก็ - ไม่ใช่ในเวลานี้ มาเยี่ยมเราในภายหลังเมื่อเราใส่ \ กำหนดวัตถุใน \ ให้

อ้างถึง: ความแตกต่างที่แท้จริงเพียงอย่างเดียวที่ฉันคิดได้คือสิ่งหนึ่งประเมินเป็น NaN ส่วนอีกค่าเป็น 0 ในบริบทตัวเลข

นั่นทำให้จุดรวมของความแตกต่างหลักดังที่กล่าวไว้: undefinedเป็นโทเค็นธรรมดาและเนื่องจากมันถูกสร้างขึ้นจากวัสดุ 'พันธุกรรม' เดียวกันกับญาติห่าง ๆ : สตริงการดำเนินการ [+ ไม่ได้กำหนด] จะเปลี่ยนเป็น NaN แน่นอนว่าจะเป็นโมฆะในทำนองเดียวกันจะแปรเปลี่ยนเป็นชนิด 0 \ Number ที่ถูกต้องแทนและตรงข้ามกับไม่ได้กำหนดซึ่งจะแปรเปลี่ยนเป็นสตริง (! ซึ่งไม่ว่างเปล่า!) และนั่นคือสาเหตุที่ทำให้เกิดNaNแทน ที่ไหน: + undefined >> + "undefined" >> NaN. เนื่องจากบริบทตัวเลขคาดว่าจะมีค่าที่ชัดเจน

ในขณะที่บริบทบูลีนคาดว่าจะมีการอ้างอิง แต่ไม่พบสิ่งใดที่จะแปลงและให้ผลลัพธ์เป็น 'เท็จ'

มาตัดต่อ ...

อ้างอิง: อีกครั้ง: การใช้งานจริงสำหรับค่าที่แยกจากกันสำหรับค่าที่ไม่ได้กำหนดและค่าว่างคืออะไร?

ฉันจะพยายามให้คุณเพียงสองตัวอย่างเชิงประจักษ์และหวังว่าจะพอเพียง

oElement.onclick >> null

// หมายถึง - คุณสมบัติมีอยู่; ค่าที่คาดไว้คือ Type: Objectและ oElement นั้นรองรับเหตุการณ์ "onclick"!

oElement.innerText >> ""

// หมายถึง - ทรัพย์สินมีอยู่; ค่าที่คาดไว้คือ Type: Stringซึ่งหมายความว่า oElement สนับสนุนคุณสมบัติ "innerText"

ในทั้งสองกรณี - หากคุณได้รับ "ไม่ได้กำหนด" หมายความว่าไม่มีคุณสมบัตินั้น ไม่ได้รับการสนับสนุนหรือมีการใช้งาน (ua vendor) ที่ไม่ถูกต้อง

อยู่กับความเย็นและมีความสุข


อย่าทำลายโพสต์ของคุณ aeneas ลบออก (โดยใช้ปุ่มลบที่อยู่เหนือความคิดเห็นนี้) หากคุณต้องการลบการมีส่วนร่วมของคุณ
Michael Petrotta

ไม่มีปุ่มลบ - แต่ในกรณีที่คุณเห็นโปรดคลิก!

0

หลังจากอ่านการสนทนาที่น่าทึ่งเกี่ยวกับ undefined vs null การค้นหาเล็กน้อยใน Google ก็พาฉันไปที่ Mozilla Documentations https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null มีการกล่าวถึง - null มักจะ ดึงข้อมูลในสถานที่ที่สามารถคาดหวังวัตถุได้ แต่ไม่มีวัตถุใดที่เกี่ยวข้อง

ไม่คล้ายกับ Null object pattern https://en.wikipedia.org/wiki/Null_object_pattern

ฉันเดาว่ามันสมเหตุสมผลแล้วที่จะมีประเภทข้อมูล Null

เอกสารยังกล่าวถึงเป็น typeof null // "object" (ไม่ใช่ "null" เนื่องจากเหตุผลเดิม)

ไม่แน่ใจว่าเหตุผลเดิมคืออะไร

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