জাভাস্ক্রিপ্টে (এর জন্য ... ইন) এবং (এর জন্য ...) বিবৃতিগুলির মধ্যে পার্থক্য কী?


408

আমি জানি for... inলুপটি কী (এটি কী দ্বারা পুনরাবৃত্তি হয়) তবে প্রথমবার শুনেছি for... of(এটি মান দিয়ে পুনরাবৃত্তি করে)।

আমি for... ofলুপ দিয়ে বিভ্রান্ত আমি অ্যাডজেকশন পাইনি। এটি নীচের কোড:

var arr = [3, 5, 7];
arr.foo = "hello";

for (var i in arr) {
  console.log(i); // logs "0", "1", "2", "foo"
}

for (var i of arr) {
  console.log(i); // logs "3", "5", "7"
  // it is does not log "3", "5", "7", "hello"
}

আমি যা পেয়েছি তা হ'ল for... ofসম্পত্তি মানগুলি পুনরাবৃত্তি করে। তাহলে কেন এটি "3", "5", "7", "hello"পরিবর্তে লগ (রিটার্ন) না "3", "5", "7"? তবে for... inপ্রতিটি কী ( "0", "1", "2", "foo") এর উপরে লুপ পুনরাবৃত্তি হয় । এখানে কী দ্বারা for... inলুপটি পুনরাবৃত্তি হয় foo। তবে সম্পত্তির for... ofমানের উপর পুনরাবৃত্তি হয় না । কেন এমন হয়?foo"hello"

সংক্ষেপে দীর্ঘ গল্প:

এখানে আমি for... ofলুপ কনসোল । এটি লগ করা উচিত "3", "5", "7","hello"কিন্তু এখানে এটি লগ "3", "5", "7"। কেন?

উদাহরণ লিঙ্ক


1
আপনি যদি এটি মিস করেন তবে এখানে সূচনা লিঙ্কটি বিকাশকারী.মোজিলা.আর.ইন.ইউএস
অ্যান্টনি রাসেল

1
আমার বোঝাপড়া যতদূর যায়, অ্যারে for ... ofব্যবহার করে সমস্যাগুলি সমাধান করার জন্য ভাষায় আনা হয়েছিল for ... inArray.prototypeএমনভাবে সংশোধন করা যেতে পারে যে অতিরিক্ত সম্পত্তি পাওয়া যায়, এটির পুনরাবৃত্তি করা এটি অনিরাপদ হয়ে যায় কারণ আপনি অপ্রত্যাশিত নন সংখ্যাযুক্ত কীগুলি পেতে পারেন।
Phylogenesis

2
ভবিষ্যতের পাঠকদের জন্য: এটি সম্ভবত জাভাস্ক্রিপ্ট ofকীওয়ার্ডের (লুপের জন্য… এর) নকল নয় , কারণ এটি সাধারণ ওভারভিউ জিজ্ঞাসার চেয়ে বৈশিষ্ট্যের একটি নির্দিষ্ট আচরণ সম্পর্কে জিজ্ঞাসা করে।
অ্যাপসিলাররা 26:38

2
কেবল " for <key> in" এবং " for <value> of" বলার for..of
অভ্যস্ত হয়ে উঠুন

গণনীয় সম্পর্কে গ্রেট নিবন্ধ medium.com/@shivamethical/...
Kalhan.Toress

উত্তর:


303

for in একটি অবজেক্টের অসংখ্য সম্পত্তি নাম লুপ করে।

for of(ES6 তে নতুন) কোনও অবজেক্ট-নির্দিষ্ট পুনরাবৃত্তকারী ব্যবহার করে এবং এটির দ্বারা উত্পন্ন মানগুলির উপরে লুপ করে।

আপনার উদাহরণে, অ্যারে পুনরাবৃত্তকারী অ্যারেতে সমস্ত মান দেয় (অন-সূচক বৈশিষ্ট্য উপেক্ষা করে)।


9
for ... ofES6 এ মানীকৃত।
জাস্টিন

2
এটি আশ্চর্যের বিষয়, আমি শপথ করছি আমি কোথাও পড়েছি এটি আবার ES7 এ চলে গেছে, তবে দৃশ্যত এটি সত্য ছিল না। আমার খারাপ।
আলেকজান্ডার ও'মারা

40
একটি স্মৃতিচারণমূলক: 'ওফ ->' ওবিজেক্টস নয়, 'আমি -> না' ইটারেবলস
প্ল্যাকোপ্লাটার

4
আরেকটি স্মৃতিবিজড়িত: for... of:: অ্যারে :: অ্যারেগুলির সর্বদা দৈর্ঘ্য থাকে, তাই আপনি ভাবতে পারেন for.. [নবম উপাদান] of.. [কি উপাদান]
নাথান স্মিথ

14
আর একটি স্মৃতিচারণমূলক ... for..in..keys=== বিদেশী কীগুলি === for...inকীগুলির জন্য ব্যবহার করুন ! যেমন, for...ofমানগুলির জন্য ব্যবহার করুন ।
গুঁথার

237

