อะไรคือความแตกต่างระหว่าง JSON และสัญกรณ์อักษร Object?


221

ใครสามารถบอกฉันได้ว่าอะไรคือความแตกต่างหลักระหว่างวัตถุ JavaScript ที่กำหนดโดยใช้เครื่องหมายตัวอักษรของวัตถุและวัตถุ JSON ?

ตามหนังสือ JavaScript มันบอกว่านี่เป็นวัตถุที่กำหนดโดยใช้สัญลักษณ์ของวัตถุ :

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

เหตุใดมันจึงไม่ใช่วัตถุ JSON ในกรณีนี้ เพียงเพราะมันไม่ได้ถูกกำหนดโดยใช้เครื่องหมายคำพูด?


20
"ทำไมมันไม่ใช่วัตถุ JSON ในกรณีนี้": เนื่องจากคีย์ของคุณต้องเป็นสตริงและฟังก์ชันไม่ใช่ค่า JSON ที่ถูกต้อง
Matt

คำตอบ:


248

ให้อธิบายก่อนว่าJSONคืออะไร JSON เป็นรูปแบบการแลกเปลี่ยนข้อมูลที่เป็นข้อความที่เป็นอิสระต่อภาษาเช่น XML, CSV หรือ YAML

ข้อมูลสามารถจัดเก็บได้หลายวิธี แต่หากควรเก็บไว้ในไฟล์ข้อความและสามารถอ่านได้โดยคอมพิวเตอร์จำเป็นต้องปฏิบัติตามโครงสร้างบางอย่าง JSON เป็นหนึ่งในหลายรูปแบบที่กำหนดโครงสร้างดังกล่าว

รูปแบบดังกล่าวโดยทั่วไปจะไม่ขึ้นกับภาษาซึ่งหมายความว่าสามารถประมวลผลได้โดย Java, Python, JavaScript, PHP คุณตั้งชื่อมัน

ในทางตรงกันข้ามJavaScriptเป็นภาษาโปรแกรม แน่นอนว่า JavaScript ยังมีวิธีในการกำหนด / อธิบายข้อมูล แต่ไวยากรณ์นั้นเฉพาะเจาะจงกับ JavaScript มาก

ตัวอย่างเช่นเคาน์เตอร์, Python มีแนวคิดของtuples(x, y)ไวยากรณ์ของพวกเขาคือ JavaScript ไม่มีอะไรเช่นนี้


ให้ดูที่ความแตกต่างทางไวยากรณ์ระหว่างตัวอักษรของวัตถุ JSON และ JavaScript

