"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