আমি এখানে একটি সম্পূর্ণ উত্তর পেয়েছি: https://www.typescriptlang.org/docs/handbook/iterators- and- generators.html (যদিও এটি টাইপ স্ক্রিপ্টের জন্য, এটি জাভাস্ক্রিপ্টের জন্যও একই)

উভয় for..ofএবং for..inবিবৃতি তালিকার উপর পুনরাবৃত্তি; পুনরাবৃত্তি করা মানগুলি পৃথক পৃথক হলেও for..inপুনরাবৃত্তি হওয়া বস্তুর কীগুলির একটি তালিকা প্রদান করে, যেখানে পুনরাবৃত্তি হওয়া বস্তুর সংখ্যাসম্যগুলির for..ofমানগুলির একটি তালিকা প্রদান করে।

এখানে একটি উদাহরণ যা এই পার্থক্যটি দেখায়:

let list = [4, 5, 6];

for (let i in list) {
   console.log(i); // "0", "1", "2",
}

for (let i of list) {
   console.log(i); // "4", "5", "6"
}

আর একটি পার্থক্য হ'ল..ইন যে কোনও বস্তুর উপর কাজ করে; এটি এই বস্তুর বৈশিষ্ট্যগুলি পরিদর্শন করার একটি উপায় হিসাবে কাজ করে। for..ofঅন্যদিকে, প্রধানত পুনরাবৃত্ত বস্তুর মানগুলিতে আগ্রহী। মানচিত্র এবং সেট implement Symbol.iteratorসম্পত্তি হিসাবে অন্তর্নির্মিত বস্তুগুলি সঞ্চিত মানগুলিতে অ্যাক্সেসের অনুমতি দেয়।

let pets = new Set(["Cat", "Dog", "Hamster"]);
pets["species"] = "mammals";

for (let pet in pets) {
   console.log(pet); // "species"
}

for (let pet of pets) {
    console.log(pet); // "Cat", "Dog", "Hamster"
}

1
ফিউটারমোর, এর জন্য কিছু কল করে (যাক আমি {} এর) so কনসোল.লগ (i); an কোনও প্রকারের ত্রুটি ফেলবে: VM391: 1 আনকচড টাইপ এরির: an <<নামবিহীন>: 1: 14 এ পুনরাবৃত্তিযোগ্য নয়, কমপক্ষে ক্রোমে
kboom

জয়ের জন্য টিএস - উদাহরণটি ভুল, আধুনিককে "স্তন্যপায়ী" ফিরিয়ে দেওয়া উচিত, // "বিড়াল", "কুকুর", "হ্যামস্টার"
মার্টিনপ999

8
আমি এটি দ্বারা মনে করি: "ইন" জন্য index। এবং তারপরে "এর" valuesজন্য প্রতিটি সূচী / কী / আইটেমটি হবে।
শেরিলহোমান

ভাল, এটি আমার জন্য রাজা হতে চলেছে: আইটেমগুলির পুনরাবৃত্তির জন্য ইন-ইনস ব্যবহার করে আমাকে সাধারণত একটি let thisItem = items[all];পরিবর্তনশীল তৈরি করতে হয়, for...ofশর্টকাটে সহায়তা করে!
ভ্যাসিলি হল

আমি এটি দ্বারা মনে আছে: for...inযেমন Object.keys(), অনুমান কি? অ্যারে হ'ল অবজেক্ট, সোট যা তাদের অশ্লীলতাও ফিরিয়ে দেয়। :)
সুজিৎ অগ্রহরি

38

লুপের জন্য ...

জন্য ... মধ্যে লুপ কাউন্টিং যুক্তিবিজ্ঞান এবং প্রস্থান শর্ত নির্মূল করে লুপ জন্য দুর্বলতা উপর উন্নত।

উদাহরণ:

const digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

for (const index in digits) {
  console.log(digits[index]);
}

তবে, আপনাকে অ্যারের মানগুলি অ্যাক্সেস করতে একটি সূচক ব্যবহার করার বিষয়টি নিয়ে এখনও মোকাবেলা করতে হবে, এবং এটি দুর্গন্ধযুক্ত; এটি প্রায় আগের তুলনায় আরও বিভ্রান্তিকর করে তোলে।

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

Array.prototype.decimalfy = function() {
  for (let i = 0; i < this.length; i++) {
    this[i] = this[i].toFixed(2);
  }
};

const digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

for (const index in digits) {
  console.log(digits[index]);
}

ছাপে:

0

1

2

3

4

5

6

7

8

9

ফাংশন () {এর জন্য (যাক i = 0; i <this.leight; i ++) {এটি [i] = এটি [আমি]। টু ফিক্সড (2); }}

এ কারণেই ... অ্যারেগুলি লুপ করার সময় লুপগুলিতে নিরুৎসাহিত করা হয়।