JSON มีข้อ จำกัด ด้านโครงสร้างประโยคดังต่อไปนี้:

  • ปุ่มวัตถุจะต้องเป็นสตริง (เช่นลำดับตัวละครที่อยู่ในเครื่องหมายคำพูดคู่")
  • ค่าสามารถเป็นได้ทั้ง:
    • สตริง
    • หมายเลข
    • วัตถุ (JSON)
    • อาร์เรย์
    • true
    • false
    • null
  • คีย์ที่ซ้ำกัน ( {"foo":"bar","foo":"baz"}) สร้างผลลัพธ์ที่ไม่ได้เจาะจงเฉพาะการใช้งาน ข้อมูลจำเพาะ JSON ไม่ได้กำหนดความหมายของมันโดยเฉพาะ

ใน JavaScript สามารถใช้ตัวอักษรของวัตถุได้

  • สตริงตัวอักษรตัวอักษรตัวเลขหรือชื่อตัวระบุเป็นคีย์ (ตั้งแต่ ES6 ตอนนี้สามารถคำนวณคีย์ได้ซึ่งจะแนะนำไวยากรณ์อื่นอีก)
  • ค่าที่สามารถแสดงออก JavaScript ถูกต้องใด ๆ undefinedรวมทั้งฟังก์ชั่นและคำจำกัดความ
  • คีย์ที่ซ้ำกันจะสร้างผลลัพธ์ที่ระบุและระบุไว้ (ในโหมดหลวมความหมายหลังจะแทนที่แบบเดิม แต่ในโหมดเข้มงวดจะเป็นข้อผิดพลาด)

รู้ว่าเพียงแค่ดูที่ไวยากรณ์ตัวอย่างของคุณไม่ใช่ JSON เนื่องจากเหตุผลสองประการ:

  1. กุญแจของคุณไม่ใช่สายอักขระ (ตัวอักษร) พวกเขามีชื่อระบุ
  2. คุณไม่สามารถกำหนดฟังก์ชั่นเป็นค่าให้กับ "วัตถุ JSON" (เพราะ JSON ไม่ได้กำหนดไวยากรณ์สำหรับฟังก์ชั่น)

แต่ที่สำคัญที่สุดคือทำซ้ำคำอธิบายของฉันตั้งแต่ต้น: คุณอยู่ในบริบท JavaScript คุณกำหนดวัตถุ JavaScript หากมี "วัตถุ JSON" สามารถมีอยู่ในสตริงเท่านั้น:

 var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
 var json = '{"foo": 452}'; // creates a string containing JSON

นั่นคือถ้าคุณกำลังเขียนซอร์สโค้ด JavaScript และไม่จัดการกับสตริงคุณไม่ได้กำลังจัดการกับ JSON บางทีคุณอาจได้รับข้อมูลเป็น JSON (เช่นผ่าน ajax หรืออ่านจากไฟล์) แต่เมื่อคุณหรือไลบรารีที่คุณใช้แยกวิเคราะห์แล้วมันไม่ใช่ JSON อีกต่อไป


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


8
นอกจากนี้โปรดทราบว่า JSON เป็นส่วนย่อยของสัญลักษณ์ตัวอักษรของวัตถุ
Sean Kinsey

14
@SeanKinsey: ยกเว้นว่าไม่ใช่: timelessrepo.com/json-isnt-a-javascript-subset
mpen

1
อาจจะน่าสังเกตว่าโดยปกติแล้วคุณจะคาดหวังว่าวัตถุ JavaScript ที่เป็นตัวอักษรในบริบทที่ความคิดเห็นถูกกฎหมายและข้อมูลจำเพาะ JSON ไม่อนุญาตให้แสดงความคิดเห็น (ดูโพสต์นี้ )
Brian Henry

คีย์ในตัวอักษรของวัตถุจะเป็นสตริงเสมอแม้ว่าคุณจะใช้ "" หรือไม่ก็ตาม
แลกเปลี่ยน

2
@overexchange: "คีย์ในวัตถุตัวอักษรเป็นสตริงเสมอ"คุณกำลังผสมสองสิ่งที่นี่ แต่ฉันไม่สามารถตำหนิคุณได้เพราะฉันไม่ได้วาดเส้นที่ชัดเจนที่นี่ คุณต้องแยกความแตกต่างระหว่างวัตถุที่แท้จริงและวัตถุคุ้มค่า ที่แท้จริงเป็นลำดับตัวอักษรที่คุณเขียนในรหัสที่มา ค่าเป็นสิ่งที่สร้างขึ้นโดยการตีความรหัสที่มา วัตถุที่แท้จริง (ไวยากรณ์) ช่วยให้คุณทำใช้ชื่อตัวระบุ , สายอักขระตัวอักษรหรือตัวอักษรตัวเลข คุณถูกต้องแล้วที่ runtime พวกมันทั้งหมดถูกแปลงเป็นสตริง (แต่ตอนนี้เรามีสัญลักษณ์ด้วย)
เฟลิกซ์ลิ่ง

41

JSONมีไวยากรณ์ที่ จำกัด มากขึ้นรวมถึง:

  • ต้องระบุค่าคีย์
  • สตริงจะต้องยกมาด้วย"และไม่'
  • คุณมีช่วงของค่าที่ จำกัด มากขึ้น (เช่นไม่มีฟังก์ชั่นที่อนุญาต)

1
ชอบสิ่งนี้ "ไม่มีฟังก์ชั่นที่อนุญาต"
Karan Kaw

ไม่อนุญาตให้แสดงความคิดเห็น สำหรับเหตุผลที่สงสัย (ได้ยินพวกเขาถามคำถามสองสามครั้ง) นี่คือความแตกต่างหลักที่ฉัน "d พูด
user7610

15

ไม่มีสิ่งเช่น "วัตถุ JSON" จริงๆ

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

นอกจากนี้ (พูดจาโผงผาง ... ) เมื่อผู้คนพูดถึง "วัตถุ JSON" พวกเขามักจะหมายถึงข้อมูลที่มี "เครื่องหมายปีกกา" ในระดับบนสุด สิ่งนี้สอดคล้องกับวัตถุจาวาสคริปต์อย่างมาก อย่างไรก็ตามข้อมูลจำเพาะ JSON ไม่ต้องการให้มีวัตถุ "curly-braces" เดียวที่ระดับบนสุดของสตริง JSON เป็น JSON ที่ถูกต้องอย่างสมบูรณ์ที่จะมีรายการที่ระดับบนสุดหรือแม้กระทั่งมีเพียงค่าเดียว ดังนั้นในขณะที่ "วัตถุ JSON" ทั้งหมดสอดคล้องกับ JSON ที่ถูกต้องสตริง JSON ที่ถูกต้องทั้งหมดไม่ตรงกับสิ่งที่เราจะเรียกว่า "วัตถุ JSON"! (เนื่องจากสตริงสามารถแสดงรายการหรือค่าอะตอมมิก)


5
มีข้อผิดพลาดในคำตอบของคุณ: JSON ไม่ถูกต้องที่จะมีค่าอะตอมมิกที่ระดับบนสุด JSON อนุญาตให้ด้านบนเป็นวัตถุหรืออาร์เรย์ แต่ไม่มีอะไรอื่น RFC4627เป็นมาตรฐานอธิบายไวยากรณ์ของ JSON JSON-text = object / arrayดังนี้
Rory O'Kane

9

ตามJSON ใน JavaScript ,

JSON เป็นส่วนย่อยของสัญกรณ์ตัวอักษรของ JavaScript

กล่าวอีกนัยหนึ่ง JSON ที่ถูกต้องเป็นสัญกรณ์ JavaScript ของสัญพจน์ที่ถูกต้องเช่นกัน แต่ไม่จำเป็นต้องเป็นอย่างอื่น

นอกเหนือไปจากการอ่านเอกสารเป็น @Filix คิงปัญหาผมยังแนะนำให้เล่นรอบกับJSONLint ตรวจสอบ นั่นคือวิธีที่ฉันได้เรียนรู้ว่ากุญแจของวัตถุ JSON จะต้องเป็นสตริง


2
เพียงสังเกต: มันไม่ได้เป็นส่วนย่อยที่แน่นอนมีบางสตริง JSON ที่ไม่ถูกต้องเป็นตัวอักษรวัตถุ JS
Bergi

5

🔫 JSON : ทางเลือกที่ปราศจากไขมันกับ XML

JSON ได้รับการยอมรับอย่างกว้างขวางจากผู้ที่พบว่าทำให้การผลิตแอพพลิเคชั่นและบริการแบบกระจายง่ายขึ้น อย่างเป็นทางการอินเทอร์เน็ตประเภทสื่อ JSON application/json RFC 4627คือ ชื่อไฟล์ JSON .jsonใช้นามสกุล


►สัญลักษณ์วัตถุ JavaScript ( JSON) เป็นรูปแบบการแลกเปลี่ยนข้อมูลที่เป็นข้อความที่มีน้ำหนักเบาและไม่ขึ้นกับภาษา JSON ถูกใช้เพื่อแลกเปลี่ยนข้อมูลระหว่างแอปพลิเคชันที่เขียนด้วยภาษาการเขียนโปรแกรมใด ๆ

วัตถุ JSON เป็นวัตถุเดียวที่มีสองฟังก์ชั่นการแยกวิเคราะห์และ stringify ที่ใช้ในการแยกวิเคราะห์และสร้างข้อความ JSON

  • JSON.stringify สร้างสตริงที่สอดคล้องกับไวยากรณ์ JSON ต่อไปนี้
  • JSON.parse ยอมรับสตริงที่สอดคล้องกับไวยากรณ์ JSON

วิธี parseJSON Fourth Edition of ECMAScriptจะถูกรวมอยู่ใน ในระหว่างนี้มีการใช้งาน JavaScript ที่ json.org

var objLiteral = {foo: 42}; // JavaScript Object
console.log('Object Literal : ', objLiteral ); // Object {foo: 42}foo: 42__proto__: Object

// This is a JSON String, like what you'd get back from an AJAX request.
var jsonString = '{"foo": 452}';
console.log('JOSN String : ', jsonString ); // {"foo": 452}

// This is how you deserialize that JSON String into an Object.
var serverResposnceObject = JSON.parse( jsonString );
console.log('Converting Ajax response to JavaScript Object : ', serverResposnceObject); // Object {foo: 42}foo: 42 __proto__: Object

// And this is how you serialize an Object into a JSON String.
var serverRequestJSON = JSON.stringify( objLiteral );
console.log('Reqesting server with JSON Data : ', serverRequestJSON); // '{"foo": 452}'

JSON เป็นส่วนย่อยของ JavaScript Javascriptมาจากมาตรฐานภาษาการเขียนโปรแกรม ECMAScript


► ECMAScript

ECMAScript ได้เติบโตขึ้นเป็นหนึ่งในภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไปที่ใช้กันอย่างแพร่หลายมากที่สุดในโลก เป็นที่รู้จักกันดีในฐานะภาษาที่ฝังอยู่ในเว็บเบราว์เซอร์ แต่ได้รับการยอมรับอย่างกว้างขวางสำหรับเซิร์ฟเวอร์และแอปพลิเคชันแบบฝัง ECMAScript อยู่บนพื้นฐานของเทคโนโลยีที่มีต้นกำเนิดหลายเป็นที่รู้จักมากที่สุดJavaScript(Netscape Communications)) และJScript(Microsoft Corporation).) แม้ว่าก่อนปี 2537 ECMA เป็นที่รู้จักในนาม "สมาคมผู้ผลิตคอมพิวเตอร์แห่งยุโรป" หลังจากปี 2537 เมื่อองค์กรกลายเป็นสากล "เครื่องหมายการค้า" "Ecma" ก็ถูกเก็บรักษาไว้ด้วยเหตุผลทางประวัติศาสตร์

