অবজেক্ট স্প্রেড বনাম অবজেক্ট.স্যাসাইন


396

ধরা যাক আমার একটি optionsপরিবর্তনশীল আছে এবং আমি কিছু ডিফল্ট মান সেট করতে চাই।

এই দুটি বিকল্পের সুবিধা / অপূর্ণতা কী?

অবজেক্ট স্প্রেড ব্যবহার করে

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

বা অবজেক্ট.অ্যাসাইন ব্যবহার করে

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

এটি সেই প্রতিশ্রুতি যা আমাকে অবাক করেছিল।


4
ঠিক আছে, প্রথমটি প্রস্তাবিত নতুন সিনট্যাক্স এবং ES6 এর অংশ নয়, সুতরাং আপনি কোন স্ট্যান্ডার্ডটি মানতে চান তার উপর নির্ভর করে।
লোগানফস্মিথ

5
" সেরা " সংজ্ঞা দিন (সাবধানে, একটি মতামত ভিত্তিক প্রশ্ন দিয়ে শেষ করবেন না :-)
অমিত

1
নেটিভ সমর্থন ব্যতীত পরিবেশে চলতে থাকলে আপনি কীভাবে এটি সমর্থন করতে চান তা নির্ভর করতে পারে। সিনট্যাক্স আপনি কেবল সংকলন করতে সক্ষম হতে পারে। আপনার পলফিলের প্রয়োজন হতে পারে এমন কোনও অবজেক্ট বা পদ্ধতি।
জেএমএম

6
সামঞ্জস্যতা সমস্যাগুলি বাদ দিয়ে, অবজেক্ট.সেসাইন মূল বিষয়টিকে রূপান্তর করতে পারে যা দরকারী। ছড়িয়ে যায় না।
pstanton

2
@ পিস্ট্যান্টনের মন্তব্যটি স্পষ্ট করতে - অবজেক্ট.সেসাইন একটি বিদ্যমান টার্গেট অবজেক্টটি সংশোধন করতে পারে (অন্যান্য বৈশিষ্ট্য অক্ষত রেখে উত্স থেকে বৈশিষ্ট্যগুলি ওভাররাইট করে); এটি উত্স অবজেক্টটিকে স্পর্শ করে না । আমি প্রথমে তাঁর "আসল অবজেক্ট "টিকে" উত্স অবজেক্ট "হিসাবে পড়েছি, সুতরাং অন্য যে কেউ একইভাবে এটির অপ্রত্যাশিত করে তাদের জন্য এই নোটটি লিখছি। :)
টুলমেকারস্টেভ

উত্তর:


328

এটি অগত্যা সম্পূর্ণ নয়।

সিনট্যাক্স ছড়িয়ে দিন

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

সুবিধাদি:

  • নেটিভ সমর্থন ব্যতীত পরিবেশে মৃত্যুর জন্য কোড লেখার কোডটি, আপনি কেবল এই সিনট্যাক্সটি সংকলন করতে সক্ষম হতে পারেন (পলিফিল ব্যবহারের বিপরীতে)। (উদাহরণস্বরূপ বাবেল সহ)

  • কম ভার্বোস।

অসুবিধা:

  • যখন এই উত্তরটি মূলত লেখা হয়েছিল, এটি একটি প্রস্তাব ছিল , মানক নয়। প্রস্তাবগুলি ব্যবহার করার সময় আপনি যদি কোডটি এখনই লিখেন তবে আপনি কী করবেন তা বিবেচনা করুন এবং এটি মানীকরণের দিকে অগ্রসর হওয়ার সাথে সাথে এটি মানহীন বা কোনও পরিবর্তন হয় না। এটি ইএস ২০১৮ সালে মানিক করা হয়েছে।

  • আক্ষরিক, গতিশীল নয়।


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
উইলিস্টার

11
@ জেএমএম আমি নিশ্চিত নই যে আমি "আরও ভার্বোস" দেখেছি। অসুবিধা হিসাবে
ডাইভার্সএন্ডআরমোট.কম

6
@ ওম আমি ভালভাবে অনুমান করেছি যে আপনি এটি প্রমাণ করেছেন যে এটি একটি মতামত :) যদি কেউ এই সুবিধাটি স্বীকৃতি না দেয় তবে হ্যাঁ, অন্য সব কিছু সমান হয়ে তারা কেবল ব্যবহার করতে পারে Object.assign()। অথবা আপনি নিজেই কোনও বস্তুর অ্যারে এবং তাদের নিজস্ব প্রপসগুলিতে ম্যানুয়ালি এগুলি একটি লক্ষ্যতে নির্ধারিত করতে পারেন এবং এটিকে আরও ভার্জোজ করতে পারেন: পি
জেএমএম

