ऑब्जेक्ट स्प्रेड बनाम Object.assign


396

मान लें कि मेरे पास एक optionsचर है और मैं कुछ डिफ़ॉल्ट मान सेट करना चाहता हूं।

इन दो विकल्पों का क्या लाभ / कमी है?

वस्तु प्रसार का उपयोग करना

options = {...optionsDefault, ...options};

या Object.assign का उपयोग कर रहे हैं

options = Object.assign({}, optionsDefault, options);

यही वह प्रतिबद्धता है जिसने मुझे आश्चर्यचकित कर दिया।


4
खैर, पहला प्रस्तावित नया वाक्य-विन्यास है और ES6 का हिस्सा नहीं है, इसलिए यह इस बात पर निर्भर करता है कि आप किस मानक का पालन करना चाहते हैं।
loganfsmyth

5
" सर्वश्रेष्ठ " को परिभाषित करें (ध्यान से, एक राय आधारित प्रश्न के साथ समाप्त न करें :-)
अमित

1
मूल समर्थन के बिना वातावरण में चलने पर आप इसे कैसे समर्थन देना चाहते हैं, यह भी निर्भर कर सकता है। सिंटेक्स आप बस संकलन करने में सक्षम हो सकता है। एक वस्तु या विधि जिसे आपको पॉलीफ़िल करने की आवश्यकता हो सकती है।
झामुमो

6
संगतता समस्याओं के अलावा, Object.assign मूल ऑब्जेक्ट को म्यूट कर सकता है जो उपयोगी है। फैल नहीं सकता।
2

2
@ Pstanton की टिप्पणी को स्पष्ट करने के लिए - object.assign एक मौजूदा लक्ष्य ऑब्जेक्ट को संशोधित कर सकता है (स्रोत से गुणों को अधिलेखित कर सकता है , जबकि अन्य गुण बरकरार है); यह स्रोत वस्तु को नहीं छूता है । मैंने पहली बार उनकी "मूल वस्तु" को "स्रोत वस्तु" के रूप में पढ़ा, इसलिए इस नोट को किसी और के लिए लिखना जो इसे गलत तरीके से लिखता है। :)
टूलमेकरसेव

जवाबों:


328

यह आवश्यक रूप से संपूर्ण नहीं है।

फैला हुआ वाक्यविन्यास

options = {...optionsDefault, ...options};

लाभ:

  • यदि मूल समर्थन के बिना वातावरण में निष्पादन के लिए कोड संलेखन, आप बस इस वाक्यविन्यास को संकलित करने में सक्षम हो सकते हैं (जैसा कि पॉलीफ़ायर का उपयोग करने के लिए विरोध किया जाता है)। (उदाहरण के लिए बैबेल के साथ)

  • कम क्रिया।

नुकसान:

  • जब यह जवाब मूल रूप से लिखा गया था, तो यह एक प्रस्ताव था , मानकीकृत नहीं था । प्रस्तावों का उपयोग करते समय विचार करें कि यदि आप इसके साथ कोड लिखते हैं तो आप क्या करेंगे और यह मानकीकृत नहीं होता है या यह मानकीकरण की ओर बढ़ता है। इसके बाद से ES2018 में मानकीकृत किया गया है।

  • शाब्दिक, गतिशील नहीं।


Object.assign()

options = Object.assign({}, optionsDefault, options);

लाभ:

  • मानकीकृत।

  • गतिशील। उदाहरण:

    var sources = [{a: "A"}, {b: "B"}, {c: "C"}];
    options = Object.assign.apply(Object, [{}].concat(sources));
    // or
    options = Object.assign({}, ...sources);

नुकसान:

  • अधिक क्रिया।
  • यदि मूल समर्थन के बिना वातावरण में निष्पादन के लिए संलेखन कोड आपको पॉलीफ़िल की आवश्यकता है।

यही वह प्रतिबद्धता है जिसने मुझे आश्चर्यचकित कर दिया।

