जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक: वास्तव में {a, b, c} क्या है?


88

मेरे पास इस jsfiddle के माध्यम से सबसे अच्छा प्रश्न है , जिसके लिए कोड नीचे है:

var a = 1, b = 'x', c = true;

var d = {a: a, b: b, c: c}; // <--- object literal
var e = [a, b, c];          // <--- array
var f = {a, b, c};          // <--- what exactly is this??

// these all give the same output:
alert(d.a  + ', ' + d.b +  ', ' + d.c );
alert(e[0] + ', ' + e[1] + ', ' + e[2]);
alert(f.a  + ', ' + f.b +  ', ' + f.c );

डेटा संरचना किस प्रकार की है f? क्या यह सिर्फ एक आशुलिपि है d?


25
पहले वाला वास्तव में JSON नहीं है।
GolezTrol


1
ठीक @GolezTrol यह कड़ाई से JSON नहीं है क्योंकि चाबियाँ दोहरे उद्धरण चिह्नों में नहीं हैं। तो आप वास्तव में मेरी पोस्ट में डेटा संरचना को क्या कहेंगे d?
drmrbrewer

6
यह समझना महत्वपूर्ण है कि कोई भी संस्करण मान्य JSON नहीं है। JSON स्ट्रिंग के रूप में डेटा का प्रतिनिधित्व करने का तरीका होगा{"a" : 1, "b" : "x", "c" : true }
बेंजामिन Gruenbaum

14
@drmrbrewer यह एक वस्तु शाब्दिक है । यह JSON नहीं है क्योंकि यह जावास्क्रिप्ट कोड है , जबकि JSON एक क्रमांकन प्रारूप है। उदाहरण के लिए var a = '{ "a" : "value"}'-> aएक स्ट्रिंग रखता है जिसे किसी वस्तु के माध्यम से हटाया जा सकता है JSON.parse
चंद्रावेव ९९

जवाबों:


71

यह ES6 में एक वस्तु प्रारंभिक संपत्ति आशुलिपि है।

var f = {a, b, c, d:1}; // Will be equal to {a:a, b:b, c:c, d:1}

यह काम करता है क्योंकि संपत्ति के मूल्य का एक ही नाम संपत्ति पहचानकर्ता है। यह नवीनतम ईसीएमएस्क्रिप्ट 6 ड्राफ्ट रेव 13 में ऑब्जेक्ट इनिशिएटिव ( धारा 11.1.5 ) के सिंटैक्स के लिए एक नया अतिरिक्त है । और हां, ECMAScript 3 से निर्धारित सीमाएँ की तरह, आप अपनी संपत्ति के नाम के रूप में आरक्षित शब्द का उपयोग नहीं कर सकते।

इस तरह के एक शॉर्टहैंड नाटकीय रूप से आपके कोड को नहीं बदलेगा, यह केवल सब कुछ थोड़ा मीठा बनाता है!

function createCar(name, brand, speed) {
  return { type: 'Car', name: name, brand: brand, speed: speed };
}

// With the new shorthand form
function createSweetCar(name, brand, speed) {
  return { type: 'Car', name, brand, speed }; // Yes it looks sweet.
}

कृपया इन सूचनाओं के समर्थन के लिए संगतता तालिका देखें। गैर-सहायक वातावरण में, ये अंकन सिंटैक्स त्रुटियों को जन्म देगा।

यह आशुलिपि अंकन वस्तु को बहुत अच्छी तरह से मेल खाता है:

में ECMAScript5 हम करते थे क्या:

var tmp = getData();
var op  = tmp.op;
var lhs = tmp.lhs;
var rhs = tmp.rhs;

ECMAScript6 में कोड की एक पंक्ति के साथ किया जा सकता है :

var { op, lhs, rhs } = getData();