7
@ জেএমএম যেমন উল্লেখ করেছে, এটি এখন ES2018 স্পেস নোড.green/#ES2018- ফিচারস-object-rest-spread- properties
সেবাস্তিয়ান এইচ।

2
"প্রতিটি বাইট গণনা করা হয়েছে" @yzorg
DiverseAndRemote.com

171

রেফারেন্স অবজেক্টের জন্য বিশ্রাম / স্প্রেডটি ECMAScript 2018 এ পর্যায় 4 হিসাবে চূড়ান্ত করা হয়েছে প্রস্তাবটি এখানে পাওয়া যাবে

বেশিরভাগ অংশ অবজেক্ট পুনরায় সেট করার জন্য এবং একইভাবে স্প্রেডের কাজের জন্য, মূল পার্থক্যটি হ'ল স্প্রেড বৈশিষ্ট্যগুলি সংজ্ঞায়িত করে, যখন Object.assign () তাদের সেট করে । এর অর্থ অবজেক্ট.স্যাসাইন () সেটারগুলি ট্রিগার করে।

এটি মনে রাখবেন যে এগুলি বাদে, অবজেক্টটি বিশ্রাম / স্প্রেড 1: 1 মানচিত্রে অবজেক্ট.স্যাসাইন () এ এবং অ্যারে (পুনরাবৃত্ত) স্প্রেডে আলাদাভাবে কাজ করে। উদাহরণস্বরূপ, একটি অ্যারে ছড়িয়ে দেওয়ার সময় নাল মানগুলি ছড়িয়ে দেওয়া হয়। তবে অবজেক্ট স্প্রেড নাল মান ব্যবহার করে নীরবে কিছুই ছড়িয়ে যায় না।

অ্যারে (অপরিবর্তনীয়) স্প্রেড উদাহরণ

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}

এটি কীভাবে অবজেক্ট.সেসাইন () কাজ করবে তার সাথে সামঞ্জস্যপূর্ণ, উভয়ই নিঃশব্দে কোনও ত্রুটি ছাড়াই নাল মান বাদ দেয়।

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

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

10
এটি নির্বাচিত উত্তর হওয়া উচিত।
ইভান প্লেস

4
এই উত্তরটি হওয়া উচিত ... এটি এখন ভবিষ্যত।
জাচারি আব্রেসচ 9:58

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};। যা হোক, আমি যতদূর জানি, আমরা আচরণ শুধু অ্যারের মত দেখতে হবে: //{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এটি একটি নতুন অবজেক্ট (এবং প্রোটোটাইপটি অনুলিপি করা হয়নি)।
মার্টিনাস

2
@ মার্টিনাস আপনি ঠিক বলেছেন, আমি সম্ভবত এটি খারাপভাবে বলেছি। আমি বোঝাতে চেয়েছিলাম যে প্রোটোটাইপ অনুলিপি করা বস্তুটিতে নেই। আমি এটিকে আরও পরিষ্কার করার জন্য সম্পাদনা করতে পারি।
শন ডসন

নিম্নলিখিতটি কি কোনও শ্রেণীর সাথে কোনও অগভীর "অগভীর ক্লোন" দেওয়ার উপায়? let target = Object.create(source); Object.assign(target, source);
টুলমেকারস্টেভ

@ টুলমেকারস্টেভ হ্যাঁ এটি সমস্ত বস্তুর "নিজস্ব বৈশিষ্ট্য" অনুলিপি করবে যা কার্যকরভাবে অগভীর ক্লোন হয়ে যাবে। দেখুন: স্ট্যাকওভারফ্লো.com
শন ডসন

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()প্রকৃতপক্ষে মানসম্পন্ন, যেখানে বস্তুর স্প্রেড ...এখনও হয়নি not একমাত্র সমস্যা হ'ল পূর্বের এবং ভবিষ্যতের জন্য ব্রাউজার সমর্থন, পরেও।

কোডটি এখানে খেলুন

আশাকরি এটা সাহায্য করবে.


