ความแตกต่างระหว่างคีย์วัตถุที่มีเครื่องหมายคำพูดและไม่มีคำพูดคืออะไร?


209

มีความแตกต่างระหว่าง

obj = {'foo': 'bar'} 

และ

obj = {foo: 'bar'}

ฉันสังเกตเห็นว่าคุณไม่สามารถใช้-ในคีย์เมื่อฉันไม่ได้ใช้เครื่องหมายคำพูด แต่จริงๆแล้วมันสร้างความแตกต่าง? ถ้าใช่อันไหน

คำตอบ:


136

ไม่เครื่องหมายคำพูดไม่ได้สร้างความแตกต่าง (เว้นแต่ว่าคุณได้ระบุไว้ว่าคุณต้องการใช้รหัสที่ไม่ใช่ตัวระบุ JavaScript ที่ถูกต้อง)

ในฐานะที่เป็นหมายเหตุด้านรูปแบบการแลกเปลี่ยนข้อมูล JSON ไม่จำเป็นต้องมีเครื่องหมายอัญประกาศคู่รอบตัวระบุ (และไม่อนุญาตให้ใช้เครื่องหมายคำพูดเดี่ยว)


88
ที่จริงแล้วราคาสามารถสร้างความแตกต่างถ้าคุณใช้ตัวอักษรตัวเลขเป็นชื่อคุณสมบัติ ยกตัวอย่างเช่นไม่ได้เช่นเดียวกับobj = { 12e34: true }; obj = { '12e34': true };อดีตจะต้องให้คุณสามารถเข้าถึงคุณสมบัติผ่านในขณะที่สำหรับหลังที่คุณต้องการใช้obj['1.2e+35'] ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม obj['12e34']
Mathias Bynens

1
จริง แต่มันจะยอดเยี่ยมถ้าอัญประกาศคู่เป็นตัวเลือกเนื่องจากตัวอักษรตัวแรกของ az + ตัวเลขและตัวอักษรและอาจมีแฟน ๆ ของช่องว่างหรือช่องว่างหรือแท็บที่มองไม่เห็นบ้าง เหมาะสำหรับข้อมูลที่ไม่ซ้อนกันอย่างล้ำลึก
Jason Sebring

124

จากชื่อคุณสมบัติ / คีย์วัตถุใน JavaScriptไม่ได้เขียนบทความของฉันในเรื่อง:

ไม่สามารถใส่เครื่องหมายคำพูดได้หากชื่อคุณสมบัติเป็นตัวอักษรตัวเลขหรือชื่อตัวระบุที่ถูกต้องระบุชื่อที่ถูกต้อง

[ ... ]

เครื่องหมายวงเล็บสามารถใช้กับชื่อคุณสมบัติทั้งหมดได้อย่างปลอดภัย

[ ... ]

เครื่องหมายจุดสามารถใช้ได้เฉพาะเมื่อชื่อคุณสมบัติเป็นชื่อตัวระบุที่ถูกต้อง

โปรดทราบว่าอนุญาตให้ใช้คำสงวนเพื่อใช้เป็นชื่อคุณสมบัติที่ไม่ได้กล่าวถึงใน ES5 อย่างไรก็ตามสำหรับความเข้ากันได้ย้อนหลังกับ ES3 ฉันขอแนะนำให้อ้างอิงต่อไป

ฉันยังสร้างเครื่องมือที่จะบอกคุณว่าชื่อคุณสมบัติที่กำหนดสามารถใช้โดยไม่มีเครื่องหมายคำพูดและ / หรือด้วยเครื่องหมายจุด ลองมันที่mothereff.in/js-properties

ภาพหน้าจอ


เครื่องมือนี้เป็นเครื่องมือช่วยชีวิต ขอขอบคุณที่โพสต์สิ่งนี้
Chris Christensen

ฉันกำลังเดินทางจากหน้าผากำลังจะพังทลายลงมาสูงชันซัดกระเซ็นไปหาคนตายและเลือดที่แน่นอน แต่อนิจจาฉันคลิกลิงก์ในคำตอบของคุณซึ่งมีเครื่องมือ JS อย่างง่ายอยู่ในนั้นซึ่งทำให้ฉันไม่สามารถตกลงจากหน้าผานั้นได้ เครื่องมือนี้เป็นเครื่องมือช่วยชีวิต
แอนดรู

8

ไม่มีความแตกต่างที่นี่ แค่เรื่องของสไตล์ หนึ่งในเหตุผลในการทำเช่นนี้คือสามารถใช้ 'super' หรือ 'class' เป็นคีย์ได้เนื่องจากเป็นคำหลักที่สงวนไว้

บางคนอาจถูกล่อลวงให้เดินผ่านสตริงที่มีช่องว่างแล้วเรียก o ['ฉันสามารถมีช่องว่างได้'] แต่ฉันจะเรียกการฝึกฝนที่ไม่ดีนั้น


3

ไม่ไม่ใช่จาวาสคริปต์ อย่างไรก็ตามตัวแยกวิเคราะห์ JSON บางตัวจะล้มเหลวเมื่อไม่มีเครื่องหมายคำพูดล้อมรอบคีย์


35
คีย์ที่ไม่มีเครื่องหมายคำพูดไม่ถูกต้องใน JSON
Ned Batchelder

1

มีบางสถานการณ์ที่พวกเขาแตกต่างกัน ตัวอย่างเช่นหากคุณใช้ jQuery และคุณกำลังสร้างรายการพารามิเตอร์ที่จะส่งผ่านเมื่อเรียกคำสั่ง jQuery $ () เพื่อสร้างองค์ประกอบคำที่ยกมาจะกลายเป็นพารามิเตอร์และคำที่ไม่ยกมาจะกลายเป็นฟังก์ชั่น ตัวอย่างเช่น "ขนาด" จะตั้งค่าขนาดคุณลักษณะของวัตถุและขนาด (ไม่มีเครื่องหมายคำพูด) จะเรียกใช้ฟังก์ชัน size () บนวัตถุ ดูjQuery ()ใกล้ด้านล่าง:

ในขณะที่อาร์กิวเมนต์ที่สองนั้นสะดวก แต่ความยืดหยุ่นนั้นสามารถนำไปสู่ผลที่ไม่ตั้งใจ (เช่น $ (" <input>", {size: "4"}) ที่เรียกใช้วิธีการ. size () แทนการตั้งค่าขนาดแอตทริบิวต์) บล็อกโค้ดก่อนหน้านี้สามารถเขียนได้แทนเป็น:


ฉันไม่คิดว่าตัวอย่างพูดสิ่งที่คุณคิดว่ามันพูด ปัญหาที่คุณยกมานั้นเป็นเพราะ jQuery มีวิธีที่เรียกว่าขนาดและความขัดแย้งระหว่างขนาดวิธีการและขนาดของคุณสมบัติได้รับการแก้ไขโดยการเลือกวิธีการ มีหลายกรณีใน jQuery ที่ส่งค่าเป็นสตริงหรือชนิดอื่นทำให้เกิดการเปลี่ยนแปลงในพฤติกรรม แต่ไม่เคยกำหนดคุณสมบัติด้วยชื่อคุณสมบัติที่ถูกต้องในเครื่องหมายคำพูดเทียบกับไม่อยู่ในเครื่องหมายคำพูด
Alex Weitzer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.