ECMAScript ภาษาในขณะ JavaScript, JScript และแม้กระทั่ง ActionScript "Dialects"จะเรียกว่า

ภาษาถิ่นได้มาจากภาษาเดียวกัน พวกเขาค่อนข้างคล้ายกันเนื่องจากพวกเขาได้รับมาจากภาษาเดียวกัน แต่พวกเขาได้รับการเปลี่ยนแปลงบางอย่าง ภาษาถิ่นคือความแปรปรวนในภาษานั้น ๆ มันมาจากภาษาเดียว

  • ภาษา SQL - Hibernate MySQL Dialect, Oracle Dialect, .. ซึ่งมีการเปลี่ยนแปลงหรือเพิ่มฟังก์ชันการทำงาน

ข้อมูลเกี่ยวกับเบราว์เซอร์และคอมพิวเตอร์ของผู้ใช้ของคุณ

navigator.appName // "Netscape"

ECMAScript เป็นภาษาสคริปต์ที่เป็นพื้นฐานของ JavaScript .JavaScript language resources

ECMA-262 Links
Initial Edition, June 1997 PDF.
2nd Edition, August 1998 PDF.
3rd Edition, December 1999 PDF.
5th Edition, December 2009 PDF.
5.1 Edition, June 2011 HTML.
6th Edition, June 2015 HTML.
7ᵗʰ Edition, June 2016 HTML.
8th edition, June 2017 HTML.
9th Edition, 2018 HTML.