1
ধন্যবাদ! আপনার কোড নমুনা সিদ্ধান্তটি আমার প্রসঙ্গের জন্য সত্যই সহজ করে তুলেছে। ট্রান্সপ্লেলার (বাবেল বা টাইপসক্রিপ্ট) ইনলাইন কোডে একটি পলিফিল অন্তর্ভুক্ত করে স্প্রেড অপারেটরটিকে ব্রাউজারগুলির সাথে আরও সুসংগত করে তোলে। শুধু আগ্রহের জন্য টাইপ করা বিষয় transpiled সংস্করণ হট্টগোল যেমন কার্যত একই: typescriptlang.org/play/...
মার্ক Whitfeld

2
হুম ... আপনার দুটি ক্ষেত্রে কি একই ফলাফল হবে না? প্রথম ক্ষেত্রে আপনি একটি বস্তু থেকে অন্য একটিতে বৈশিষ্ট্য অনুলিপি করছেন এবং অন্যটিতে আপনি একটি নতুন অবজেক্ট তৈরি করছেন। অবজেক্ট.অ্যাসাইন লক্ষ্যটি ফেরত দেয়, সুতরাং আপনার প্রথম ক্ষেত্রে Aজাস এবং নিউ ওবজেস এক একই।
কেভিন বি

একটি নতুন প্রথম প্যারামিটার যুক্ত করা {}উচিত অসঙ্গতি ঠিক করা উচিত।
কেভিন বি

11

অবজেক্ট স্প্রেড অপারেটর (...) ব্রাউজারগুলিতে কাজ করে না, কারণ এটি এখনও কোনও ইএস নির্দিষ্টকরণের অংশ নয়, কেবল একটি প্রস্তাব। বাবেল (বা অনুরূপ কিছু) দিয়ে এটি সংকলন করার একমাত্র বিকল্প।

আপনি দেখতে পাচ্ছেন, এটি কেবল অবজেক্ট.সেসাইন ({}) এর উপরে সিনট্যাকটিক চিনি।

আমি যতদূর দেখতে পাচ্ছি, এগুলি গুরুত্বপূর্ণ পার্থক্য।

  • অবজেক্ট.সেসাইন বেশিরভাগ ব্রাউজারে কাজ করে (সংকলন ব্যতীত)
  • ... বস্তুর জন্য মানক করা হয় না
  • ... দুর্ঘটনাক্রমে বস্তুটির পরিবর্তন থেকে আপনাকে রক্ষা করে
  • ... এটি ছাড়া ব্রাউজারগুলিতে পলফিল অবজেক্ট.সেসাইন করুন
  • ... একই ধারণাটি প্রকাশ করতে কম কোড দরকার needs

34
এটি সিনট্যাকটিক চিনি নয়Object.assign , কারণ স্প্রেড অপারেটর আপনাকে সর্বদা একটি নতুন অবজেক্ট দেয়।
ম্যাক্সআর্ট

4
প্রকৃতপক্ষে, আমি আশ্চর্য হয়েছি যে অন্যান্য ব্যক্তিরা পরিবর্তনের পার্থক্যের উপর বেশি জোর দিচ্ছেন না। সমস্ত বিকাশক ঘন্টা অবজেক্ট.সেসাইন দিয়ে ডিবাগিং দুর্ঘটনা মিউটেশনগুলি হারিয়ে যাওয়ার কথা ভাবেন
17:38

এটি এখন বেশিরভাগ আধুনিক ব্রাউজারগুলিতে সমর্থিত (অন্যান্য ES6 এর মতো): ডেভেলপার.মোজিলা.আর.এন.ইউ
ডকস / ওয়েব

11

আমি "স্প্রেড অবজেক্ট মার্জ" ইএস বৈশিষ্ট্য, ব্রাউজারগুলিতে এবং সরঞ্জামের মাধ্যমে বাস্তুতন্ত্রের স্থিতির সংক্ষিপ্ত বিবরণ দিতে চাই।

ফটকা খেলা