यह सीधे तौर पर संबंधित नहीं है कि आप क्या पूछ रहे हैं। यह कोड उपयोग नहीं कर Object.assign()रहा था, यह उपयोगकर्ता कोड ( object-assign) का उपयोग कर रहा था जो समान कार्य करता है। वे उस कोड को बैबेल के साथ संकलित करते हैं (और इसे वेबपैक के साथ बंडल करते हैं), जो कि मैं बात कर रहा था: सिंटैक्स आप बस संकलित कर सकते हैं। उन्होंने स्पष्ट रूप से पसंद किया है कि object-assignएक निर्भरता के रूप में शामिल करने के लिए जो उनके निर्माण में जाएंगे।


15
यह ध्यान देने योग्य हो सकता है कि ऑब्जेक्ट रेस्ट स्प्रेड 3 स्टेज पर चला गया है, इसलिए भविष्य में twitter.com/sebmarkbage/status/781564713750573056
williaster

11
@ जेएमएम मुझे यकीन नहीं है कि मैं "अधिक क्रिया" देखूंगा। एक नुकसान के रूप में।
DiverseAndRemote.com

6
@ अच्छी तरह से मुझे लगता है कि आप बस साबित कर दिया है कि यह एक राय है :) अगर कोई उस लाभ को नहीं पहचानता है, तो हाँ, बाकी सभी समान होने के नाते वे बस उपयोग कर सकते हैं Object.assign()। या आप मैन्युअल रूप से वस्तुओं की एक सरणी पर और अपने स्वयं के प्रॉप्स पर मैन्युअल रूप से पुनरावृति कर सकते हैं, उन्हें मैन्युअल रूप से एक लक्ष्य पर नियत करें और इसे और भी अधिक क्रियाशील बनाएं: P
JMM

7
जैसा कि @JMM ने उल्लेख किया है, यह अब ES2018 के विशेष नोड
सेबस्टियन एच।

2
"हर बाइट मायने रखता है" यह वही है जो @yzorg के लिए मिनिमलाइज़र्स / बदसूरत है
DiverseAndRemote.com

171

संदर्भ वस्तु के लिए बाकी / प्रसार को ईसीएमएस्क्रिप्ट 2018 में एक चरण के रूप में अंतिम रूप दिया गया है। प्रस्ताव यहां पाया जा सकता है

अधिकांश भाग ऑब्जेक्ट रीसेट और फैलाने के लिए उसी तरह काम करते हैं, मुख्य अंतर यह है कि प्रसार गुण को परिभाषित करता है, जबकि Object.assign () उन्हें सेट करता है । इसका अर्थ है Object.assign () ट्रिगर बसता है।

यह याद रखने योग्य है कि इसके अलावा, ऑब्जेक्ट रेस्ट / स्प्रेड 1: 1 मैप्स टू ऑब्जेक्ट.स्सिग्न () और एरे (फैलने योग्य) फैलाने के लिए अलग-अलग कार्य करता है। उदाहरण के लिए, जब एक सरणी अशक्त मान फैल रहा है। हालाँकि ऑब्जेक्ट स्प्रेड अशक्त मानों के उपयोग से चुपचाप कुछ भी नहीं फैलता है।

ऐरे (Iterable) स्प्रेड उदाहरण

const x = [1, 2, null , 3];
const y = [...x, 4, 5];
const z = null;

console.log(y); // [1, 2, null, 3, 4, 5];
console.log([...z]); // TypeError

ऑब्जेक्ट स्प्रेड उदाहरण

const x = null;
const y = {a: 1, b: 2};
const z = {...x, ...y};

console.log(z); //{a: 1, b: 2}

यह कैसे Object.assign () काम करेगा के साथ संगत है, दोनों चुपचाप बिना किसी त्रुटि के अशक्त मान को बाहर करते हैं।