নোট : জাভাস্ক্রিপ্টে লুপের জন্য ফরইচ লুপ অন্য ধরণের। তবে, forEach()আসলে একটি অ্যারে পদ্ধতি, সুতরাং এটি কেবল অ্যারেগুলির সাথে একচেটিয়াভাবে ব্যবহার করা যেতে পারে। ফোর ইচ লুপ থামানোর বা ভাঙার কোনও উপায় নেই। আপনার লুপে যদি এই ধরণের আচরণের প্রয়োজন হয় তবে আপনাকে লুপের জন্য একটি বেসিক ব্যবহার করতে হবে।

লুপের জন্য ...

জন্য ... এর লুপ তথ্য কোন প্রকার যে iterable হয় উপর লুপ ব্যবহার করা হয়।

উদাহরণ:

const digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

for (const digit of digits) {
  console.log(digit);
}

ছাপে:

0

1

2

3

4

5

6

7

8

9

এটি লুপের জন্য ... লুপগুলির জন্য সমস্ত লুপের সবচেয়ে সংক্ষিপ্ত সংস্করণ তৈরি করে।

তবে অপেক্ষা করুন, আরও আছে! লুপের জন্য ... এর আরও কিছু অতিরিক্ত সুবিধা রয়েছে যা লুপগুলিতে এবং ... এর দুর্বলতাগুলি ঠিক করে।

আপনি যে কোনও সময় ... লুপের জন্য থামাতে বা ভাঙ্গতে পারেন।

const digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

for (const digit of digits) {
  if (digit % 2 === 0) {
    continue;
  }
  console.log(digit);
}

ছাপে:

1

3

5

7

9

এবং আপনাকে অবজেক্টগুলিতে নতুন বৈশিষ্ট্য যুক্ত করার বিষয়ে চিন্তা করতে হবে না। লুপের জন্য ... কেবলমাত্র বস্তুর মানগুলি লুপ করবে।


2
" গণনার যুক্তি এবং প্রস্থান শর্তকে দূর করে " লুপ ইন লুপটি লুপের দুর্বলতাগুলির উপরে উন্নতি করে "- না, এটি সেটাই করে না। একদমই না.
বার্গি

1
@ বেরগি আপনি সম্ভবত এটি ব্যাখ্যা করতে পারেন যে আপনি কেন এটি করেন না বলে মনে করেন এবং এটির উন্নতি কী বলে আপনি আসলে মনে করেন?
এলার

2
এটি কোনও কিছুর উপরে উন্নতি করে না, এটির নিজস্ব রাইসন ডি'ত্রে রয়েছে। এটি for (var index=0; index<arr.length; index++)লুপের চেয়ে সম্পূর্ণ আলাদা কিছু করে (যেখানে indexকাউন্টারটি উদাহরণ হিসাবে পৃথক পূর্ণসংখ্যা হয়)।
বার্গি

এই ধরণের বিভ্রান্তিকর করে তোলে যে উদাহরণ হিসাবে আপনি যে অ্যারে মানগুলি বেছে নিয়েছেন সেটি অ্যারে সূচক মানগুলির সাথে মিলে যায় ...
সের্গেই

18

পার্থক্য for..inএবং for..of:

উভয় for..inএবং for..ofলুপিং কনস্ট্রাক্টস যা ডেটা স্ট্রাকচারের উপরে পুনরাবৃত্তি করতে ব্যবহৃত হয়। পার্থক্য কেবলমাত্র তারা পুনরাবৃত্তি করে:

  1. for..inকোনও অবজেক্টের সমস্ত অঙ্কযোগ্য সম্পত্তি কীগুলির দ্বারা পুনরাবৃত্তি হয়
  2. for..ofএকটি পুনরাবৃত্তযোগ্য বস্তুর মানগুলির উপরে পুনরাবৃত্তি। পুনরাবৃত্তিযোগ্য বস্তুর উদাহরণ হ'ল অ্যারে, স্ট্রিং এবং নোডলিস্ট।

উদাহরণ:

let arr = ['el1', 'el2', 'el3'];

arr.addedProp = 'arrProp';

// elKey are the property keys
for (let elKey in arr) {
  console.log(elKey);
}

// elValue are the property values
for (let elValue of arr) {
  console.log(elValue)
}

এই উদাহরণে আমরা পর্যবেক্ষণ করতে পারি যে for..inলুপটি বস্তুর কীগুলির উপরে পুনরাবৃত্তি করে, যা এই উদাহরণে একটি অ্যারে অবজেক্ট। কীগুলি 0, 1, 2 হয় যা আমাদের যোগ হওয়া অ্যারে উপাদানগুলির সাথে সামঞ্জস্য করে addedProparrক্রোম ডেভোলগুলিতে অ্যারে অবজেক্টটি এইভাবে দেখায়:

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন যে আমাদের for..inলুপটি কেবল এই মানগুলির পুনরাবৃত্তি করা ছাড়া আর কিছুই করে না।