ব্রাউজারগুলি: ক্রোমে, এসএফ, ফায়ারফক্সে শীঘ্রই (ver০ নম্বর, আইআইইউসি)

  • এই দৃশ্য সহ Chrome 60 এ পাঠানো "স্প্রেড প্রোপার্টি" জন্য ব্রাউজার সমর্থন ।
  • এই দৃশ্যের জন্য সমর্থন বর্তমান ফায়ারফক্সে (59) কাজ করে না, তবে আমার ফায়ারফক্স বিকাশকারী সংস্করণে কাজ করে। সুতরাং আমি বিশ্বাস করি এটি ফায়ারফক্স 60 এ পাঠানো হবে।
  • সাফারি: পরীক্ষিত নয়, তবে কঙ্গাক্স বলেছেন যে এটি ডেস্কটপ সাফারি ১১.১ তে কাজ করে, তবে এসএফ 11 নয়
  • আইওএস সাফারি: টিজড করা হয়নি, তবে কঙ্গাক্স জানিয়েছে এটি আইওএস 11.3 এ কাজ করে, তবে আইওএস 11 এ নয়
  • এজ এ এখনও নেই

সরঞ্জামগুলি: নোড ৮.7, টিএস ২.১

লিংক

কোড নমুনা (সামঞ্জস্যতা পরীক্ষা হিসাবে দ্বিগুণ)

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 বছর লিখছি মূল প্রশ্নের পরে । তবে আমার খুব একই প্রশ্ন ছিল এবং এখানেই গুগল আমাকে পাঠিয়েছে। আমি দীর্ঘ লেজ উন্নত করার জন্য এসওর মিশনের দাস।

যেহেতু এটি "অ্যারে স্প্রেড" সিনট্যাক্সের একটি বিস্তৃতি তাই গুগল করা আমার পক্ষে খুব কঠিন, এবং সামঞ্জস্যতার টেবিলগুলিতে খুঁজে পাওয়া শক্ত। সবচেয়ে কাছের আমি খুঁজে পেলাম কঙ্গাক্স "সম্পত্তি ছড়িয়ে" , তবে সেই পরীক্ষার একই অভিব্যক্তিতে দুটি স্প্রেড থাকে না (মার্জ হয় না)। এছাড়াও, প্রস্তাবসমূহ / খসড়া / ব্রাউজারের স্ট্যাটাস পৃষ্ঠাগুলিতে থাকা নামটি "সম্পত্তি স্প্রেড" ব্যবহার করে তবে এটি আমার কাছে মনে হয় এটি "প্রথম প্রধান" ছিল "অবজেক্ট মার্জ" এর জন্য স্প্রেড সিনট্যাক্স ব্যবহারের প্রস্তাবগুলির পরে সম্প্রদায়টি এসেছিল। (এটি গুগল কেন এত কঠিন তা ব্যাখ্যা করতে পারে)) সুতরাং আমি এখানে আমার সন্ধানটি দলিল করি যাতে অন্যরা এই নির্দিষ্ট বৈশিষ্ট্যটি সম্পর্কে লিঙ্কগুলি দেখতে, আপডেট করতে এবং সংকলন করতে পারে। আমি আশা করি এটি ধরা পড়েছে অনুমান এবং ব্রাউজারগুলিতে এটি অবতরণের খবর ছড়িয়ে দিতে সহায়তা করুন।

শেষ অবধি, আমি এই তথ্যটি একটি মন্তব্য হিসাবে যুক্ত করেছিলাম, তবে আমি লেখকদের মূল অভিপ্রায় ভঙ্গ না করে এগুলি সম্পাদনা করতে পারিনি। বিশেষত, আমি @ চিলিপেনগুইনের মন্তব্যটি রিচার্ডশুল্টে সংশোধন করার অভিপ্রায়টি হারা না করে সম্পাদনা করতে পারি না। কিন্তু বছরগুলি পরে রিচার্ড সঠিক হয়ে উঠেছে (আমার মতে)। সুতরাং আমি পরিবর্তে এই উত্তরটি লিখছি, আশা করি এটি শেষ পর্যন্ত পুরানো উত্তরগুলির সন্ধান লাভ করবে (কয়েক বছর সময় লাগতে পারে তবে লম্বা লেজের প্রভাবটি এটাই, সর্বোপরি)।


3
আপনার "কেন উত্তর" বিভাগটির সম্ভবত প্রয়োজন নেই
লোকস্টহর্ড

@ লোকস্টহর্ড সম্ভবত আমি ২ য় অনুচ্ছেদে (কেন এই বিষয়টি গুগল করা এত কঠিন) তার নিজের বিভাগে নিয়ে যেতে পারি। তারপরে বাকী কোনও মন্তব্যে মাপসই হয়।
yzorg

8