const x = null;
const y = {a: 1, b: 2};
const z = Object.assign({}, x, y);

console.log(z); //{a: 1, b: 2}

10
यह चयनित उत्तर होना चाहिए।
इवान प्लाइस

4
यह उत्तर होना चाहिए ... यह अब भविष्य है।
ज़ाचारी अब्रेस्च

1
यह सही जवाब है। मुख्य अलग-अलग का Object.assignउपयोग करेगा बसे। Object.assign({set a(v){this.b=v}, b:2}, {a:4}); // {b: 4}बनाम{...{set a(v){this.b=v}, b:2}, ...{a:4}}; // {a: 4, b: 2}
डेविड बोहो

1
"भविष्य अब यह है कि!" - जॉर्ज एलन कल बहुत देर हो चुकी है।
रफिन

1
नल को अलग तरह से संभाले जाने का प्रदर्शन "सेब और संतरे" है - एक सार्थक तुलना नहीं। सरणी के मामले में, नल सरणी का एक तत्व है। प्रसार मामले में, नल पूरी वस्तु है। सही तुलना एक्स एक है करने के लिए के लिए किया जाएगा अशक्त संपत्ति : const x = {c: null};। जिस स्थिति में, AFAIK, हम सरणी की तरह ही व्यवहार देखेंगे //{a: 1, b: 2, c: null}:।
टूलमेकरसेव

39

मुझे लगता है कि प्रसार ऑपरेटर के बीच एक बड़ा अंतर Object.assignयह है कि वर्तमान जवाबों में इसका उल्लेख नहीं किया गया है, यह है कि प्रसार ऑपरेटर स्रोत ऑब्जेक्ट के लक्ष्य वस्तु को कॉपी नहीं करेगा। यदि आप किसी ऑब्जेक्ट में गुण जोड़ना चाहते हैं और आप यह नहीं बदलना चाहते हैं कि यह किस उदाहरण का है, तो आपको इसका उपयोग करना होगा Object.assign। नीचे दिए गए उदाहरण से यह प्रदर्शित होना चाहिए:

const error = new Error();
error instanceof Error // true

const errorExtendedUsingSpread = {
  ...error,
  ...{
    someValue: true
  }
};
errorExtendedUsingSpread instanceof Error; // false

const errorExtendedUsingAssign = Object.assign(error, {
  someValue: true
});
errorExtendedUsingAssign instanceof Error; // true


"प्रोटोटाइप बरकरार नहीं रखेगा" - यह निश्चित रूप से होगा, क्योंकि यह कुछ भी संशोधित नहीं करता है। आपके उदाहरण में errorExtendedUsingAssign === error, लेकिन errorExtendedUsingSpreadएक नई वस्तु है (और प्रोटोटाइप की प्रतिलिपि नहीं बनाई गई थी)।
maaartinus

2
@maaartinus आप सही कह रहे हैं, मैंने शायद यह बुरी तरह से कहा है। मेरा मतलब था कि प्रोटोटाइप कॉपी किए गए ऑब्जेक्ट पर नहीं है। मैं इसे स्पष्ट करने के लिए संपादित कर सकता हूं।
शॉन डावसन

निम्नलिखित अपने वर्ग के साथ एक वस्तु "उथले क्लोन" का एक तरीका है? let target = Object.create(source); Object.assign(target, source);
टूलमेकरसैट

@ToolmakerSteve हाँ, यह सभी ऑब्जेक्ट के "अपने गुणों" की नकल करेगा, जिसके पार प्रभावी रूप से एक उथले क्लोन होगा। देखें: stackoverflow.com/questions/33692912/…
सीन डॉसन

12

जैसा कि दूसरों ने उल्लेख किया है, लेखन के इस क्षण में, काम करने के Object.assign()लिए एक ...पॉलीफ़िल और ऑब्जेक्ट स्प्रेड की आवश्यकता होती है ताकि काम करने के लिए कुछ ट्रांसप्लिंग (और शायद एक पॉलीफ़िल भी) की आवश्यकता हो।

