มีความแตกต่างระหว่าง
obj = {'foo': 'bar'}
และ
obj = {foo: 'bar'}
ฉันสังเกตเห็นว่าคุณไม่สามารถใช้-ในคีย์เมื่อฉันไม่ได้ใช้เครื่องหมายคำพูด แต่จริงๆแล้วมันสร้างความแตกต่าง? ถ้าใช่อันไหน
มีความแตกต่างระหว่าง
obj = {'foo': 'bar'}
และ
obj = {foo: 'bar'}
ฉันสังเกตเห็นว่าคุณไม่สามารถใช้-ในคีย์เมื่อฉันไม่ได้ใช้เครื่องหมายคำพูด แต่จริงๆแล้วมันสร้างความแตกต่าง? ถ้าใช่อันไหน
คำตอบ:
ไม่เครื่องหมายคำพูดไม่ได้สร้างความแตกต่าง (เว้นแต่ว่าคุณได้ระบุไว้ว่าคุณต้องการใช้รหัสที่ไม่ใช่ตัวระบุ JavaScript ที่ถูกต้อง)
ในฐานะที่เป็นหมายเหตุด้านรูปแบบการแลกเปลี่ยนข้อมูล JSON ไม่จำเป็นต้องมีเครื่องหมายอัญประกาศคู่รอบตัวระบุ (และไม่อนุญาตให้ใช้เครื่องหมายคำพูดเดี่ยว)
จากชื่อคุณสมบัติ / คีย์วัตถุใน JavaScriptไม่ได้เขียนบทความของฉันในเรื่อง:
ไม่สามารถใส่เครื่องหมายคำพูดได้หากชื่อคุณสมบัติเป็นตัวอักษรตัวเลขหรือชื่อตัวระบุที่ถูกต้องระบุชื่อที่ถูกต้อง
[ ... ]
เครื่องหมายวงเล็บสามารถใช้กับชื่อคุณสมบัติทั้งหมดได้อย่างปลอดภัย
[ ... ]
เครื่องหมายจุดสามารถใช้ได้เฉพาะเมื่อชื่อคุณสมบัติเป็นชื่อตัวระบุที่ถูกต้อง
โปรดทราบว่าอนุญาตให้ใช้คำสงวนเพื่อใช้เป็นชื่อคุณสมบัติที่ไม่ได้กล่าวถึงใน ES5 อย่างไรก็ตามสำหรับความเข้ากันได้ย้อนหลังกับ ES3 ฉันขอแนะนำให้อ้างอิงต่อไป
ฉันยังสร้างเครื่องมือที่จะบอกคุณว่าชื่อคุณสมบัติที่กำหนดสามารถใช้โดยไม่มีเครื่องหมายคำพูดและ / หรือด้วยเครื่องหมายจุด ลองมันที่mothereff.in/js-properties
ไม่มีความแตกต่างที่นี่ แค่เรื่องของสไตล์ หนึ่งในเหตุผลในการทำเช่นนี้คือสามารถใช้ 'super' หรือ 'class' เป็นคีย์ได้เนื่องจากเป็นคำหลักที่สงวนไว้
บางคนอาจถูกล่อลวงให้เดินผ่านสตริงที่มีช่องว่างแล้วเรียก o ['ฉันสามารถมีช่องว่างได้'] แต่ฉันจะเรียกการฝึกฝนที่ไม่ดีนั้น
ไม่ไม่ใช่จาวาสคริปต์ อย่างไรก็ตามตัวแยกวิเคราะห์ JSON บางตัวจะล้มเหลวเมื่อไม่มีเครื่องหมายคำพูดล้อมรอบคีย์
มีบางสถานการณ์ที่พวกเขาแตกต่างกัน ตัวอย่างเช่นหากคุณใช้ jQuery และคุณกำลังสร้างรายการพารามิเตอร์ที่จะส่งผ่านเมื่อเรียกคำสั่ง jQuery $ () เพื่อสร้างองค์ประกอบคำที่ยกมาจะกลายเป็นพารามิเตอร์และคำที่ไม่ยกมาจะกลายเป็นฟังก์ชั่น ตัวอย่างเช่น "ขนาด" จะตั้งค่าขนาดคุณลักษณะของวัตถุและขนาด (ไม่มีเครื่องหมายคำพูด) จะเรียกใช้ฟังก์ชัน size () บนวัตถุ ดูjQuery ()ใกล้ด้านล่าง:
ในขณะที่อาร์กิวเมนต์ที่สองนั้นสะดวก แต่ความยืดหยุ่นนั้นสามารถนำไปสู่ผลที่ไม่ตั้งใจ (เช่น $ ("
<input>", {size: "4"}) ที่เรียกใช้วิธีการ. size () แทนการตั้งค่าขนาดแอตทริบิวต์) บล็อกโค้ดก่อนหน้านี้สามารถเขียนได้แทนเป็น:
obj = { 12e34: true };obj = { '12e34': true };อดีตจะต้องให้คุณสามารถเข้าถึงคุณสมบัติผ่านในขณะที่สำหรับหลังที่คุณต้องการใช้obj['1.2e+35']ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติมobj['12e34']