หมายเหตุ« ฉบับที่ 4ของ ECMAScript ไม่ได้รับการตีพิมพ์เป็นงานที่ยังไม่สมบูรณ์


JSON กำหนดกฎการจัดรูปแบบชุดเล็ก ๆ สำหรับการแสดงข้อมูลโครงสร้างที่เคลื่อนย้ายได้

  1. ►ต้องป้อนค่าคีย์โดยอนุญาตให้ใช้คีย์ได้เท่านั้น ถ้าคุณใช้นอกเหนือจาก String มันจะแปลงเป็น String แต่ไม่แนะนำให้ใช้กุญแจอื่นนอกเหนือจาก String ตรวจสอบตัวอย่างเช่นนี้ - { 'key':'val' }มากกว่าRFC 4627 - jsonformatter

    var storage = {
      0 : null,
      1 : "Hello"
    };
    console.log( storage[1] ); // Hello
    console.log( JSON.stringify( storage ) ); // {"0":null,"1":"Hello","2":"world!"}
    
    var objLiteral = {'key1':'val1'};
        var arr = [10, 20], arr2 = [ 'Yash', 'Sam' ];
        var obj = { k: 'v' }, obj2 = { k2: 'v2' };
        var fun = function keyFun() {} ;
    
    objLiteral[ arr ] = 'ArrayVal';     objLiteral[ arr2 ] = 'OverridenArrayVal';
    objLiteral[ obj ] = 'ObjectVal';    objLiteral[ obj2 ] = 'OverridenObjectVal';
    objLiteral[ fun ] = 'FunctionVal';
    
    console.log( objLiteral );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    console.log( JSON.stringify( objLiteral ) );
    // {"key1":"val1","10,20":"ArrayVal","Yash,Sam":"OverridenArrayVal","[object Object]":"OverridenObjectVal","function keyFun() {}":"FunctionVal"}
    console.log( JSON.parse( JSON.stringify( objLiteral ) ) );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    
    console.log('Accessing Array  Val : ', objLiteral[ [10,20] ] );
    console.log('Accessing Object Val : ', objLiteral[ '[object Object]' ] );
    console.log('Accessing Function Val : ', objLiteral[ 'function keyFun() {}' ] );
  2. ►สตริง JSON ต้องอ้างอิงด้วย "และไม่ใช่" สตริงเป็นอย่างมากเหมือนกับสตริง C หรือ Java สตริงควรจะอยู่ในเครื่องหมายคำพูดคู่

    • ตัวอักษรเป็นค่าคงที่ไม่ใช่ตัวแปรที่คุณให้ไว้ในสคริปต์ของคุณ
    • สตริงคือลำดับของอักขระศูนย์หรือมากกว่าที่อยู่ในเครื่องหมายคำพูดพร้อมด้วยเครื่องหมายทับขวาเครื่องหมายทับขวาซึ่งเป็นสัญกรณ์เดียวกับที่ใช้ในภาษาการเขียนโปรแกรมส่วนใหญ่
      • 🔫 - สัญลักษณ์พิเศษได้รับอนุญาตใน String แต่ไม่แนะนำให้ใช้
      • \ "- ตัวละครพิเศษสามารถหนีออกมาได้ แต่ไม่แนะนำให้หลบหนี (') อัญประกาศเดี่ยวในโหมดเข้มงวดมันจะโยนและผิดพลาด - SyntaxError: Unexpected token ' in JSON

    ตรวจสอบด้วยรหัสนี้{ "Hai\" \n Team 🔫":5, "Bye \'": 7 }ผ่านทาง JSON Edtions ออนไลน์ModesnotStrict,Strinct.

    var jsonString = "{'foo': 452}"; // {'foo': 452}
    var jsonStr = '{"foo": 452}'; // {"foo": 452}
    
    JSON.parse( jsonString ); // Unexpected token ' in JSON at position 1(…)
    JSON.parse( jsonStr ); // Object {foo: 452}
    
    objLiteral['key'] = 'val'; // Object {foo: 42, key: "val"}
    objLiteral.key2 = 'val';
    
    // objLiteral.key\n3 - SyntaxError: Invalid or unexpected token
    objLiteral['key\n3'] = 'val'; // Object {"foo": "42", key: "val", key2: "val", "key↵3": "val"}
    
    JSON.stringify( objLiteral ); // {"foo":"42","key":"val","key2":"val","key\n3":"val"}