इस कोड पर विचार करें:

// Babel wont touch this really, it will simply fail if Object.assign() is not supported in browser.
const objAss = { message: 'Hello you!' };
const newObjAss = Object.assign(objAss, { dev: true });
console.log(newObjAss);

// Babel will transpile with use to a helper function that first attempts to use Object.assign() and then falls back.
const objSpread = { message: 'Hello you!' };
const newObjSpread = {...objSpread, dev: true };
console.log(newObjSpread);

ये दोनों एक ही आउटपुट का उत्पादन करते हैं।

यहां बाबेल से लेकर ES5 तक का आउटपुट दिया गया है:

var objAss = { message: 'Hello you!' };
var newObjAss = Object.assign(objAss, { dev: true });
console.log(newObjAss);

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var objSpread = { message: 'Hello you!' };
var newObjSpread = _extends({}, objSpread, { dev: true });
console.log(newObjSpread);

यह मेरी अब तक की समझ है। Object.assign()वास्तव में मानकीकृत है, जहां वस्तु प्रसार के रूप में ...अभी तक नहीं है। एकमात्र समस्या पूर्व और भविष्य के लिए ब्राउज़र समर्थन है, बाद में भी।

यहां कोड के साथ खेलें

उम्मीद है की यह मदद करेगा।


1
धन्यवाद! आपका कोड नमूना मेरे संदर्भ के लिए निर्णय को वास्तव में आसान बनाता है। ट्रांसपेलर (बैबल या टाइपस्क्रिप्ट) इनलाइन कोड में पॉलीफिल को शामिल करके प्रसार ऑपरेटर को ब्राउज़रों के लिए अधिक संगत बनाता है। बस रुचि के लिए टाइपप्रति transpiled संस्करण कोलाहल के रूप में लगभग एक ही है: typescriptlang.org/play/...
मार्क Whitfeld

2
हम्म ... क्या आपके दो मामले समान परिणाम नहीं देंगे ? पहले मामले में आप एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट में कॉपी कर रहे हैं, और दूसरे में आप एक नई ऑब्जेक्ट बना रहे हैं। Object.assign लक्ष्य को लौटाता है, इसलिए आपके पहले मामले में objAss और newObjAss समान हैं।
केविन बी

{}असंगतता को ठीक करने का एक नया पहला पैरामीटर जोड़ना चाहिए।
केविन बी

11

ऑब्जेक्ट स्प्रेड ऑपरेटर (...) ब्राउज़र में काम नहीं करता है, क्योंकि यह अभी तक किसी ईएस विनिर्देश का हिस्सा नहीं है, बस एक प्रस्ताव है। एकमात्र विकल्प इसे बाबेल (या कुछ इसी तरह) के साथ संकलित करना है।

जैसा कि आप देख सकते हैं, यह Object.assign ({}) से अधिक सिंटैक्टिक चीनी है।

जहां तक ​​मैं देख सकता हूं, ये महत्वपूर्ण अंतर हैं।

  • Object.assign अधिकांश ब्राउज़रों में काम करता है (संकलन के बिना)
  • ... वस्तुओं के लिए मानकीकृत नहीं है
  • ... आपको गलती से ऑब्जेक्ट को म्यूट करने से बचाता है
  • ... इसके बिना ब्राउज़रों में Object.assign पॉलीफ़िल करेगा
  • ... समान विचार व्यक्त करने के लिए कम कोड की आवश्यकता होती है

34
इसके लिए सिंटैक्टिक शुगर नहीं हैObject.assign , क्योंकि प्रसार ऑपरेटर आपको हमेशा एक नई वस्तु देगा।
मैक्सआर्ट