for..ofআমাদের উদাহরণে লুপ উপর iterates মান একটি ডাটা কাঠামো। এই নির্দিষ্ট উদাহরণের মানগুলি 'el1', 'el2', 'el3'। একটি মাননীয় ডাটা স্ট্রাকচার ব্যবহার করে যে মানগুলি ফিরে আসবে for..ofতা পুনরাবৃত্তিযোগ্য অবজেক্টের ধরণের উপর নির্ভর করে। উদাহরণস্বরূপ একটি অ্যারে সমস্ত অ্যারের উপাদানগুলির মান প্রদান করবে যখন একটি স্ট্রিং স্ট্রিংয়ের প্রতিটি স্বতন্ত্র চরিত্রকে প্রদান করে।


8

for...inবিবৃতি একটি অবাধ অনুক্রমে একটি বস্তুর গণনীয় বৈশিষ্ট্য উপর iterates। অগণনীয় বৈশিষ্ট্য হ'ল সেই বৈশিষ্ট্য যাঁর অভ্যন্তরীণ [[গণনীয়]] পতাকাটি সত্য হিসাবে সেট করা থাকে, তাই প্রোটোটাইপ শৃঙ্খলে যদি কোনও সংখ্যাগরিষ্ঠ সম্পত্তি থাকে তবে লুপগুলিও সেগুলির for...inউপরে পুনরাবৃত্তি ঘটবে।

for...ofবিবৃতি ডেটার উপর iterates যে iterable বস্তুর সংজ্ঞায়িত উপর iterated হবে।

উদাহরণ:

Object.prototype.objCustom = function() {}; 
Array.prototype.arrCustom = function() {};

let iterable = [3, 5, 7];

for (let i in iterable) {
  console.log(i); // logs: 0, 1, 2, "arrCustom", "objCustom"
}

for (let i in iterable) {
  if (iterable.hasOwnProperty(i)) {
    console.log(i); // logs: 0, 1, 2,
  }
}

for (let i of iterable) {
  console.log(i); // logs: 3, 5, 7
}

তার আগে ভালো লেগেছে, আপনাকে জুড়তে এড়িয়ে যেতে পারেন hasOwnPropertyমধ্যে for...ofলুপ।


7

অন-ইন-স্টেটমেন্টটি ইচ্ছামত ক্রমে কোনও অবজেক্টের অসংখ্য গুণাবলী নিয়ে পুনরাবৃত্তি করে।

লুপটি বস্তুর নিজেই সমস্ত অঙ্কিত গুণাবলী এবং এটির নির্মাণকারীর প্রোটোটাইপ থেকে বস্তুর উত্তরাধিকারসূত্রে পুনরাবৃত্তি হবে

আপনি এটিকে "ইন" হিসাবে মূলত পুনরাবৃত্তি হিসাবে ভাবতে পারেন এবং সমস্ত কীগুলি তালিকাভুক্ত করতে পারেন।

var str = 'abc';
var arrForOf = [];
var arrForIn = [];

for(value of str){
  arrForOf.push(value);
}

for(value in str){
  arrForIn.push(value);
}

console.log(arrForOf); 
// ["a", "b", "c"]
console.log(arrForIn); 
// ["0", "1", "2", "formatUnicorn", "truncate", "splitOnLast", "contains"]

for in আমাদের দ্বারা যুক্ত করা হলে কেবল কীগুলি প্রদর্শিত হবে, এটি ইউনিকর্ন ফর্ম্যাটটি প্রদর্শন করবে না
মিলাদ

1
"formatUnicorn", "truncate", "splitOnLast", "এর মধ্যে" মুদ্রণ রয়েছে কারণ স্ট্যাকওভারফ্লো ওভাররাইড String.prototype
জেসনক্সিয়া 23

6

কিছু ইতিমধ্যে সংজ্ঞায়িত ডেটা টাইপ রয়েছে যা আমাদের এগুলিকে সহজেই পুনরাবৃত্তি করতে দেয় যেমন অ্যারে, ম্যাপ, স্ট্রিং অবজেক্টস

পুনরাবৃত্তির উপরে পুনরাবৃত্তির জন্য সাধারণ এবং প্রতিক্রিয়া হিসাবে নীচের উদাহরণে দেখানো হয়েছে এমন কীগুলি সন্নিবেশের ক্রমে আমাদের সরবরাহ করে।

  const numbers = [1,2,3,4,5];
   for(let number in number) {
     console.log(number);
   }

   // result: 0, 1, 2, 3, 4

এখন যদি আমরা এটির জন্য একই চেষ্টা করি , তবে প্রতিক্রিয়াতে এটি আমাদের কীগুলি নয় মানগুলি সরবরাহ করে। যেমন

  const numbers = [1,2,3,4,5];
   for(let numbers of numbers) {
    console.log(number);
  }

  // result: 1, 2, 3, 4, 5

সুতরাং উভয় পুনরাবৃত্তির দিকে তাকিয়ে আমরা সহজেই তাদের উভয়ের মধ্যে পার্থক্যটি পার্থক্য করতে পারি।

নোট: - এর জন্য শুধুমাত্র Symbol.iterator সাথে কাজ করে

সুতরাং আমরা যদি স্বাভাবিক বস্তুর উপর পুনরাবৃত্তি করার চেষ্টা করি তবে এটি আমাদের একটি ত্রুটি দেয় যেমন-