วัตถุaccessors ทรัพย์สิน ให้สามารถเข้าถึงคุณสมบัติของวัตถุโดยใช้สัญกรณ์จุดหรือสัญกรณ์วงเล็บ

  1. ►คุณมีช่วงของค่าที่ จำกัด มากขึ้น (เช่นไม่มีฟังก์ชั่นที่อนุญาต) ค่าสามารถเป็นสตริงในเครื่องหมายคำพูดคู่, ตัวเลข, บูลีน, null, วัตถุหรืออาร์เรย์ โครงสร้างเหล่านี้สามารถซ้อนกันได้

    var objLiteral = {};
    objLiteral.funKey = function sayHello() {
        console.log('Object Key with function as value - Its outcome message.');
    };
    
    objLiteral['Key'] = 'Val';
    
    console.log('Object Literal Fun : ', objLiteral );
    // Object Literal Fun :  Object {Key: "Val"}Key: "Val"funKey: sayHello()__proto__: Object
    console.log( JSON.stringify( objLiteral ) ); // {"Key":"Val"}

ป้อนคำอธิบายรูปภาพที่นี่


JavaScriptคือการใช้งาน ECMAScript Standard ที่ได้รับความนิยมสูงสุด คุณสมบัติหลักของ Javascript นั้นเป็นไปตามมาตรฐาน ECMAScript แต่ Javascript ยังมีคุณสมบัติเพิ่มเติมอื่น ๆ ที่ไม่ได้อยู่ในข้อกำหนด / มาตรฐานของ ECMA เบราว์เซอร์ทุกตัวมีล่าม JavaScript

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

Literals :

'37' - 7    // 30
'37' + 7    // "377"
+'37' + 7   // 44
+'37'       // 37
'37'        // "37"