4
वास्तव में, मुझे आश्चर्य है कि अन्य लोग उत्परिवर्तन अंतर को अधिक महत्व नहीं दे रहे हैं। डेवलपर घंटे के सभी Object.assign के साथ आकस्मिक उत्परिवर्तन डिबगिंग खो घंटे के बारे में सोचो
गहरीकरण

यह अब अधिकांश आधुनिक ब्राउज़रों (अन्य ES6 के साथ) में समर्थित है: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
akmalhakimi1991

11

मैं "स्प्रेड ऑब्जेक्ट मर्ज" ES सुविधा को ब्राउज़रों में, और इकोसिस्टम में टूल के माध्यम से संक्षेपित करना चाहूंगा।

कल्पना

ब्राउज़र्स: क्रोम में, एसएफ में, फ़ायरफ़ॉक्स जल्द (क्रिया 60, IIUC)

  • इस परिदृश्य सहित Chrome 60 में "स्प्रेड प्रॉपर्टीज़" के लिए ब्राउज़र समर्थन ।
  • इस परिदृश्य के लिए समर्थन वर्तमान फ़ायरफ़ॉक्स (59) में काम नहीं करता है, लेकिन मेरे फ़ायरफ़ॉक्स डेवलपर संस्करण में काम नहीं करता है। इसलिए मेरा मानना ​​है कि यह फ़ायरफ़ॉक्स 60 में जहाज जाएगा।
  • सफारी: परीक्षण नहीं किया गया है, लेकिन कंगैक्स का कहना है कि यह डेस्कटॉप सफारी 11.1 में काम करता है, लेकिन एसएफ 11 नहीं
  • iOS Safari: teseted नहीं, लेकिन Kangax का कहना है कि यह iOS 11.3 में काम करता है, लेकिन iOS 11 में नहीं
  • अभी एज में नहीं

उपकरण: नोड 8.7, टीएस 2.1

लिंक

कोड नमूना (संगतता परीक्षण के रूप में युगल)

var x = { a: 1, b: 2 };
var y = { c: 3, d: 4, a: 5 };
var z = {...x, ...y};
console.log(z); // { a: 5, b: 2, c: 3, d: 4 }

फिर से: क्रोम (60+), फ़ायरफ़ॉक्स डेवलपर संस्करण (फ़ायरफ़ॉक्स 60 का पूर्वावलोकन), और नोड (8.7+) में ट्रांसप्लिमेंटेशन के बिना यह नमूना लिखने के समय।

उत्तर क्यों?

मैं मूल प्रश्न के 2.5 साल बाद यह लिख रहा हूं । लेकिन मेरे पास एक ही सवाल था, और यह वह जगह है जहां Google ने मुझे भेजा है। मैं लंबी पूंछ को सुधारने के लिए एसओ के मिशन का दास हूं।

चूँकि यह "सरणी स्प्रेड" सिंटैक्स का विस्तार है, इसलिए मैंने इसे Google पर बहुत कठिन पाया, और कम्पैटिबिलिटी टेबल में खोजने में मुश्किल हुई। निकटतम मुझे मिल सकता है कंगैक्स "संपत्ति प्रसार" , लेकिन उस परीक्षा में एक ही अभिव्यक्ति में दो स्प्रेड नहीं हैं (मर्ज नहीं)। इसके अलावा, प्रस्तावों / ड्राफ्ट / ब्राउज़र स्थिति पृष्ठों में नाम सभी "संपत्ति प्रसार" का उपयोग करते हैं, लेकिन यह मुझे ऐसा लगता है जैसे "ऑब्जेक्ट मर्ज" के लिए फैल सिंटैक्स का उपयोग करने के प्रस्तावों के बाद समुदाय "प्रथम प्रमुख" था। (जो यह समझा सकता है कि यह Google के लिए इतना कठिन क्यों है।) इसलिए मैं अपनी खोज को यहां दस्तावेज़ित करता हूं ताकि अन्य लोग इस विशिष्ट सुविधा के बारे में लिंक देख सकें, अपडेट कर सकें और संकलन कर सकें। मुझे आशा है कि यह पकड़ता है। कृपया कल्पना में और ब्राउज़र में उतरने की खबर फैलाने में मदद करें।

