"foo"เป็นสตริงดั้งเดิม (แนวคิดนี้ไม่มีใน C # หรือ Java)
new String("foo") เป็นวัตถุสตริงชนิดบรรจุกล่อง
===ประกอบการทำงานแตกต่างกันบนพื้นฐานและวัตถุ
เมื่อเปรียบเทียบ primitives (ชนิดเดียวกัน) ===จะคืนค่า true หากทั้งสองมีค่าเหมือนกัน
เมื่อเปรียบเทียบออบเจ็กต์===จะคืนค่าจริงก็ต่อเมื่ออ้างถึงวัตถุเดียวกัน (เปรียบเทียบโดยการอ้างอิง) ด้วยnew String("a") !== new String("a")ประการฉะนี้.
ในกรณีของคุณให้===ส่งคืนค่าเท็จเนื่องจากตัวถูกดำเนินการเป็นประเภทที่แตกต่างกัน (แบบแรกเป็นแบบดั้งเดิมและอีกแบบเป็นอ็อบเจ็กต์)
ดึกดำบรรพ์ไม่ใช่วัตถุเลย ผู้ประกอบการจะไม่กลับมาสำหรับวิทยาการ
typeof"object"
เมื่อคุณพยายามเข้าถึงคุณสมบัติของดั้งเดิม (โดยใช้มันเป็นอ็อบเจกต์) ภาษา Javascript จะจัดกล่องให้กับอ็อบเจ็กต์และสร้างอ็อบเจกต์ใหม่ทุกครั้ง นี้มีการอธิบายในสเปค
นี่คือเหตุผลที่คุณไม่สามารถวางคุณสมบัติบนพื้นฐานได้:
var x = "a";
x.property = 2;
alert(x.property)
ทุกครั้งที่คุณเขียนx.propertyที่แตกต่างกันชนิดบรรจุกล่องStringวัตถุที่ถูกสร้างขึ้น
fooเป็นเพราะเป็นสตริงที่บริสุทธิ์และnew String("foo")เป็น Object String