parseInt('37');     // 37
parseInt('3.7');    // 3

parseFloat(3.7);    // 3.7

// An alternative method of retrieving a number from a string is with the + (unary plus) operator:
+'3.7'              // 3.7

Object literals RFC 7159

โครงสร้างวัตถุถูกแสดงเป็นคู่ของวงเล็บปีกกาที่ล้อมรอบคู่ชื่อ / ค่าเป็นศูนย์หรือมากกว่า (หรือสมาชิก) ชื่อคือสตริง เครื่องหมายโคลอนเดียวมาหลังชื่อแต่ละชื่อโดยแยกชื่อออกจากค่า เครื่องหมายจุลภาคเดียวคั่นค่าจากชื่อต่อไปนี้ ชื่อภายในวัตถุควรเป็นชื่อเฉพาะ

ECMAScript รองรับการสืบทอดตามต้นแบบ คอนสตรัคทุกคนมีต้นแบบที่เกี่ยวข้องและทุกวัตถุที่สร้างขึ้นโดยคอนสตรัคที่มีการอ้างอิงโดยนัยไปยังต้นแบบ (เรียกว่าต้นแบบของวัตถุ) ที่เกี่ยวข้องกับตัวสร้างของมัน นอกจากนี้ต้นแบบอาจมีการอ้างอิงที่ไม่เป็นค่าว่างโดยนัยกับต้นแบบและอื่น ๆ ; สิ่งนี้เรียกว่าโซ่ต้นแบบ

ในภาษาที่เน้นวัตถุในระดับคลาสโดยทั่วไปสถานะจะถูกดำเนินการโดยอินสแตนซ์วิธีการดำเนินการโดยคลาสและการสืบทอดเป็นเพียงโครงสร้างและพฤติกรรม ใน ECMAScript สถานะและวิธีดำเนินการโดยวัตถุและโครงสร้างพฤติกรรมและสถานะล้วนได้รับการสืบทอด

ต้นแบบเป็นวัตถุที่ใช้ในการสร้างโครงสร้างสถานะและการสืบทอดพฤติกรรมใน ECMAScript เมื่อตัวสร้างสร้างวัตถุวัตถุนั้นโดยปริยายอ้างอิงต้นแบบที่เกี่ยวข้องของตัวสร้างเพื่อวัตถุประสงค์ในการแก้ไขการอ้างอิงคุณสมบัติ ต้นแบบที่เกี่ยวข้องของคอนสตรัคสามารถอ้างอิงได้โดยนิพจน์โปรแกรม constructor.prototype และคุณสมบัติที่เพิ่มเข้ากับต้นแบบของออบเจ็กต์จะถูกแชร์ผ่านการสืบทอดโดยออบเจ็กต์ทั้งหมดที่แชร์ต้นแบบ


2

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

สารสกัดจากhttps://tools.ietf.org/html/rfc7159

  1. JavaScript Object Notation (JSON) เป็นรูปแบบข้อความสำหรับการจัดลำดับของข้อมูลที่มีโครงสร้าง มันมาจาก ตัวอักษรวัตถุของ JavaScript ตามที่กำหนดไว้ในมาตรฐานภาษาการเขียนโปรแกรม ECMAS รุ่นที่สาม [ECMA-262]
  2. JSON สามารถแสดงชนิดดั้งเดิมได้สี่ประเภท (สตริง, ตัวเลข, บูลีนและ null) และโครงสร้างที่มีสองประเภท ( วัตถุและอาร์เรย์)
  3. วัตถุเป็นคอลเลกชันเรียงลำดับของศูนย์หรือมากกว่าคู่ชื่อ / ค่าที่ชื่อเป็นสตริงและค่าเป็นสตริงจำนวนบูลีนโมฆะวัตถุหรืออาร์เรย์
  4. start -object = ws% x7B ws; {วงเล็บปีกกาซ้าย
  5. end-object = ws% x7D ws; } วงเล็บปีกกาด้านขวา
  6. ค่า JSON ต้องเป็นวัตถุอาร์เรย์ตัวเลขหรือสตริงหรือหนึ่งในสามชื่อตามตัวอักษรต่อไปนี้: false null จริง
  7. วัตถุโครงสร้างจะแสดงเป็นคู่ของวงเล็บปีกกา
  8. ชื่อภายในวัตถุควรเป็นชื่อเฉพาะ object = start-object [member * (สมาชิกตัวคั่นค่า)] end-object
  9. วัตถุที่มีชื่อไม่ซ้ำกันทั้งหมดคือการทำงานร่วมกันในแง่ที่ว่าทุกการใช้งานซอฟแวร์ที่ได้รับว่าวัตถุจะเห็นด้วยกับแมปชื่อค่า เมื่อชื่อภายในวัตถุไม่ซ้ำกันพฤติกรรมของซอฟต์แวร์ที่ได้รับวัตถุดังกล่าวจะไม่สามารถคาดเดาได้
  10. ตัวอย่าง (จากหน้า 12 ของ RFC)

    นี่คือวัตถุ JSON:

          {
            "Image": {
                "Width":  800,
                "Height": 600,
                "Title":  "View from 15th Floor",
                "Thumbnail": {
                    "Url":    "http://www.example.com/image/481989943",
                    "Height": 125,
                    "Width":  100
                },
                "Animated" : false,
                "IDs": [116, 943, 234, 38793]
              }
          }

    สมาชิกอิมเมจของมันเป็นวัตถุที่สมาชิกรูปขนาดย่อเป็นวัตถุและสมาชิก ID คืออาร์เรย์ของตัวเลข

