สิ่งที่แปลกเล็กน้อยคือภาษาจาวาสคริปต์มีสองค่าที่เป็นตัวแทนของ "ไม่ใช่": ไม่ได้กำหนดและเป็นโมฆะ ทำไม?
1. ความคล้ายคลึงกัน
ในจาวาสคริปต์การกำหนดตัวแปรให้กับที่ไม่ได้กำหนดหรือเป็นโมฆะอย่างตรงไปตรงมาแทบจะไม่มีความแตกต่าง
การคัดลอกรหัสมีดังนี้:
var a = ไม่ได้กำหนด;
var a = null;
ในรหัสข้างต้นตัวแปรจะถูกกำหนดให้ไม่ได้กำหนดและเป็นโมฆะตามลำดับและวิธีการเขียนทั้งสองนี้เกือบจะเทียบเท่า
undefined และ null จะถูกแปลงเป็นเท็จโดยอัตโนมัติในคำสั่ง IF และตัวดำเนินการความเท่าเทียมกันแม้กระทั่งรายงานโดยตรงว่าทั้งสองเท่ากัน
การคัดลอกรหัสมีดังนี้:
ถ้า (! ไม่ได้กำหนด)
console.log ('ไม่ได้กำหนดเป็นเท็จ');
// ไม่ได้กำหนดเป็นเท็จ
ถ้า (! null)
console.log ('null เป็นเท็จ');
// null เป็นเท็จ
ไม่ได้กำหนด == null
// จริง
รหัสข้างต้นแสดงให้เห็นว่าพฤติกรรมของทั้งสองมีความคล้ายคลึงกันอย่างไร!
เนื่องจากความหมายและการใช้งานที่ไม่ได้กำหนดและ NULL นั้นคล้ายกันทำไมคุณต้องตั้งค่าสองค่าในเวลาเดียวกันหรือไม่? DART เป็นทางเลือก JavaScript สำหรับ Google อย่างชัดเจนกำหนดว่ามีเพียง NULL และไม่มีที่ไม่ได้กำหนด!
2. เหตุผลทางประวัติศาสตร์
เมื่อเร็ว ๆ นี้เมื่อฉันอ่านหนังสือเล่มใหม่ "พูด JavaScript" ฉันได้ค้นพบคำตอบสำหรับคำถามนี้โดยบังเอิญ!
ปรากฎว่าสิ่งนี้เกี่ยวข้องกับประวัติของ JavaScript เมื่อ JavaScript เกิดในปี 1995 มันถูกตั้งค่าในขั้นต้นเช่น Java มีเพียง Null เท่านั้นที่ถูกตั้งค่าเป็นค่าที่ระบุว่า "ไม่มี"
ตามประเพณีของภาษา C null ได้รับการออกแบบให้เปลี่ยนเป็น 0 โดยอัตโนมัติ
การคัดลอกรหัสมีดังนี้:
หมายเลข (NULL)
// 0
5 + null
// 5
อย่างไรก็ตามนักออกแบบ JavaScript Brendan Eich คิดว่านี่ไม่เพียงพอด้วยเหตุผลสองประการ
ครั้งแรก NULL ถือเป็นวัตถุเหมือนใน Java
การคัดลอกรหัสมีดังนี้:
typeof null
// "วัตถุ"
อย่างไรก็ตามชนิดข้อมูลของ JavaScript แบ่งออกเป็นสองประเภท: ประเภทดั้งเดิมและสังเคราะห์ (คอมเพล็กซ์)
ประการที่สองเวอร์ชันเริ่มต้นของ JavaScript ไม่รวมกลไกการจัดการข้อผิดพลาด Brendan Eich คิดว่าถ้า Null เปลี่ยนเป็น 0 โดยอัตโนมัติมันไม่ง่ายเลยที่จะหาข้อผิดพลาด
ดังนั้น Brendan Eich จึงออกแบบอีกอันที่ไม่ได้กำหนด
3. การออกแบบเบื้องต้น
รุ่นดั้งเดิมของ JavaScript โดดเด่นเช่นนี้: NULL เป็นวัตถุที่แสดงถึง "ไม่มี" ซึ่งเป็น 0 เมื่อแปลงเป็นค่าตัวเลข; .
การคัดลอกรหัสมีดังนี้:
หมายเลข (ไม่ได้กำหนด)
// น่าน
5 + ไม่ได้กำหนด
// น่าน
4. การใช้งานปัจจุบัน
อย่างไรก็ตามความแตกต่างข้างต้นได้รับการพิสูจน์อย่างรวดเร็วในทางปฏิบัติ ในปัจจุบัน Null และ Undefined นั้นมีความหมายเหมือนกันโดยมีความแตกต่างเพียงเล็กน้อยเท่านั้น
NULL หมายถึง "ไม่มีวัตถุ" นั่นคือไม่ควรมีค่าที่นั่น การใช้งานทั่วไปคือ:
(1) ในฐานะพารามิเตอร์ของฟังก์ชันพารามิเตอร์ของฟังก์ชันไม่ใช่วัตถุ
(2) เป็นจุดสิ้นสุดของห่วงโซ่ต้นแบบวัตถุ
การคัดลอกรหัสมีดังนี้:
Object.getPrototypeof (Object.prototype)
// โมฆะ
หมายถึง "ค่าหายไป" ซึ่งหมายความว่าควรมีค่าที่นี่ แต่ยังไม่ได้กำหนดไว้ การใช้งานทั่วไปคือ:
(1) เมื่อมีการประกาศตัวแปร แต่ไม่มีการมอบหมายมันจะเทียบเท่ากับไม่ได้กำหนด
(2) เมื่อเรียกฟังก์ชั่นพารามิเตอร์ที่ควรให้ไว้และพารามิเตอร์จะเท่ากับไม่ได้กำหนด
(3) วัตถุไม่มีแอตทริบิวต์ที่กำหนดให้กับค่าและค่าของแอตทริบิวต์ไม่ได้กำหนด
(4) เมื่อฟังก์ชั่นไม่ส่งคืนค่าที่ไม่ได้กำหนดจะถูกส่งคืนโดยค่าเริ่มต้น
การคัดลอกรหัสมีดังนี้:
var i;
ฉัน // ไม่ได้กำหนด
ฟังก์ชั่น f (x) {console.log (x)}
f () // undefined
var o = วัตถุใหม่ ();
op // undefined
var x = f ();
x // undefined