অবজেক্ট বিনা বিনা বিন্যাসে


102

varএর সামনে কোনও কীওয়ার্ড না থাকলে কেন অবজেক্ট ডেস্ট্রাকচারিং ত্রুটি ফেলে দেয়?

{a, b} = {a: 1, b: 2};

ছুড়ে ফেলে SyntaxError: expected expression, got '='

নিম্নলিখিত তিনটি উদাহরণ সমস্যা ছাড়াই কাজ করে

var {a, b} = {a: 1, b: 2};
var [c, d] = [1, 2];
    [e, f] = [1, 2];

বোনাস প্রশ্ন: varঅ্যারের ধ্বংসের জন্য আমাদের কেন দরকার নেই ?

আমি এমন কিছু করতে গিয়ে দৌড়ে গেলাম

function () {
  var {a, b} = objectReturningFunction();

  // Now a and b are local variables in the function, right?
  // So why can't I assign values to them?

  {a, b} = objectReturningFunction();
}

উত্তর:


162

সমস্যাটি {...}জাভাস্ক্রিপ্টে একাধিক অর্থযুক্ত অপারেটরদের থেকে শুরু হয়েছে।

যখন {কোনও বিবৃতি শুরুর দিকে উপস্থিত হয় , এটি সর্বদা একটি ব্লকের প্রতিনিধিত্ব করবে , যা বরাদ্দ করা যায় না। যদি এটি বিবৃতিতে পরে কোনও অভিব্যক্তি হিসাবে উপস্থিত হয় , তবে এটি কোনও বস্তুর প্রতিনিধিত্ব করবে।

varএই পার্থক্য করতে সাহায্য করে, যেহেতু এটি একটি দ্বারা অনুসরণ করা যাবে না স্টেটমেন্ট ইচ্ছা হিসাবে, গোষ্ঠীবদ্ধ প্রথম বন্ধনী :

( {a, b} = objectReturningFunction() );

তাদের দস্তাবেজগুলি থেকে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / অপারেটর / পরিবেশক_অ্যাসাইনমেন্ট # অ্যাসাইনমেন্ট_বিহীন_বিজ্ঞাপন

নোটস: কোনও বিবরণ ছাড়াই অবজেক্ট ল্যাটারাল ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট ব্যবহার করার সময় অ্যাসাইনমেন্ট স্টেটমেন্টের চারপাশে প্রথম বন্ধনীর প্রয়োজন (...)।

{a, b} = {a: 1, b: 2 valid বৈধ স্ট্যান্ড-একা সিনট্যাক্স নয়, কারণ বাম-হাতের {a, b a একটি অবরুদ্ধ হিসাবে বিবেচিত এবং অবজেক্ট আক্ষরিক নয়।

তবে, ({a, b} = {a: 1, b: 2}) বৈধ, যেমন var {a, b} = {a: 1, b: 2}

আপনার (...) প্রকাশটি সেমিকোলনের আগে হওয়া দরকার বা এটি পূর্ববর্তী লাইনে কোনও ফাংশন সম্পাদন করতে ব্যবহৃত হতে পারে।


যদি এটি বিবৃতিতে পরে কোনও অভিব্যক্তি হিসাবে উপস্থিত হয়, তবে এটি কোনও বস্তুর প্রতিনিধিত্ব করবে। এর অর্থ কি আমরা কখনই গ্রুপিং
বন্ধনের

গোষ্ঠীকরণের প্রথম বন্ধনী টিপ একটি দুর্দান্ত great
জেমস স্মিথ

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

25

আপনি যদি সেমিকোলন ছাড়াই জাভাস্ক্রিপ্ট লেখেন , তবে 'ডিক্লেয়ারেশন ব্যতীত অ্যাসাইনমেন্ট' সিনট্যাক্সের পূর্বে অনুমানযোগ্যভাবে কাজ করার জন্য সেমিকোলনের আগে হওয়া উচিত

let a, b

;({a, b} = objectReturningFunction()) // <-- note the preceding ;

এটি আমাকে ধরা পড়ার সাথে সাথে এটি হাইলাইট করতে চেয়েছিল এবং আশা করা যায় যে এটি কাজ করে না কেন এবং / অথবা কোড বিন্যাসের মতো অদ্ভুত ফলাফলের কারণ খুঁজে বার করে অন্যদের কিছুটা সময় সাশ্রয় করতে পারে prettier

প্রকৃতপক্ষে, এটি ঠিক সেখানে গ্রহণযোগ্য উত্তরে (উদ্ধৃত ডক্সের শেষ লাইন) তবে মিস করা সহজ, বিশেষত উদাহরণ না দেখে!


4
হ্যাঁ মানুষ আধা-কলোন ব্যবহার করার কারণ!
jਫਰ00

2

এখানে অন্য উপায়:

let {} = {a, b} = objectReturningFunction()

পেশাদাররা:

  • কোন প্রথম বন্ধনী প্রয়োজন
  • কোন সেমিকোলন প্রয়োজন
  • অতিরিক্ত অ্যাসাইনমেন্টটি একটি গ্যারান্টিযুক্ত নো-অপশন (কোনও অদ্ভুত জিনিস চলছে না এমনটি দেওয়া হচ্ছে)

কনস:

  • কিছুটা অদ্ভুত লাগছে, যদিও আমার মতে আইআইএফইয়ের চেয়ে কোনও !(){...}() অযৌক্তিক নেই
  • কেন এটি আছে তা নিয়ে বিভ্রান্তি লাগতে পারে। প্রথম এনকাউন্টারে লোককে ফেলে দেওয়ার গ্যারান্টিযুক্ত, সুতরাং আমি এটিকে ওয়ান-অফ হিসাবে ব্যবহার করার বিরুদ্ধে পরামর্শ দেব।

IIFE এর মতো অনুভূত কাইন্ড আরো তুলনীয় ;({ a, b })চেয়ে let {} = { ... }। ভাল কৌশল যদিও। :)
shuckster

@ প্রোটো-এন, +1, খুব স্মার্ট ধারণা। আপনি কিভাবে এই জুড়ে এসেছেন?
পেসারিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.