ไม่มีสิ่งเช่น "วัตถุ JSON" จริงๆ

จริงๆ?


1
ดาวีก็ไม่ได้เป็นก็เป็นObject Stringขอบคุณ
abu abu

1

เท่าที่ผมเข้าใจความแตกต่างที่สำคัญคือมีความยืดหยุ่น

JSON เป็นตัวห่อหุ้มใน "JavaScript Object Notation" ซึ่งบังคับให้ผู้ใช้ปฏิบัติตามกฎที่เข้มงวดมากขึ้นสำหรับการกำหนดวัตถุ และทำได้โดยการ จำกัด วิธีการประกาศวัตถุที่เป็นไปได้ที่จัดทำโดยคุณสมบัติ JavaScript Object Notation

ดังนั้นเราจึงมีวัตถุที่เรียบง่ายและเป็นมาตรฐานซึ่งเหมาะสมกับการแลกเปลี่ยนข้อมูลระหว่างแพลตฟอร์ม

ดังนั้นโดยทั่วไป newObject ในตัวอย่างของฉันด้านบนเป็นวัตถุที่กำหนดโดยใช้ JavaScript Objeect Notation; แต่ไม่ใช่วัตถุ JSON 'ที่ถูกต้อง' เพราะไม่ปฏิบัติตามกฎที่มาตรฐาน JSON ต้องการ

ลิงค์นี้มีประโยชน์มาก: http://msdn.microsoft.com/en-us/library/bb299886.aspx


2
purpouse ของ JSON และสัญกรณ์วัตถุนั้นแตกต่างกันอย่างสิ้นเชิง: อันแรกใช้สำหรับการแลกเปลี่ยนข้อมูลเท่านั้นและอันที่สองสำหรับการสร้างออบเจ็กต์ JS สำหรับใช้ภายในเท่านั้น พวกเขาไม่ใช่รุ่นเดียวกันที่เข้มงวดมากขึ้นและน้อยลงในสิ่งเดียวกัน
ilyo

0

ก่อนอื่นคุณควรรู้ว่า JSON คืออะไร:

มันเป็นรูปแบบการแลกเปลี่ยนข้อมูลที่ไม่เชื่อเรื่องพระเจ้า ไวยากรณ์ของ JSON ได้รับแรงบันดาลใจจากสัญกรณ์ตัวอักษร JavaScript Object แต่มีความแตกต่างระหว่างพวกเขา

ตัวอย่างเช่นใน JSON คีย์ทั้งหมดจะต้องยกมาในขณะที่ในตัวอักษรวัตถุนี้ไม่จำเป็นต้อง:

// JSON: {"foo": "bar"}

// ออบเจกต์ตามตัวอักษร: var o = {foo: "bar"}; เครื่องหมายอัญประกาศมีผลบังคับใช้กับ JSON เนื่องจากใน JavaScript (มากกว่านั้นใน ECMAScript 3rd. Edition) การใช้คำสงวนเป็นชื่อคุณสมบัติจะไม่ได้รับอนุญาตตัวอย่างเช่น:

var o = {if: "foo"}; // SyntaxError ใน ES3 ในขณะที่การใช้สตริงตัวอักษรเป็นชื่อคุณสมบัติ (การอ้างชื่อคุณสมบัติ) จะไม่มีปัญหา:

var o = {"if": "foo"}; ดังนั้นสำหรับ "ความเข้ากันได้" (และอาจเป็นเรื่องง่ายที่จะประเมินได้) คำพูดนั้นเป็นข้อบังคับ

ชนิดข้อมูลใน JSON จะถูก จำกัด ด้วยค่าต่อไปนี้:

string number object array A ตัวอักษรเป็น: true false null ไวยากรณ์ของ Strings เปลี่ยนแปลง ต้องคั่นด้วยเครื่องหมายคำพูดคู่ในขณะที่ใน JavaScript คุณสามารถใช้เครื่องหมายคำพูดเดี่ยวหรือคู่แทนกันได้

// JSON ไม่ถูกต้อง: {"foo": 'bar'} ไวยากรณ์ JSON ที่เป็นที่ยอมรับของตัวเลขก็เปลี่ยนไปเช่นกันในจาวาสคริปต์คุณสามารถใช้ตัวอักษรฐานสิบหกเช่น 0xFF หรือ (ฐานแปด) เช่น JS10 ใน JSON คุณสามารถใช้ ตัวอักษรทศนิยมเท่านั้น

// JSON ไม่ถูกต้อง: {"foo": 0xFF}


0

Javascript Object ตัวอักษรเทียบกับ JSON:

  • ไวยากรณ์ตัวอักษรของวัตถุเป็นวิธีที่สะดวกมากในการสร้างวัตถุจาวาสคริปต์
  • JSONภาษาซึ่งย่อมาจาก 'โน้ตวัตถุ Javascript' มีไวยากรณ์ที่มาจากวัตถุจาวาสคริปต์อักษรไวยากรณ์ มันถูกใช้เป็นรูปแบบการถ่ายโอนข้อมูลข้อความภาษาอิสระ

ตัวอย่าง:

สัญกรณ์วัตถุ JS ใช้ใน JS เพื่อสร้างวัตถุในรหัสสิ่งอำนวยความสะดวก:

const JS_Object = {
  1: 2,  // the key here is the number 1, the value is the number 2
  a: 'b', // the key is the string a, the value is the string b
  func: function () { console.log('hi') }
  // the key is func, the value is the function
}

ตัวอย่างของ JSON:

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}

ความแตกต่างหลัก:

  • คีย์วัตถุทั้งหมดใน JSON ต้องเป็นสตริง ในคีย์วัตถุ Javascript สามารถเป็นสตริงหรือตัวเลข

  • สตริงทั้งหมดใน JSON ต้องอ้างอิงใน "เครื่องหมายคำพูดคู่" ในขณะที่ Javascript อนุญาตทั้งเครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่ แม้ว่าจะไม่มีเครื่องหมายอัญประกาศในเครื่องหมายจาวาสคริปต์วัตถุ แต่ก็ยังมีการใช้คีย์วัตถุในการกำหนดสตริง

  • ใน JSON ไม่สามารถกำหนดฟังก์ชั่นเป็นค่าของวัตถุ (เนื่องจากนี่เป็น Javascript ที่เฉพาะเจาะจง) ใน Javascript สิ่งนี้ถูกกฎหมายอย่างสมบูรณ์

Javascript บิวด์ในJSONวัตถุ:

JSONสามารถแปลงวัตถุเป็น Javascript ได้อย่างง่ายดายและในทางกลับกันโดยใช้JSONวัตถุที่มีอยู่แล้วภายใน Javascript ที่มีให้ในรันไทม์ ตัวอย่างเช่น:

const Object = {
  property1: true,
  property2: false,
}; // creating object with JS object literal syntax

const JSON_object = JSON.stringify(Object);  // stringify JS object to a JSON string

console.log(JSON_object); // note that the (string) keys are in double quotes

const JS_object = JSON.parse(JSON_object);  // parse JSON string to JS object

console.log(JS_object.property1, JS_object.property2); 
// accessing keys of the newly created object


0

นี่คือความแตกต่างที่น่าประหลาดใจอย่างหนึ่ง: คุณไม่สามารถใช้undefinedใน json และฟิลด์วัตถุทั้งหมดที่มีค่าไม่ได้กำหนดจะหายไปJSON.stringify

let object =  { "a": undefined } ;

let badJSON= '{ "a": undefined }';


console.log('valid JS object :', object );
console.log('JSON from object:', JSON.stringify(object) );
console.log('invalid json    :', JSON.parse(badJSON) );

🙈🙉🙊

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