const Room = {
   area: 1000,
   height: 7,
   floor: 2
 }

for(let prop in Room) {
 console.log(prop);
 } 

// Result area, height, floor

for(let prop of Room) {
  console.log(prop);
 } 

ঘরটি পুনরাবৃত্তিযোগ্য নয়

বারবার পুনরাবৃত্তি করার জন্য আমাদের একটি ES6 Symbol.iterator যেমন সংজ্ঞা দেওয়া দরকার

  const Room= {
    area: 1000, height: 7, floor: 2,
   [Symbol.iterator]: function* (){
    yield this.area;
    yield this.height;
    yield this.floors;
  }
}


for(let prop of Room) {
  console.log(prop);
 } 

//Result 1000, 7, 2

এটি ফর ইন এবং ফর এর মধ্যে পার্থক্য । আশা করি এটি পার্থক্যটি পরিষ্কার করতে পারে।


5

দুটি লুপের মধ্যে আরেকটি পার্থক্য , যা আগে কেউ উল্লেখ করেনি:

ধ্বংস for...inকরা অবমূল্যায়ন করা হয়। for...ofপরিবর্তে ব্যবহার করুন।

সূত্র

সুতরাং আমরা যদি একটি লুপে ডেস্ট্রাকচারিং ব্যবহার করতে চাই , প্রতিটি অ্যারে উপাদানের সূচক এবং মান উভয়ই পেতে , আমাদের অ্যারে পদ্ধতিতে লুপটি ব্যবহার করা উচিত :for...ofentries()

for (const [idx, el] of arr.entries()) {
    console.log( idx + ': ' + el );
}

1
হ্যাঁ @ গালমার্গলিত, আমি এটি মনোযোগ সহকারে পড়ি। আমি সম্মত হই যে for each...inএটিকে অবমূল্যায়ন করা হয়েছে (প্রথম পয়েন্ট), তবে আমি এটি নিয়ে লিখিনি ... আমি লিখেছিলাম যে "ধ্বংসকে অবমূল্যায়ন for...inকরা হয়েছে। for...ofপরিবর্তে ব্যবহার করুন।" (দ্বিতীয় পয়েন্ট): বিকাশকারী.মোজিলা.আর.ইন / ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / @ আপনি কি আমার সাথে @ গ্যালমার্গলিটের সাথে একমত?
সিংহুমিলিকো

1
হাহাহ তুমি ঠিক বলেছেন, আমি মনোযোগ দিয়ে পড়িনি! সত্য, আমি মূলত একই জিনিসটি ভাবছিলাম এবং ভেবেছিলাম আপনি অন্যটির উল্লেখ করছেন।
গাল মার্গালিট

2

সবাই কেন এই সমস্যাটি ঘটে তা ব্যাখ্যা করেছিল, তবে এখনও এটি ভুলে যাওয়া খুব সহজ এবং তারপরে আপনি কেন ভুল ফলাফল পেয়েছেন তা আপনার মাথা আঁচড়ানো। বিশেষত যখন আপনি ফলাফলের বড় সেটগুলিতে কাজ করছেন যখন ফলাফল প্রথম নজরে ভাল বলে মনে হচ্ছে।

Object.entriesআপনি ব্যবহার করে সমস্ত সম্পত্তি খাঁজ নিশ্চিত:

var arr = [3, 5, 7];
arr.foo = "hello";

for ( var [key, val] of Object.entries( arr ) ) {
   console.log( val );
}

/* Result:

3
5
7
hello

*/

2

একটি অনেক ভাল উত্তর দেখুন, কিন্তু আমি ঠিক আমার উদাহরণ হিসাবে আমার 5 সেন্ট রাখার সিদ্ধান্ত নিয়েছি:

লুপ জন্য

সমস্ত গণনামূলক প্রসেসের উপর পুনরাবৃত্তি

let nodes = document.documentElement.childNodes;

for (var key in nodes) {
  console.log( key );
}

লুপ জন্য

সমস্ত পুনরাবৃত্ত মানগুলির উপরে পুনরাবৃত্তি

let nodes = document.documentElement.childNodes;

for (var node of nodes) {
  console.log( node.toString() );
}


2

আমি যখন প্রথম এবং লুপের জন্য শিখতে শুরু করি তখন আমি আমার আউটপুটটি নিয়েও বিভ্রান্ত হয়ে পড়েছিলাম, তবে বেশ কয়েকটি গবেষণা এবং বোঝার মাধ্যমে আপনি নীচের মতো পৃথক লুপটি ভাবতে পারেন:

  1. লুপের জন্য ... পৃথক সম্পত্তির সূচকগুলি ফেরত দেয়এবং সম্পত্তির মানের উপর কোনও প্রভাব রাখে না, এটি লুপ করে এবং সম্পত্তি সম্পর্কিত তথ্য দেয়, মানটি দেয় না। যেমন

let profile = { name : "Naphtali", age : 24, favCar : "Mustang", favDrink : "Baileys" }