अन्त में, मैंने इस जानकारी को एक टिप्पणी के रूप में जोड़ा होगा, लेकिन मैं लेखकों के मूल इरादे को तोड़े बिना उन्हें संपादित नहीं कर सकता था। विशेष रूप से, मैं @ ChillyPenguin की टिप्पणी को संपादित नहीं कर सकता, इसके बिना वह @RichardSchulte को सही करने के इरादे से हार गया। लेकिन सालों बाद रिचर्ड सही निकला (मेरी राय में)। इसलिए मैं इसके बजाय यह उत्तर लिखता हूं, उम्मीद करता हूं कि यह पुराने उत्तरों पर अंततः कर्षण प्राप्त करेगा (शायद वर्षों लग सकते हैं, लेकिन लंबी पूंछ प्रभाव क्या है , आखिरकार)।


3
आपके "क्यों उत्तर" अनुभाग की शायद आवश्यकता नहीं है
LocustHorde

@LocustHorde शायद मैं दूसरा पैराग्राफ स्थानांतरित कर सकता हूं (यह विषय Google के लिए इतना कठिन क्यों है) यह स्वयं अनुभाग है। फिर बाकी एक टिप्पणी में फिट हो सकते हैं।
यज़्गोर

8

नोट: स्प्रेड ऑब्जेक्ट.साइन के आसपास सिंटैक्टिक शुगर नहीं है। वे पर्दे के पीछे बहुत अलग तरीके से काम करते हैं।

Object.assign किसी नई ऑब्जेक्ट पर बसने के लिए लागू होता है, स्प्रेड नहीं करता है। इसके अलावा, ऑब्जेक्ट को चलने योग्य होना चाहिए।

प्रतिलिपि का उपयोग करें यदि आपको इस समय ऑब्जेक्ट के मूल्य की आवश्यकता है, और आप उस मूल्य को ऑब्जेक्ट के अन्य मालिकों द्वारा किए गए किसी भी परिवर्तन को प्रतिबिंबित नहीं करना चाहते हैं।

ऑब्जेक्ट की उथली प्रतिलिपि बनाने के लिए इसका उपयोग करें अच्छा अभ्यास हमेशा कॉपी करने के लिए अपरिवर्तनीय गुण सेट करने के लिए - क्योंकि उत्परिवर्तनीय संस्करणों को अपरिवर्तनीय गुणों में पारित किया जा सकता है, प्रतिलिपि यह सुनिश्चित करेगी कि आप हमेशा एक अपरिवर्तनीय वस्तु के साथ काम करेंगे

निरुपित निरूपण कुछ प्रति के विपरीत है। असाइन करें एक सेटर उत्पन्न करेगा जो मान को चर को कॉपी करने या बनाए रखने के बजाय सीधे वेरिएबल को प्रदान करता है। जब किसी असाइन की गई संपत्ति के गेटर को कॉल किया जाता है, तो यह वास्तविक डेटा का संदर्भ देता है।


3
इसे "कॉपी" क्यों कहते हैं? ये बोल्ड हेडिंग क्या हैं। मुझे लगता है कि जब मैंने इसे पढ़ा तो मुझे कुछ संदर्भ याद

2

अन्य उत्तर पुराने हैं, एक अच्छा उत्तर नहीं मिल सका।
उदाहरण उदाहरण वस्तु शाब्दिक के लिए है, दोनों एक दूसरे को पूरक कैसे कर सकते हैं और यह एक दूसरे को पूरक कैसे कर सकता है (इसलिए अंतर):

var obj1 = { a: 1,  b: { b1: 1, b2: 'b2value', b3: 'b3value' } };