দ্রষ্টব্য: স্প্রেড কেবল অবজেক্ট.সেসাইন-এর চারপাশে সিনট্যাকটিক চিনি নয়। তারা পর্দার পিছনে অনেক ভিন্নভাবে পরিচালনা করে।

অবজেক্ট.সেসাইন একটি নতুন অবজেক্টে সেটার প্রয়োগ করে, স্প্রেড করে না। উপরন্তু, অবজেক্ট অবশ্যই পুনরাবৃত্ত হতে হবে।

অনুলিপি যদি আপনার এই মুহুর্তের মতো বস্তুর মান প্রয়োজন তবে এটি ব্যবহার করুন এবং আপনি এই মানটি অবজেক্টের অন্যান্য মালিকদের দ্বারা যে কোনও পরিবর্তন প্রতিফলিত করতে চান তা চান না।

সর্বদা অনাগত বৈশিষ্ট্যগুলি অনুলিপি করার জন্য অবজেক্টের ভাল অনুশীলনের অগভীর অনুলিপি তৈরির জন্য এটি ব্যবহার করুন - যেহেতু পরিবর্তনীয় সংস্করণগুলি অপরিবর্তনীয় বৈশিষ্ট্যগুলিতে স্থানান্তরিত করা যায়, অনুলিপি নিশ্চিত করবে যে আপনি সর্বদা একটি অপরিবর্তনীয় বস্তুর সাথে লেনদেন করবেন

Assign 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/ উল্লেখ / অপারেটর /
স্প্রেড_সেন্টাক্স


1

এটি এখন ইএস of এর অংশ, এটি প্রমিত করা হয়েছে, এবং এমডিএন-তেও নথিভুক্ত করা হয়েছে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / অপারেটরস / স্প্রেড_অপিটর

এটি ব্যবহার করা খুব সুবিধাজনক এবং অবজেক্ট ডেস্ট্রাকচারিংয়ের পাশাপাশি প্রচুর অর্থবোধ করে।

উপরে উল্লিখিত আর একটি সুবিধা হ'ল অবজেক্ট.সেসাইন () এর গতিশীল ক্ষমতা, তবে এটি আক্ষরিক বস্তুর ভিতরে অ্যারে ছড়িয়ে দেওয়ার মতোই সহজ। সংকলিত বাবেল আউটপুটে এটি অবজেক্ট.সেসাইন () দ্বারা প্রদর্শিত যা হুবহু ব্যবহার করে

সুতরাং সঠিক উত্তরটি হ'ল অবজেক্ট স্প্রেডকে ব্যবহার করা যেহেতু এটি এখন প্রমিত, ব্যাপকভাবে ব্যবহৃত হয়েছে (প্রতিক্রিয়া দেখান, রিডেক্স, ইত্যাদি দেখুন) ব্যবহার করা সহজ, এবং অবজেক্ট.সেসাইন () এর সমস্ত বৈশিষ্ট্য রয়েছে


2
না, এটি ES6 এর অংশ নয়। আপনার সরবরাহ করা লিঙ্কটি কেবল অ্যারেতে স্প্রেড অপারেটরের ব্যবহারকে বোঝায় । জেএমএম এর উত্তরে বর্ণিত হিসাবে বস্তুগুলিতে স্প্রেড অপারেটরের ব্যবহার বর্তমানে একটি পর্যায় 2 (অর্থাত্ খসড়া) প্রস্তাব।
চিলিপেনগুইন

1
আমি ভাবি না যে আমি কখনও সম্পূর্ণ উত্তর মিথ্যা তথ্যের উপর ভিত্তি করে দেখেছি। এমনকি এক বছর পরেও, যদি ইএস স্পেক এবং বেশিরভাগ পরিবেশে সমর্থিত না হয় তবে এটি অংশ নয়।
3ocene

চিলি এবং 3o ভুল প্রমাণিত, রিচার্ড ঠিক আছে। ব্রাউজার সমর্থন এবং সরঞ্জাম সমর্থন সমস্ত অবতরণ, কিন্তু রিচার্ড এর উত্তর পরে 1.5 বছর সময় নিয়েছে। সমর্থিত সংক্ষিপ্তসারের জন্য আমার নতুন উত্তর দেখুন মার্চ
২০১. পর্যন্ত।

0

যখন আপনি অবজেক্ট.সেসাইন ব্যবহার করতে হবে তখন আমি এই সাধারণ উদাহরণটি যুক্ত করতে চাই।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.