উপরের কোডটি কেবল প্রোফাইল নামক একটি অবজেক্ট তৈরি করছে , আমরা এটি আমাদের দুটি উদাহরণের জন্য ব্যবহার করব , সুতরাং, আপনি কোনও উদাহরণে প্রোফাইল অবজেক্টটি দেখলে বিভ্রান্ত হবেন না , কেবল এটি জেনে রাখা হয়েছে যে এটি তৈরি করা হয়েছিল।

সুতরাং এখন নীচে লুপ জন্য ... ব্যবহার করুন

for(let myIndex in profile){
    console.log(`The index of my object property is ${myIndex}`)
}
 // Outputs : 
        The index of my object property is 0
        The index of my object property is 1
        The index of my object property is 2
        The index of my object property is 3

এখন আউটপুট হওয়ার কারণ হ'ল আমাদের প্রোফাইল অবজেক্টে চারটি (4) বৈশিষ্ট্য রয়েছে এবং আমরা সবাই জানি যে 0 থেকে শুরু হয় ... এন , সুতরাং আমরা যেহেতু বৈশিষ্ট্যগুলির সূচক পাই 0,1,2,3 for..in লুপের সাথে কাজ করা ।

  1. লুপের জন্য ... সম্পত্তি , মান বা উভয়ই ফিরতে পারে , কীভাবে তা একবার দেখে নেওয়া যাক। জাভাস্ক্রিপ্টে, আমরা অ্যারেগুলিতে যেমন সাধারণত বস্তুগুলির মধ্য দিয়ে লুপ করতে পারি না, সুতরাং, কয়েকটি উপাদান রয়েছে যা আমরা কোনও বস্তু থেকে আমাদের পছন্দগুলি উভয়কে অ্যাক্সেস করতে ব্যবহার করতে পারি।

    • অবজেক্ট.কিজ ( বস্তু-নাম-এখানে যায় ) >>> কোনও বস্তুর কী বা বৈশিষ্ট্যগুলি প্রদান করে।

    • অবজেক্ট.ভ্যালু ( বস্তু-নাম-এখানে যায় ) >>> কোনও বস্তুর মান প্রদান করে।

    • অবজেক্ট.এন্ট্রি ( বস্তু-নাম-এখানে যায় ) >>> কোনও বস্তুর কী এবং মান উভয়ই প্রদান করে ।

নীচে তাদের ব্যবহারের উদাহরণ দেওয়া আছে, অবজেক্ট.এন্ট্রিগুলিতে মনোযোগ দিন () :

Step One: Convert the object to get either its key, value, or both.
Step Two: loop through.


// Getting the keys/property

   Step One: let myKeys = ***Object.keys(profile)***
   Step Two: for(let keys of myKeys){
             console.log(`The key of my object property is ${keys}`)
           }

// Getting the values of the property

    Step One: let myValues = ***Object.values(profile)***
    Step Two : for(let values of myValues){
                 console.log(`The value of my object property is ${values}`)
               }

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

Step One: Convert the object to entries, using ***Object.entries(object-name)***
Step Two: **Destructure** the ***entries object which carries the keys and values*** 
like so **[keys, values]**, by so doing, you have access to either or both content.


    // Getting the keys/property

       Step One: let myKeysEntry = ***Object.entries(profile)***
       Step Two: for(let [keys, values] of myKeysEntry){
                 console.log(`The key of my object property is ${keys}`)
               }

    // Getting the values of the property

        Step One: let myValuesEntry = ***Object.entries(profile)***
        Step Two : for(let [keys, values] of myValuesEntry){
                     console.log(`The value of my object property is ${values}`)
                   }

    // Getting both keys and values

        Step One: let myBothEntry = ***Object.entries(profile)***
        Step Two : for(let [keys, values] of myBothEntry){
                     console.log(`The keys of my object is ${keys} and its value 
is ${values}`)
                   }

অস্পষ্ট অংশ বিভাগ (গুলি) সম্পর্কে মন্তব্য করুন।


1

for-inলুপ

for-inলুপটি একটি সংগ্রহের অগণিত বৈশিষ্ট্যগুলি অতিক্রম করার উদ্দেশ্যে ব্যবহৃত হয়, স্বেচ্ছাসেবী ক্রমে । সংগ্রহ হ'ল একটি ধারক প্রকারের বস্তু যার আইটেমগুলি সূচক বা কী ব্যবহার করতে পারে।

var myObject = {a: 1, b: 2, c: 3};
var myArray = [1, 2, 3];
var myString = "123";

console.log( myObject[ 'a' ], myArray[ 1 ], myString[ 2 ] );

for-inলুপ একটি সংকলনের অসংখ্য গুণাবলী ( কীগুলি ) একবারে বের করে এবং একবারে এটির উপরে পুনরাবৃত্তি করে। একটি গণনাযোগ্য সম্পত্তি হ'ল একটি সংগ্রহের সম্পত্তি যা for-inলুপে উপস্থিত হতে পারে ।

