ฉันคิดว่าฉันเปรียบเทียบและคลุมเครือเกินไปกับคำตอบก่อนหน้านี้ ชี้แจงดังนี้
อินสแตนซ์ของ Array, Boolean, Date, Function, Number, RegExp, String เป็น Object แต่ได้รับการปรับปรุงด้วยวิธีการและคุณสมบัติเฉพาะสำหรับแต่ละประเภท ตัวอย่างเช่นอาร์เรย์มีlength
คุณสมบัติที่กำหนดไว้ล่วงหน้าในขณะที่วัตถุทั่วไปไม่มี
javascript:alert([].length+'\n'+{}.length)
แสดง
0
ไม่ได้กำหนด
โดยภายในตัวแปล FF Gecko ยังแยกความแตกต่างระหว่าง Arrays และ Objects ทั่วไปด้วยความแตกต่างที่แตกต่างกันในการประเมินโครงสร้างภาษา
javascript:
ra=[ "one", "two", "three"]; ra.a=4;
ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
alert(
ra +"\n\n"+
ob +"\n\n"+
ra.toSource() +"\n\n"+
ra.a +"\t .toSource() forgot me! \n\n"+
ra.length +"\t and my length! \n\n"+
ob.toSource());
ps=""; for(i in ra)ps+=i+" "; alert(ps); /* NB .length is missing! */
ps=""; for(i in ob)ps+=i+" "; alert(ps);
การแสดง
หนึ่งสองสาม
[วัตถุวัตถุ]
["หนึ่งสองสาม"]
4. toSource () ลืมฉัน!
3 และความยาวของฉัน!
({0: "หนึ่ง", 1: "สอง", 2: "สาม", ก: 4})
และ0 1 2 a
และ0 1 2 a
.
เกี่ยวกับคำสั่งที่ว่าวัตถุทั้งหมดเป็นฟังก์ชัน:
มันเป็นค่าไวยากรณ์ที่ถูกต้องหรือความหมายที่จะใช้วัตถุเช่นพลเป็นหน้าที่เหมือน123()
หรือ"abc"()
หรือ[]()
หรือ{}()
หรือobj()
ที่obj
ถูกกว่าชนิดอื่น ๆดังนั้นตัวอย่างวัตถุโดยพลการไม่ได้เป็นFunction
Function
อย่างไรก็ตามให้วัตถุobj
และประเภทเป็นArray, Boolean, Date, ...
อย่างไรobj
มาเป็นArray, Boolean, Date, ...
อย่างไร? คืออะไรArray, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
แสดง
function Array() {
[native code]
}
function Boolean() {
[native code]
}
function Date() {
[native code]
}
function Function() {
[native code]
}
function Number() {
[native code]
}
function Object() {
[native code]
}
function RegExp() {
[native code]
}
function String() {
[native code]
}
ในทุกกรณีหากไม่มีการเทียบเคียงประเภทวัตถุจะปรากฏเป็นfunction
คำจำกัดความดังนั้นคำสั่งว่าวัตถุทั้งหมดเป็นฟังก์ชัน! (ลิ้นในแก้มคือฉันตั้งใจบดบังและเบลอความแตกต่างของอินสแตนซ์วัตถุด้วยประเภทของมัน! แต่ยังแสดงให้เห็นว่า "คุณไม่สามารถมีได้หากไม่มีอีก", Object และ Function! การใช้ตัวพิมพ์ใหญ่เน้น type เป็น ตรงข้ามกับอินสแตนซ์)
ทั้งการทำงานและวัตถุกระบวนทัศน์ดูเหมือนจะเป็นพื้นฐานในการเขียนโปรแกรมและการดำเนินการของ JS ล่ามระดับต่ำในตัวพื้นฐานเช่นMath
และและJSON
true
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
แสดง
[object Math]
[object JSON]
(new Boolean(true))
ในช่วงเวลาของการพัฒนา Javascript รูปแบบการเขียนโปรแกรมที่เน้นวัตถุเป็นศูนย์กลาง (OOP's - Object Oriented Programming style - "s" is my own pun!) อยู่ในสมัยและล่ามได้รับการตั้งชื่อในทำนองเดียวกันกับ Java เพื่อให้มีความน่าเชื่อถือมากขึ้น . เทคนิคการเขียนโปรแกรมเชิงฟังก์ชันถูกลดทอนไปสู่การตรวจสอบที่เป็นนามธรรมและลึกลับมากขึ้นซึ่งศึกษาทฤษฎีของ Automata, ฟังก์ชันเรียกซ้ำ, ภาษาที่เป็นทางการ ฯลฯ และไม่เป็นที่พอใจ อย่างไรก็ตามจุดแข็งของการพิจารณาอย่างเป็นทางการเหล่านี้ปรากฏให้เห็นอย่างชัดเจนใน Javascript โดยเฉพาะอย่างยิ่งเมื่อนำไปใช้ในเอ็นจิ้น Gecko ของ FF (กล่าวคือ.toSource()
)
นิยามวัตถุสำหรับฟังก์ชันเป็นที่น่าพึงพอใจอย่างยิ่งเนื่องจากถูกกำหนดให้เป็นความสัมพันธ์ที่เกิดซ้ำ! กำหนดโดยใช้นิยามของมันเอง!
function Function() { [native code] }
function Object() { [native code] }
และตั้งแต่ฟังก์ชั่นเป็นวัตถุเดียวกันถือเป็นความเชื่อมั่นสำหรับ
คำจำกัดความอื่น ๆ ส่วนใหญ่เป็นไปตามค่าเทอร์มินัลคงที่ อย่างไรก็ตามeval()
เป็นแบบดั้งเดิมที่ทรงพลังเป็นพิเศษดังนั้น String จึงสามารถฝังฟังก์ชันการทำงานได้ตามอำเภอใจ
โปรดสังเกตอีกครั้งภาษาที่ใช้ด้านบนปิดบังประเภทวัตถุและความแตกต่างของอินสแตนซ์