// overwrite parts of b key
var obj2 = {
      b: {
        ...obj1.b,
        b1: 2
      }
};
var res2 = Object.assign({}, obj1, obj2); // b2,b3 keys still exist
document.write('res2: ', JSON.stringify (res2), '<br>');
// Output:
// res2: {"a":1,"b":{"b1":2,"b2":"b2value","b3":"b3value"}}  // NOTE: b2,b3 still exists

// overwrite whole of b key
var obj3 = {
      b: {
        b1: 2
      }
};
var res3 = Object.assign({}, obj1, obj3); // b2,b3 keys are lost
document.write('res3: ', JSON.stringify (res3), '<br>');
// Output:
  // res3: {"a":1,"b":{"b1":2}}  // NOTE: b2,b3 values are lost

यहाँ कई और छोटे उदाहरण हैं, यह भी सरणी और ऑब्जेक्ट के लिए:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax


1

यह अब ES6 का हिस्सा है, इस प्रकार इसे मानकीकृत किया जाता है, और MDN पर भी प्रलेखित किया जाता है: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_uperator

यह उपयोग करने के लिए बहुत सुविधाजनक है और वस्तु विनाशकारी के साथ बहुत अधिक समझ में आता है।

ऊपर सूचीबद्ध एक शेष लाभ Object.assign () की गतिशील क्षमता है, हालांकि यह एक शाब्दिक वस्तु के अंदर सरणी को फैलाने जितना आसान है। संकलित बेबल आउटपुट में यह वही उपयोग करता है जो Object.assign () के साथ प्रदर्शित होता है

तो इसका सही उत्तर यह होगा कि ऑब्जेक्ट फैले हुए का उपयोग करें क्योंकि यह अब मानकीकृत है, व्यापक रूप से उपयोग किया जाता है (प्रतिक्रिया, Redux, आदि देखें), उपयोग करना आसान है, और इसमें Object.assign () की सभी विशेषताएं हैं


2
नहीं, यह ES6 का हिस्सा नहीं है। लिंक है कि आप की आपूर्ति की है, उन पर फैल ऑपरेटर के उपयोग को संदर्भित करता सरणियों केवल। जेएमएम के उत्तर में बताई गई वस्तुओं पर स्प्रेड ऑपरेटर का उपयोग वर्तमान में एक स्टेज 2 (यानी ड्राफ्ट) प्रस्ताव है।
चिलीपेंगिन

1
मुझे नहीं लगता कि मैंने कभी भी एक जवाब देखा है ताकि पूरी तरह से गलत जानकारी पर आधारित हो। एक साल बाद भी, अगर ईएस कल्पना और अधिकांश वातावरणों में समर्थित नहीं है तो यह हिस्सा नहीं है।
3ocene

चिली और 3o गलत निकले, रिचर्ड ने सही कहा। ब्राउज़र समर्थन और उपकरण समर्थन सभी लैंडिंग हैं, लेकिन रिचर्ड के जवाब के बाद 1.5 साल लग गए। मार्च 2018 के समर्थन के सारांश के लिए मेरा नया उत्तर देखें।
yzorg

0

जब आप Object.assign का उपयोग करना चाहते हैं तो मैं यह सरल उदाहरण जोड़ना चाहूंगा।

class SomeClass {
  constructor() {
    this.someValue = 'some value';
  }

  someMethod() {
    console.log('some action');
  }
}


const objectAssign = Object.assign(new SomeClass(), {});
objectAssign.someValue; // ok
objectAssign.someMethod(); // ok

const spread = {...new SomeClass()};
spread.someValue; // ok
spread.someMethod(); // there is no methods of SomeClass!

जब आप जावास्क्रिप्ट का उपयोग करते हैं तो यह स्पष्ट नहीं हो सकता। लेकिन टाइपस्क्रिप्ट के साथ यह आसान है यदि आप कुछ वर्ग का उदाहरण बनाना चाहते हैं

const spread: SomeClass = {...new SomeClass()} // Error
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.