10
भाषा सुविधा बनने के लिए यह इतना उपयोगी क्यों होगा? ऐसा लगता है कि लोगों को या तो वस्तु को सीधे शब्दशः शुरू करना, मूल्यों को वापस करना, या इस तरह से या केवल पहले वस्तु का निर्माण करना अधिक सामान्य होगा, फिर सीधे गुण सेट करें। समान नामों के साथ वैरिएबल बनाना, उन्हें त्वरित करना, और फिर अंत में इस तरह से ऑब्जेक्ट को इनिशियलाइज़ करना बस असामान्य लगता है ... या क्या ऐसा होता है?
Panzercrisis

3
@Panzercrisis ऐसा लगता है कि यह व्यक्तिगत रूप से बग को खोजने के लिए बहुत सारे अनपेक्षित और कठिन होगा। बहुत कुछ वैसा ही जैसा कि if(a = 1) {...}वैध सिंटैक्स की अनुमति देता है।
एंथनी ग्रिस्ट

1
@Panzercrisis मुझे लगता है कि यह कम से कम समझ में आता है अगर आप कल्पना करते हैं कि ए, बी और सी अधिक जटिल डेटा संरचनाओं के रूप में हैं और एफ भी अन्य जटिल गुणों से युक्त हैं। अभी भी यकीन नहीं है कि यह एक अच्छा विचार है, लेकिन मैं देख सकता हूं कि यह उपयोगी है।
जोश रंबुट

1
@Panzercrisis लैंबडा फंक्शन से टपल लौटना बहुत उपयोगी हो सकता है, कुछ ऐसा (a, b) => {a, b}। कम से कम मैंने उसी सुविधा का उपयोग कैसे किया C#
विंसेंट वैन डेर वेले

2
@ एलेक्स यह "क्वर्की" या "जटिल" कैसे है? एक बहुत ही सामान्य बात जो आप सामान्य रूप से कई कोडबेस में पाएंगे, वह एक ऐसी वस्तु का इनिशियलाइज़ेशन है, जहाँ कुंजी मूल्य के रूप में दिए गए चर से मेल खाती है, {id: id, data: data, isSelected: isSelected}स्थानीय वस्तुओं में आने वाली वस्तुओं की मैपिंग और फिर वापस आने पर बहुत कुछ होता है। अधिकांश मामलों में आप अपने सामान को थोड़ा अलग नाम नहीं देना चाहते हैं, {identifier: id, viewData: data, isElementSelected: isSelected }यह बिल्कुल "quirky", "जटिल" और "भ्रामक" है जिसके बारे में आप बात कर रहे हैं।
वीएलजी

77
var f = {a, b, c};

यह ES6 (ECMAScript 2015) के साथ आया और इसका मतलब बिल्कुल वैसा ही है:

var f = {a: a, b: b, c: c};

इसे ऑब्जेक्ट लिटरल प्रॉपर्टी वैल्यू शॉर्टहैंड्स (या केवल प्रॉपर्टी वैल्यू शॉर्टहैंड, शॉर्टहैंड प्रॉपर्टीज) कहा जाता है।

आप शास्त्रीय आरंभीकरण के साथ शॉर्टहैंड को भी जोड़ सकते हैं:

var f = {a: 1, b, c};

अधिक जानकारी के लिए ऑब्जेक्ट इनिशियलज़र देखें ।


12
var f = {a, b, c};          // <--- what exactly is this??

यह नए ECMAScript 2015 संकेतन का उपयोग करके जावास्क्रिप्ट में एक वस्तु को परिभाषित करता है:

मोज़िला डेवलपर नेटवर्क के अनुसार :

"ऑब्जेक्ट्स को नई वस्तु (), Object.create (), या शाब्दिक अंकन (प्रारंभिक संकेतन) का उपयोग करके आरम्भ किया जा सकता है। एक वस्तु इनिशियलाइज़र, किसी वस्तु के शून्य या अधिक जोड़े और संबंधित ऑब्जेक्ट के संबंधित मूल्यों की एक सूची है, जो संलग्न है। घुंघराले ब्रेसिज़ ({})।"

var a = "foo", 
    b = 42, 
    c = {};

// Shorthand property names (ES6)
var o = { a, b, c }; 

के बराबर है:

var a = "foo", 
    b = 42,
    c = {};

var o = { 
  a: a,
  b: b,
  c: c
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.