ডিফল্টরূপে, একটি অ্যারে এবং অবজেক্টের সমস্ত বৈশিষ্ট্য for-inলুপে উপস্থিত হয় । তবে, আমরা সংগ্রহের বৈশিষ্ট্যগুলি ম্যানুয়ালি কনফিগার করতে অবজেক্ট.ডেফাইনপ্রোপার্টি পদ্ধতিটি ব্যবহার করতে পারি ।

var myObject = {a: 1, b: 2, c: 3};
var myArray = [1, 2, 3];

Object.defineProperty( myObject, 'd', { value: 4, enumerable: false } );
Object.defineProperty( myArray, 3, { value: 4, enumerable: false } );

for( var i in myObject ){ console.log( 'myObject:i =>', i ); }
for( var i in myArray ){ console.log( 'myArray:i  =>', i ); }

উপরের উদাহরণে, সম্পত্তি dনিয়ে myObjectএবং সূচক 3এর myArrayমধ্যে প্রদর্শিত হবে না for-inলুপ কারণ তারা সঙ্গে কনফিগার করা হয় enumerable: false

for-inলুপগুলি নিয়ে কয়েকটি সমস্যা রয়েছে । অ্যারেগুলির ক্ষেত্রে for-inলুপটি methodsঅ্যারেতে myArray.someMethod = fসিনট্যাক্স ব্যবহার করে যোগ করার বিষয়টিও বিবেচনা করবে , তবে, myArray.lengthরয়ে গেছে 4

for-ofলুপ

এটি একটি ভ্রান্ত ধারণা যা for-ofকোনও সংগ্রহের মানগুলিকে পুনরুক্ত করে। for-ofলুপ একটি Iterableবস্তুর উপর পুনরাবৃত্তি । একটি পুনরাবৃত্তযোগ্য এমন একটি অবজেক্ট যা Symbol.iteratorএর প্রোটোটাইপের একটিতে সরাসরি নামের সাথে পদ্ধতি রয়েছে ।

Symbol.iterator পদ্ধতি একটি ফিরে আসা উচিত আইট্রেটারকে। একটি পুনরাবৃত্তকারী একটি অবজেক্ট যা একটিnextপদ্ধতি আছে। এই পদ্ধতিটি যখন রিটার্নvalueএবংdoneবৈশিষ্ট্যবলা হয়।

আমরা যখন একটি পুনরুক্তি iterable ব্যবহার বস্তুর for-ofলুপ, Symbol.iteratorপদ্ধতি একবার একটি পেতে ডাকা হবে পুনরুক্তিকারীর অবজেক্ট। for-ofলুপের প্রতিটি পুনরাবৃত্তির জন্য , কলটি দ্বারা মিথ্যা ফেরত nextনা doneআসা পর্যন্ত এই পুনরুক্তি করা অবজেক্টের পদ্ধতি next()কল করা হবে। সম্পত্তিটি for-ofযদি কল দিয়ে valueফিরে আসে তবে প্রতিটি পুনরাবৃত্তির জন্য লুপের দ্বারা প্রাপ্ত মান next()

var myObject = { a: 1, b: 2, c: 3, d: 4 };

// make `myObject` iterable by adding `Symbol.iterator` function directlty on it
myObject[ Symbol.iterator ] = function(){
  console.log( `LOG: called 'Symbol.iterator' method` );
  var _myObject = this; // `this` points to `myObject`
  
  // return an iterator object
  return {
    keys: Object.keys( _myObject ), 
    current: 0,
    next: function() {
      console.log( `LOG: called 'next' method: index ${ this.current }` );
      
      if( this.current === this.keys.length ){
        return { done: true, value: null }; // Here, `value` is ignored by `for-of` loop
      } else {
        return { done: false, value: _myObject[ this.keys[ this.current++ ] ] };
      }
    }
  };
}

// use `for-of` loop on `myObject` iterable
for( let value of myObject ) {
  console.log( 'myObject: value => ', value );
}

for-ofলুপ ES6 নতুন এবং তাই হয় Iterable এবং IterablesArrayকন্সট্রাকটর টাইপ হয়েছে Symbol.iteratorতার প্রোটোটাইপ উপর পদ্ধতি। Objectকন্সট্রাকটর দুঃখিতভাবে এটা আছে কিন্তু Object.keys(), Object.values()এবং Object.entries()পদ্ধতি একটি iterable ফিরুন ( আপনি ব্যবহার করতে পারেন console.dir(obj)প্রোটোটাইপ পদ্ধতি চেক করতে )। for-ofলুপের সুবিধাটি হ'ল যে কোনও বস্তুকে পুনরাবৃত্ত করা যায়, এমনকি আপনার কাস্টম Dogএবং Animalক্লাসগুলিও।

কোনও অবজেক্টকে পুনরাবৃত্ত করার সহজ উপায় হ'ল কাস্টম পুনরাবৃত্তির প্রয়োগের পরিবর্তে ES6 জেনারেটর প্রয়োগ করা।

বিপরীতে for-in, for-ofলুপ প্রতিটি পুনরাবৃত্তির জন্য একটি অ্যাসিঙ্ক টাস্কের জন্য অপেক্ষা করতে পারে। স্টেটমেন্ট ডকুমেন্টেশনেরawait পরে কীওয়ার্ড ব্যবহার করে এটি অর্জন করা হয় ।for

for-ofলুপ সম্পর্কে আরও একটি দুর্দান্ত বিষয় হ'ল এটির ইউনিকোড সমর্থন রয়েছে। ES6 স্পেসিফিকেশন অনুযায়ী, স্ট্রিংগুলি ইউটিএফ -16 এনকোডিংয়ের সাথে সঞ্চয় করা হয়। সুতরাং, প্রতিটি অক্ষর হয় 16-bitবা নিতে পারেন 32-bit। প্রথাগতভাবে, স্ট্রিং যা কিছু অক্ষর আছে যা মধ্যে সঞ্চিত করা যেতে পারে সমর্থন রয়েছে UCS-2 এনকোডিং সঞ্চিত হয় 16 bitsশুধুমাত্র।

সুতরাং, একটি স্ট্রিংয়ে ব্লকের String.lengthসংখ্যা প্রদান করে 16-bit। ইমোজি চরিত্রের মতো আধুনিক চরিত্রগুলি 32 বিট নেয়। অতএব, এই চরিত্রটি length2 for-inটির মধ্যে ফিরে আসবে লুপগুলিতে 16-bitব্লকগুলি পুনরাবৃত্তি করে এবং ভুলটি দেয় index। তবে for-ofলুপটি ইউটিএফ -16 নির্দিষ্টকরণের উপর ভিত্তি করে পৃথক চরিত্রের উপরে পুনরাবৃত্তি করে।

var emoji = "😊🤣";

console.log( 'emoji.length', emoji.length );

for( var index in emoji ){ console.log( 'for-in: emoji.character', emoji[index] ); }
for( var character of emoji ){ console.log( 'for-of: emoji.character', character ); }


0

Https://javascript.info/array থেকে নীচের ব্যাখ্যাটি আমি খুব সহায়ক:

অ্যারে আইটেমগুলি সাইকেল চালানোর প্রাচীনতম উপায়গুলির মধ্যে একটি হল লন্ড ওভার ইনডেক্সগুলি:

let arr = ["Apple", "Orange", "Pear"];

for (let i = 0; i < arr.length; i++) { alert( arr[i] ); } But for arrays there is another form of loop, for..of:

let fruits = ["Apple", "Orange", "Plum"];

// iterates over array elements for (let fruit of fruits) { alert( fruit ); } The for..of doesn’t give access to the number of the current element, just its value, but in most cases that’s enough. And it’s shorter.

প্রযুক্তিগতভাবে, অ্যারে হ'ল বস্তু হ'ল এটির জন্যও এটি ব্যবহার করা সম্ভব:

let arr = ["Apple", "Orange", "Pear"];

for (let key in arr) { alert( arr[key] ); // Apple, Orange, Pear } But that’s actually a bad idea. There are potential problems with it:

..এর জন্য লুপটি সমস্ত সংখ্যার উপরে পুনরাবৃত্তি করে, কেবল সংখ্যাগুলিই নয়।

ব্রাউজারে এবং অন্যান্য পরিবেশে তথাকথিত "অ্যারে-জাতীয়" অবজেক্ট রয়েছে যা অ্যারের মতো দেখায়। অর্থাৎ, তাদের দৈর্ঘ্য এবং সূচী বৈশিষ্ট্য রয়েছে তবে তাদের মধ্যে অন্যান্য অ-সংখ্যাযুক্ত বৈশিষ্ট্য এবং পদ্ধতি থাকতে পারে, যা আমাদের সাধারণত প্রয়োজন হয় না। For..in লুপটি যদিও তাদের তালিকাভুক্ত করবে। সুতরাং যদি আমাদের অ্যারের মতো বস্তুগুলির সাথে কাজ করার দরকার হয় তবে এই "অতিরিক্ত" বৈশিষ্ট্যগুলি সমস্যা হয়ে উঠতে পারে।

For..in লুপটি অ্যারে নয় জেনেরিক বস্তুর জন্য অনুকূলিত হয়েছে এবং এভাবে 10-100 গুণ বেশি ধীর হয়। অবশ্যই, এটি এখনও খুব দ্রুত। স্পিডআপটি কেবল বাধাগুলিতেই গুরুত্বপূর্ণ। তবে তবুও আমাদের পার্থক্য সম্পর্কে সচেতন হওয়া উচিত।

সাধারণত, আমাদের অ্যারেতে..ইন ব্যবহার করা উচিত নয়।


0

for...inলুপ এবং for...ofলুপের মধ্যে পার্থক্য মনে রাখার জন্য এখানে একটি দরকারী স্মৃতিবিদ্যার কথা ।

"ইনডেক্স ইন, অবজেক্ট"

for...in Loop=> অ্যারেতে সূচক ধরে পুনরাবৃত্তি হয় ।

for...of Loop=> অবজেক্টের বস্তুর উপরে পুনরাবৃত্তি হয় ।

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