অ্যারে পুনরাবৃত্তির সাথে কেন "ইন ..." ব্যবহার করা খারাপ ধারণা?


1823

আমাকে for...inজাভাস্ক্রিপ্টে অ্যারে ব্যবহার না করার কথা বলা হয়েছে । কেন না?


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

19
"For" লুপের সাথে প্রচুর উত্তর যেমন 'for (var i = 0; i <hColl.length; i++) var compare' এর সাথে তুলনা করুন 'var i = hColl.length; (i--) {} 'যা, যখন পরবর্তী ফর্মটি ব্যবহার করা সম্ভব হয় এটি যথেষ্ট দ্রুত হয়। আমি জানি এটি স্পর্শকাতর তবে ভেবেছিলাম আমি এই বিটটি যুক্ত করব।
মার্ক শুলথিস

2
@ মার্কস্চলটিহিস তবে এটি বিপরীত পুনরাবৃত্তি। ফরোয়ার্ড পুনরাবৃত্তির আরও একটি সংস্করণ কি দ্রুত?
ma11 She28

5
@ উইন্ড var i = hCol1.length; for (i;i;i--;) {}এবং আই ক্যাশে ব্যবহার করুন কারণ এটি একটি তাত্পর্য তৈরি করবে এবং পরীক্ষাটি সহজতর করবে। - ব্রাউজারটি যত পুরনো হয় তত বেশি পার্থক্য রাখে forএবং whileসবসময় "i" কাউন্টারকে ক্যাশে করে - এবং অবশ্যই নেতিবাচক পরিস্থিতিটি সর্বদা খাপ obfuscate খায় না এবং কিছু লোকের জন্য কোডটি কিছুটা .ণাত্মক থাকে। এবং নোট করুন var i = 1000; for (i; i; i--) {}এবং var b =1000 for (b; b--;) {}যেখানে আমি 1000 থেকে 1 এবং খ 999 থেকে 0 তে চলেছি - ব্রাউজারটি যত বেশি পুরানো হবে তত বেশি সময় পারফরম্যান্সের পক্ষে যায়।
মার্ক শুলথিস

9
আপনিও চালাক হতে পারেন। for(var i = 0, l = myArray.length; i < l; ++i) ...আপনি অগ্রগঠনের সাথে দ্রুত এবং সেরাটি পেতে পারেন is
ম্যাথিউ অ্যামিয়ট

উত্তর:


1557

কারণটি হ'ল একটি নির্মাণ:

var a = []; // Create a new empty array.
a[5] = 5;   // Perfectly legal JavaScript that resizes the array.

for (var i = 0; i < a.length; i++) {
    // Iterate over numeric indexes from 0 to 5, as everyone expects.
    console.log(a[i]);
}

/* Will display:
   undefined
   undefined
   undefined
   undefined
   undefined
   5
*/

কখনও কখনও অন্য থেকে সম্পূর্ণ পৃথক হতে পারে:

var a = [];
a[5] = 5;
for (var x in a) {
    // Shows only the explicitly set index of "5", and ignores 0-4
    console.log(x);
}

/* Will display:
   5
*/

এছাড়াও জাভাস্ক্রিপ্ট লাইব্রেরিগুলি এই জাতীয় জিনিসগুলি করতে পারে তা বিবেচনা করুন , যা আপনার তৈরি করা কোনও অ্যারেগুলিকে প্রভাবিত করবে:

// Somewhere deep in your JavaScript library...
Array.prototype.foo = 1;

// Now you have no idea what the below code will do.
var a = [1, 2, 3, 4, 5];
for (var x in a){
    // Now foo is a part of EVERY array and 
    // will show up here as a value of 'x'.
    console.log(x);
}

/* Will display:
   0
   1
   2
   3
   4
   foo
*/


146
!তিহাসিকভাবে, কিছু ব্রাউজার এমনকি 'দৈর্ঘ্য', 'টু স্ট্রিং' ইত্যাদিতেও পুনরাবৃত্তি করেছিল!
ববিনস

398
(var x in a)পরিবর্তে ব্যবহার করতে মনে রাখবেন (x in a)- গ্লোবাল তৈরি করতে চান না।
ক্রিস মরগান

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

86
@ স্টেটওয়ার্ট: জেএসের সমস্ত অবজেক্টস সাহসী । একটি জেএস অ্যারে হ'ল একটি বস্তু, তাই হ্যাঁ, এটি সাহসীও, তবে এটি এটির জন্য নয়। যদি আপনি কোনও অবজেক্টের কীগুলি নিয়ে পুনরাবৃত্তি করতে চান তবে ব্যবহার করুন for (var key in object)। আপনি যদি কোনও অ্যারের উপাদানগুলি নিয়ে পুনরাবৃত্তি করতে চান তবে তবে ব্যবহার করুন for(var i = 0; i < array.length; i += 1)
মার্টিজান

42
আপনি প্রথম উদাহরণের জন্য বলেছিলেন, এটি 0 থেকে 4 পর্যন্ত সংখ্যার সূচকগুলিতে আইট্রেট করে, যেমন প্রত্যেকের প্রত্যাশা , আমি আশা করি এটি 0 থেকে 5 পর্যন্ত পুনরাবৃত্তি হবে ! যেহেতু আপনি যদি অবস্থান 5 এ কোনও উপাদান যুক্ত করেন তবে অ্যারেতে 6 টি উপাদান থাকবে (তাদের মধ্যে 5 অপরিবর্তিত)।
stivlo

393

for-inবিবৃতি নিজে অবশ্য এটা হতে পারে, একটি "খারাপ অনুশীলন" নয় ভুল ব্যবহৃত , উদাহরণস্বরূপ, এর পুনরুক্তি অ্যারে বা বস্তু অ্যারের মত করে।

for-inবিবৃতিটির উদ্দেশ্য হ'ল বস্তুর বৈশিষ্ট্যগুলি গণনা করা। এই বিবৃতিটি প্রোটোটাইপ শৃঙ্খলে উঠে যাবে, উত্তরাধিকারসূত্রে প্রাপ্ত সম্পত্তিগুলির উপরেও গণনা করবে , এমন জিনিস যা কখনও কখনও পছন্দসই হয় না।

এছাড়াও, পুনরাবৃত্তির ক্রমটি অনুমানের দ্বারা গ্যারান্টিযুক্ত নয়, যার অর্থ আপনি যদি এই বিবৃতি দিয়ে কোনও অ্যারে অবজেক্টটি "পুনরাবৃত্তি" করতে চান তবে আপনি নিশ্চিত হতে পারবেন না যে বৈশিষ্ট্যগুলি (অ্যারে সূচকগুলি) সংখ্যার ক্রমে পরিদর্শন করা হবে।

উদাহরণস্বরূপ, জেএসক্রিপ্টে (IE <= 8), অ্যারে অবজেক্টগুলিতে এমনকি গুনের ক্রমটি সংজ্ঞা হিসাবে বৈশিষ্ট্য তৈরি করা হয়েছে:

var array = [];
array[2] = 'c';
array[1] = 'b';
array[0] = 'a';

for (var p in array) {
  //... p will be "2", "1" and "0" on IE
}

এছাড়াও, উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলির বিষয়ে কথা বলতে যদি আপনি উদাহরণস্বরূপ, Array.prototypeবস্তুটি প্রসারিত করেন (কিছু কিছু লাইব্রেরি যেমন MooTools করেন) তবে সেই বৈশিষ্ট্যগুলিও গণনা করা হবে:

Array.prototype.last = function () { return this[this.length-1]; };

for (var p in []) { // an empty array
  // last will be enumerated
}

হিসাবে আমি আগে বলেন বারবার বিন্যাস বা ওভার অ্যারের মত বস্তু, ভাল জিনিস একটি ব্যবহার করা অনুক্রমিক লুপ যেমন একটি প্লেইন বয়সী হিসাবে, for/ whileলুপ।

আপনি যখন কোনও সামগ্রীর নিজস্ব বৈশিষ্ট্যগুলি (যা উত্তরাধিকার সূত্রে প্রাপ্ত নয়) গণনা করতে চান , আপনি এই hasOwnPropertyপদ্ধতিটি ব্যবহার করতে পারেন :

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) {
    // prop is not inherited
  }
}

এবং কিছু লোক এমনকি Object.prototypeকেউ যদি hasOwnPropertyআমাদের অবজেক্টের নামের কোনও সম্পত্তি যুক্ত করে থাকে তবে সমস্যা না হওয়ার জন্য সরাসরি পদ্ধতিটি কল করার পরামর্শ দেয় :

for (var prop in obj) {
  if (Object.prototype.hasOwnProperty.call(obj, prop)) {
    // prop is not inherited
  }
}

10
জাভাস্ক্রিপ্টে অবজেক্টগুলির ওপরে ডেভিড হামফ্রির পোস্টটি দ্রুত প্রকাশ করুন দেখুন - অ্যারেরগুলিfor..in "স্বাভাবিক" লুপগুলির চেয়ে অনেক ধীর।
ক্রিস মরগান

17
"HasOwnProperty" সম্পর্কে শেষ পয়েন্ট সম্পর্কে প্রশ্ন: কেউ যদি কোনও বস্তুর উপর "hasOwNProperty" ওভাররাইড করে, আপনার সমস্যা হবে। তবে কেউ যদি "অবজেক্ট.প্রোটোটাইপ.হসঅনপ্রোপার্টি" কে ওভাররাইড করে তবে আপনার একই সমস্যা হবে না? যেভাবেই তারা আপনাকে ঘৃণা করছে এবং এটি আপনার দায়িত্ব ঠিক নয়?
স্কট রিপ্পি

আপনি বলছেন for..inখারাপ অভ্যাস নয়, তবে এটির অপব্যবহার করা যেতে পারে। আপনি কি উত্তম অনুশীলনের সত্যিকারের বিশ্ব উদাহরণ পেয়েছেন, যেখানে আপনি উত্তরাধিকারসূত্রে প্রাপ্ত সম্পত্তি সহ সমস্ত বস্তুর বৈশিষ্ট্যগুলিতে যেতে চান?
rjmunro

4
@ স্কটআরপি: আপনি যদি এটি সেখানে নিতে চান: youtube.com/watch?v=FrFUI591WII
নাথন ওয়াল

এই উত্তরের সাথে আমি খুঁজে পেয়েছি যেfor (var p in array) { array[p]; }
সমমানের

117

for..inঅ্যারে উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করতে আপনাকে ব্যবহার না করার তিনটি কারণ রয়েছে:

  • for..inঅ্যারে অবজেক্টের সমস্ত নিজস্ব এবং উত্তরাধিকার সূত্রে প্রাপ্ত বৈশিষ্ট্যগুলি লুপ করবে DontEnum; এর অর্থ যদি কেউ নির্দিষ্ট অ্যারে অবজেক্টে সম্পত্তি যুক্ত করে (এর যথাযথ কারণ রয়েছে - আমি নিজেই এটি করেছি) বা পরিবর্তন হয়ে যায় Array.prototype(যা কোডে খারাপ অভ্যাস হিসাবে বিবেচিত হয় যা অন্যান্য স্ক্রিপ্টগুলির সাথে ভালভাবে কাজ করে বলে মনে হয়) তবে এই বৈশিষ্ট্যগুলি পাশাপাশি পুনরাবৃত্তি করা; উত্তরাধিকার সূত্রে প্রাপ্ত বৈশিষ্ট্যগুলি চেক করে বাদ দেওয়া যেতে পারে hasOwnProperty(), তবে এটি আপনাকে অ্যারে অবজেক্টে সেট করা বৈশিষ্ট্যগুলিতে সহায়তা করবে না

  • for..in উপাদান ক্রম সংরক্ষণ করার গ্যারান্টিযুক্ত নয়

  • এটি ধীর গতির কারণ আপনাকে অ্যারে অবজেক্টের সমস্ত বৈশিষ্ট্য এবং তার পুরো প্রোটোটাইপ চেইনটি হাঁটাতে হবে এবং এখনও কেবলমাত্র সম্পত্তিটির নাম পাবেন, অর্থাত্ মূল্য পেতে, একটি অতিরিক্ত অনুসন্ধান প্রয়োজন হবে


55

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

Array.prototype.myOwnFunction = function() { alert(this); }
a = new Array();
a[0] = 'foo';
a[1] = 'bar';
for(x in a){
 document.write(x + ' = ' + a[x]);
}

এটি লিখবে:

0 = ফু
1 = বার
myOwnFunction = ফাংশন () {সতর্কতা (এটি); }

এবং যেহেতু আপনি কখনই নিশ্চিত হতে পারবেন না যে প্রোটোটাইপ চেইনে কোনও কিছুই যুক্ত হবে না কেবল অ্যারের গণনার জন্য লুপের জন্য একটি ব্যবহার করুন:

for(i=0,x=a.length;i<x;i++){
 document.write(i + ' = ' + a[i]);
}

এটি লিখবে:

0 = ফু
1 = বার

16
অ্যারেগুলির হয় অবজেক্টস, কোন "বস্তু অ্যারের ঝুলিতে" হয়।
রবজি

41

বিচ্ছিন্নতায়, অ্যারে ব্যবহারের ক্ষেত্রে কোনও ভুল নেই। ইন-অবজেক্টে কোনও বস্তুর সম্পত্তির নামগুলি পুনরাবৃত্তি হয় এবং "বাক্সের বাইরে" অ্যারের ক্ষেত্রে বৈশিষ্ট্যগুলি অ্যারে সূচকগুলির সাথে মিলে যায়। (বিল্ট-ইন মত propertes length, toStringইত্যাদি পুনরাবৃত্তির মধ্যে অন্তর্ভুক্ত করা হয়।)

তবে, যদি আপনার কোড (বা আপনি যে ফ্রেমওয়ার্কটি ব্যবহার করছেন) অ্যারে বা অ্যারে প্রোটোটাইপে কাস্টম বৈশিষ্ট্য যুক্ত করে, তবে এই বৈশিষ্ট্যগুলি পুনরাবৃত্তিতে অন্তর্ভুক্ত করা হবে, যা সম্ভবত আপনি চান না।

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

যদি আপনার সন্দেহ হয় তবে আপনার সম্ভবত ইন-ইন ব্যবহার করা উচিত নয়।

অ্যারের মাধ্যমে পুনরাবৃত্তি করার একটি বিকল্প উপায় হ'ল ফোর-লুপটি ব্যবহার করছে:

for (var ix=0;ix<arr.length;ix++) alert(ix);

তবে এটির একটি আলাদা সমস্যা আছে। সমস্যাটি হ'ল একটি জাভাস্ক্রিপ্ট অ্যারেতে "গর্ত" থাকতে পারে। যদি আপনি এই arrহিসাবে সংজ্ঞায়িত হন:

var arr = ["hello"];
arr[100] = "goodbye";

তারপরে অ্যারেতে দুটি আইটেম রয়েছে তবে এটি 101 এর দৈর্ঘ্য for ইন-ইন ব্যবহার করলে দুটি সূচক পাওয়া যাবে, যখন লুপটির জন্য 101 টি সূচক পাওয়া যাবে যেখানে 99 এর মান রয়েছে undefined


37

2016 এর হিসাবে (ES6) for…ofঅ্যারে পুনরাবৃত্তির জন্য আমরা ব্যবহার করতে পারি , জন স্লেজার যেমন ইতিমধ্যে লক্ষ্য করেছে।

আমি বিষয়গুলি পরিষ্কার করার জন্য এই সাধারণ বর্ধন কোডটি যুক্ত করতে চাই:

Array.prototype.foo = 1;
var arr = [];
arr[5] = "xyz";

console.log("for...of:");
var count = 0;
for (var item of arr) {
    console.log(count + ":", item);
    count++;
    }

console.log("for...in:");
count = 0;
for (var item in arr) {
    console.log(count + ":", item);
    count++;
    }

কনসোলটি দেখায়:

for...of:

0: undefined
1: undefined
2: undefined
3: undefined
4: undefined
5: xyz

for...in:

0: 5
1: foo

অন্য কথায়:

  • for...of0 থেকে 5 পর্যন্ত গণনা করা হয় এবং এড়িয়ে যায় Array.prototype.foo। এটি অ্যারের মানগুলি দেখায় ।

  • for...inকেবল তালিকাবদ্ধ করে 5, অপরিজ্ঞাত অ্যারে সূচকগুলি উপেক্ষা করে, তবে যুক্ত করা হচ্ছে foo। এটি অ্যারের সম্পত্তির নাম দেখায় ।


32

সংক্ষিপ্ত উত্তর: এটি কেবল মূল্যবান নয়।


দীর্ঘ উত্তর: সিক্যুয়াল এলিমেন্ট অর্ডার এবং অনুকূল পারফরম্যান্সের প্রয়োজন না হলেও এমনকি এটি মূল্যবান নয়।


দীর্ঘ উত্তর: এটি কেবল মূল্যবান নয় ...

  • ব্যবহারের ফলে অবজেক্টের প্রোটোটাইপ শৃঙ্খলা অনুসরণ করে এবং অবশেষে সূচক-ভিত্তিক লুপের চেয়ে ধীর গতিতে কাজ করা কোনও অবজেক্ট হিসাবে পুনরাবৃত্তি for (var property in array)ঘটায় causearrayfor
  • for (... in ...) অনুমানের ক্রমে অবজেক্টের বৈশিষ্ট্যগুলি ফেরত দেওয়ার গ্যারান্টি নেই one
  • ব্যবহার hasOwnProperty()এবং !isNaN()চেক বস্তুর বৈশিষ্ট্যাবলী ফিল্টার করতে একটি অতিরিক্ত এটা এমনকি ধীর সম্পাদন করতে ঘটাচ্ছে ওভারহেড এবং আরো সংক্ষিপ্ত বিন্যাসের কারণ প্রথম স্থানে এটি ব্যবহার করে, অর্থাত জন্য কী কারণ negates।

এই কারণে কর্মক্ষমতা এবং সুবিধার মধ্যে একটি গ্রহণযোগ্য বাণিজ্য বন্ধ এমনকি বিদ্যমান নেই। অভিপ্রায়টি হ'ল অ্যারেটিকে কোনও বস্তু হিসাবে পরিচালনা করা এবং অ্যারের অবজেক্টের বৈশিষ্ট্যগুলিতে ক্রিয়াকলাপ না করা পর্যন্ত আসলে কোনও লাভ নেই ।


31

অন্যান্য উত্তরে প্রদত্ত কারণগুলি ছাড়াও, আপনি যদি কাউন্টার ভেরিয়েবলের সাথে গণিত করতে চান তবে আপনি "for ... in" কাঠামোটি ব্যবহার করতে পারবেন না কারণ লুপটি অবজেক্টের বৈশিষ্ট্যগুলির নামের মাধ্যমে পুনরাবৃত্তি করে এবং ভেরিয়েবলটি একটি স্ট্রিং।

উদাহরণ স্বরূপ,

for (var i=0; i<a.length; i++) {
    document.write(i + ', ' + typeof i + ', ' + i+1);
}

লিখবো

0, number, 1
1, number, 2
...

যেহেতু,

for (var ii in a) {
    document.write(i + ', ' + typeof i + ', ' + i+1);
}

লিখবো

0, string, 01
1, string, 11
...

অবশ্যই এটি অন্তর্ভুক্ত করে সহজেই কাটিয়ে উঠতে পারে

ii = parseInt(ii);

লুপে, তবে প্রথম কাঠামোটি আরও সরাসরি।


6
আপনার যদি সত্যিকারের পূর্ণসংখ্যার প্রয়োজন না হয় বা অবৈধ অক্ষরগুলি উপেক্ষা করা হয় তবে +পরিবর্তে আপনি উপসর্গ ব্যবহার করতে পারেন parseInt
কনরাড বোরোস্কি

এছাড়াও, ব্যবহার parseInt()করার পরামর্শ দেওয়া হয় না। চেষ্টা করুন parseInt("025");এবং এটি ব্যর্থ হবে
ডেরেক 朕 會 功夫

6
@ ডেরেক 朕 會 功夫 - আপনি অবশ্যই ব্যবহার করতে পারবেন parseInt। সমস্যাটি হল আপনি যদি র‌্যাডিক্সটি অন্তর্ভুক্ত না করেন তবে পুরানো ব্রাউজারগুলি সংখ্যাটি ব্যাখ্যা করার চেষ্টা করতে পারে (সুতরাং 025টি অক্টাল হয়ে যায়)। এটি ECMAScript 5 এ স্থির করা হয়েছিল তবে এটি এখনও "0x" দিয়ে শুরু হওয়া সংখ্যার জন্য ঘটে (এটি সংখ্যাকে হেক্স হিসাবে ব্যাখ্যা করে)। নিরাপদ দিকে থাকতে, parseInt("025", 10)
রেডিক্সটি

23

সরাইয়া থেকে যে থেকে for... inসব গণনীয় বৈশিষ্ট্য উপর loops (যা না যেমন "সব অ্যারের উপাদান" একই!), দেখতে http://www.ecma-international.org/publications/files/ECMA-ST/Ecma -262.pdf , বিভাগ 12.6.4 (5 তম সংস্করণ) বা 13.7.5.15 (7 তম সংস্করণ):

বৈশিষ্ট্যগুলি গণনার কৌশল এবং ক্রম ... নির্দিষ্ট করা হয়নি ...

(জোর আমার।)

এর অর্থ যদি কোনও ব্রাউজার চায় তবে এটি বৈশিষ্ট্যগুলি যেভাবে sertedোকানো হয়েছিল সেগুলি দিয়ে যেতে পারে। অথবা সংখ্যাগত ক্রমে। বা লেজিকাল ক্রমে (যেখানে "4" এর আগে "30" আসে! সমস্ত অবজেক্ট কীগুলি মনে রাখবেন - এবং এইভাবে সমস্ত অ্যারে সূচকগুলি আসলে স্ট্রিংস, যাতে এটি মোটামুটি বোঝায়)। এটি বালতি দিয়ে তাদের মাধ্যমে যেতে পারে, যদি এটি হ্যাশ টেবিল হিসাবে বস্তুগুলি প্রয়োগ করে। অথবা এর যে কোনওটি নিন এবং "পিছনে" যুক্ত করুন। একটি ব্রাউজার এমনকি এলোমেলোভাবে পুনরাবৃত্তি হতে পারে এবং ECMA-262 অনুগত হতে পারে, যতক্ষণ না এটি প্রতিটি সম্পত্তি ঠিক একবার দেখেছিল।

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

যেভাবেই হোক for... ... inএটির সাথে অর্ডারটির কোনও মানে নেই। যদি আপনি অর্ডার সম্পর্কে যত্নশীল হন তবে এটি সম্পর্কে সুস্পষ্ট হন এবং forএকটি সূচক সহ নিয়মিত লুপ ব্যবহার করুন ।


18

মূলত দুটি কারণ:

এক

অন্যরা যেমন বলেছে, আপনি কীগুলি পেতে পারেন যা আপনার অ্যারেতে নেই বা প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। সুতরাং, যদি ধরা যাক, একটি লাইব্রেরি অ্যারে বা অবজেক্ট প্রোটোটাইপগুলিতে একটি সম্পত্তি যুক্ত করে:

Array.prototype.someProperty = true

আপনি এটি প্রতিটি অ্যারের অংশ হিসাবে পাবেন:

for(var item in [1,2,3]){
  console.log(item) // will log 1,2,3 but also "someProperty"
}

আপনি এটি হ'ল ওয়ানপ্রোপার্টি পদ্ধতিতে সমাধান করতে পারেন:

var ary = [1,2,3];
for(var item in ary){
   if(ary.hasOwnProperty(item)){
      console.log(item) // will log only 1,2,3
   }
}

তবে এটি কোনও ইন-লুপের মাধ্যমে কোনও বস্তুর উপরে পুনরাবৃত্তি করার জন্য সত্য।

দুই

সাধারণত অ্যারেতে আইটেমগুলির ক্রম গুরুত্বপূর্ণ, তবে ইন-লুপটি সঠিকভাবে পুনরায় পুনরায় পুনরায় পুনরুক্ত হয় না, কারণ এটি অ্যারেটিকে একটি বস্তু হিসাবে বিবেচনা করে, যা এটি জেএসে প্রয়োগ করা হয়, এবং না একটি অ্যারে হিসাবে। এটি একটি ছোট জিনিসের মতো মনে হচ্ছে তবে এটি সত্যিই অ্যাপ্লিকেশনগুলিকে স্ক্রু করতে পারে এবং এটি ডিবাগ করা শক্ত।


2
Object.keys(a).forEach( function(item) { console.log(item) } )প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নয়, নিজস্ব সম্পত্তি কীগুলির একটি অ্যারের উপরে পুনরাবৃত্তি করুন।
কিওয়ার্টি

2
সত্য, তবে ইন-লুপের মতো এটি অবশ্যই সঠিক সূচী ক্রমে থাকবে না। এছাড়াও, এটি পুরানো ব্রাউজারগুলিতে ES5 সমর্থন করে না work
লিওর

আপনি array.forEachআপনার স্ক্রিপ্টগুলিতে নির্দিষ্ট কোড প্রবেশ করিয়ে সেই ব্রাউজারগুলি শিখিয়ে দিতে পারেন । পলিফিল বিকাশকারী.মোজিলা.আর.ইন.ইউএস
কিওয়ার্টি

অবশ্যই, তবে তারপরে আপনি প্রোটোটাইপটি হেরফের করছেন এবং এটি সর্বদা একটি ভাল ধারণা নয় ... এবং তবুও, আপনার
ক্রমটি

এবং, অবশ্যই, কারণ সংখ্যা তিন: স্পার্স অ্যারে।
একটি ভাল অলিভার

16

কারণ এটি বস্তুর ক্ষেত্রগুলির মাধ্যমে সূচকগুলি নয়। আপনি সূচী "দৈর্ঘ্য" এর সাথে মান পেতে পারেন এবং আমি সন্দেহ করি যে আপনি এটি চান।


সুতরাং যে ভাল উপায় কি?
lYriCAlsSH

3
(var i = 0; i <অস্থির দৈর্ঘ্য; i++) {}
ভাভা

3
ফায়ারফক্স 3-এ আপনি আরআরওফরএচ বা আইট্রেটারে (ভার [i, v]) এর জন্যও ব্যবহার করতে পারেন IE IE তবে আইই-তে সেগুলির কোনওটিই কাজ করে না, যদিও আপনি প্রতিটি পদ্ধতি নিজেই লিখতে পারেন।
ভাভা

এবং কার্যত প্রতিটি লাইব্রেরির জন্য এটির নিজস্ব পদ্ধতি রয়েছে।
ভাভা

5
এই উত্তরটি ভুল। "দৈর্ঘ্য" ইন-ইন পুনরুক্তিতে অন্তর্ভুক্ত করা হবে না। এটি কেবলমাত্র নিজেকে যুক্ত করা বৈশিষ্ট্য যা অন্তর্ভুক্ত।
জ্যাকবিবি

16

আমি মনে করি না যেমন আমার আরও যোগ করার আছে। কিছু ক্ষেত্রে কেন ব্যবহার এড়ানো উচিত সে সম্পর্কে ট্রিপটিচের উত্তর বা সিএমএসের উত্তরfor...in

তবে আমি এটি যুক্ত করতে চাই যে আধুনিক ব্রাউজারগুলিতে এমন একটি বিকল্প রয়েছে for...inযা সেই ক্ষেত্রে ব্যবহার করা যায় for...inনা যেখানে ব্যবহার করা যায় না। বিকল্পটি হ'ল for...of:

for (var item of items) {
    console.log(item);
}

বিঃদ্রঃ :

দুর্ভাগ্যক্রমে, ইন্টারনেট এক্সপ্লোরারের কোনও সংস্করণ সমর্থন করে না for...of( এজ 12+ প্রকারের ), সুতরাং আপনার ক্লায়েন্টের সাইড প্রোডাকশন কোডটিতে এটি ব্যবহার না করা পর্যন্ত আপনাকে আরও কিছুক্ষণ অপেক্ষা করতে হবে। তবে এটি আপনার সার্ভারের পাশের জেএস কোডে ব্যবহার করা নিরাপদ হওয়া উচিত (যদি আপনি নোড.জেএস ব্যবহার করেন )।


@georgeawg আপনি বোঝাতে চেয়েছিলেন for-of, তাই না for-in?
3 ᆺ ᆼ

15

সমস্যা for ... in ...- এবং এটি তখনই সমস্যা হয়ে দাঁড়ায় যখন কোনও প্রোগ্রামার সত্যই ভাষা বুঝতে না পারে; এটি আসলে কোনও বাগ বা কিছু নয় - এটি হ'ল এটি কোনও বস্তুর সমস্ত সদস্যের উপরে পুনরাবৃত্তি করে (ভাল, সমস্ত গণ্য সদস্য, তবে এটি এখনকার জন্য বিশদ)। আপনি পুনরুক্তি চান, তখন শুধু একটি অ্যারের, জিনিষ শব্দার্থগতভাবে সামঞ্জস্যপূর্ণ রাখার শুধুমাত্র নিশ্চিত উপায় সূচীবদ্ধ বৈশিষ্ট্যাবলী (যেমন, একটি একটি পূর্ণসংখ্যা সূচক ব্যবহার করা for (var i = 0; i < array.length; ++i)শৈলী লুপ)।

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


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

2
@NiCkNewman ভাল বস্তুর তোমার পরে রেফারেন্স inএকটি for ... inলুপ শুধু হবে
সূচালো

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

@ নাইক্কিউম্যান এই পুরো প্রশ্নের মূল বিষয় হ'ল আপনার for ... inঅ্যারে ব্যবহার করা উচিত নয় ; না করার অনেকগুলি ভাল কারণ রয়েছে। "এটি নিশ্চিত না এটি ভেঙে না" ইস্যু হিসাবে এটি এতটা পারফরম্যান্স সমস্যা নয়।
পয়েন্টি

ঠিক আছে, আমার জিনিসগুলি প্রযুক্তিগতভাবে একটি অ্যারেতে সঞ্চয় করা হয়, এজন্যই আমি চিন্তিত ছিলাম, এমন কিছু: [{a:'hey',b:'hi'},{a:'hey',b:'hi'}]তবে হ্যাঁ, আমি বুঝতে পারি।
নাইক নিউম্যান

9

এছাড়াও শব্দার্থবিজ্ঞানের কারণে, for, inঅ্যারের সাথে যেভাবে আচরণ করা হয় (যেমন অন্য কোনও জাভাস্ক্রিপ্ট অবজেক্টের সমান) অন্যান্য জনপ্রিয় ভাষার সাথে সংযুক্ত করা হয় না।

// C#
char[] a = new char[] {'A', 'B', 'C'};
foreach (char x in a) System.Console.Write(x); //Output: "ABC"

// Java
char[] a = {'A', 'B', 'C'};
for (char x : a) System.out.print(x);          //Output: "ABC"

// PHP
$a = array('A', 'B', 'C');
foreach ($a as $x) echo $x;                    //Output: "ABC"

// JavaScript
var a = ['A', 'B', 'C'];
for (var x in a) document.write(x);            //Output: "012"

9

টিএল অ্যান্ড ডিআর:for in অ্যারেগুলিতে লুপটি ব্যবহার করা খারাপ নয়, বাস্তবে একেবারে বিপরীত।

আমার মনে হয় অ্যারেগুলিতে সঠিকভাবেfor in ব্যবহৃত হলে লুপটি জেএসের একটি মণি । আপনার সফ্টওয়্যারটির উপরে আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকবে এবং আপনি কী করছেন তা জানতে পারবেন। আসুন উল্লিখিত ত্রুটিগুলি দেখতে দিন এবং একে একে একে অস্বীকার করুন।

  1. এটি উত্তরাধিকার সূত্রে প্রাপ্ত বৈশিষ্ট্যগুলির মধ্যেও লুপ হয়: সর্বপ্রথম যে কোনও এক্সটেনশনটি ব্যবহার করে করা Array.prototypeউচিত ছিল Object.defineProperty()এবং তাদের enumerableবিবরণী সেট করা উচিত ছিল false। যে কোনও গ্রন্থাগার এটি না করে সেগুলি ব্যবহার করা উচিত নয়।
  2. উত্তরাধিকার শৃঙ্খলে আপনি যুক্ত করা সম্পত্তিগুলি পরে গণনা করা হবে:Object.setPrototypeOf শ্রেণি দ্বারা বা শ্রেণীর দ্বারা অ্যারে সাব-ক্লাসিং করার সময় extend। আপনার আবার ব্যবহার করা উচিত Object.defineProperty()যা ডিফল্টরূপে writable, enumerableএবং configurableসম্পত্তি বর্ণনাকারীদের সেট করে false। এখানে একটি অ্যারে উপ-শ্রেণিবদ্ধ উদাহরণ দেখতে দিন ...

function Stack(...a){
  var stack = new Array(...a);
  Object.setPrototypeOf(stack, Stack.prototype);
  return stack;
}
Stack.prototype = Object.create(Array.prototype);                                 // now stack has full access to array methods.
Object.defineProperty(Stack.prototype,"constructor",{value:Stack});               // now Stack is a proper constructor
Object.defineProperty(Stack.prototype,"peak",{value: function(){                  // add Stack "only" methods to the Stack.prototype.
                                                       return this[this.length-1];
                                                     }
                                             });
var s = new Stack(1,2,3,4,1);
console.log(s.peak());
s[s.length] = 7;
console.log("length:",s.length);
s.push(42);
console.log(JSON.stringify(s));
console.log("length:",s.length);

for(var i in s) console.log(s[i]);

সুতরাং আপনি দেখুন .. for inলুপ এখন আপনার নিরাপদ যেহেতু আপনি আপনার কোড সম্পর্কে যত্নশীল।

  1. for in: লুপ ধীর কোন জাহান্নামের। এটি যদি পুনরুক্তির দ্রুততম পদ্ধতি হয় তবে যদি আপনি সময়ে সময়ে প্রয়োজন এমন স্পার্স অ্যারেগুলি লুপ করে চলেছেন। এটি অন্যতম গুরুত্বপূর্ণ পারফরম্যান্স ট্রিকস যা জানা উচিত। আসুন একটি উদাহরণ দেখুন। আমরা একটি বিরল অ্যারে লুপ করব।

var a = [];
a[0] = "zero";
a[10000000] = "ten million";
console.time("for loop on array a:");
for(var i=0; i < a.length; i++) a[i] && console.log(a[i]);
console.timeEnd("for loop on array a:");
console.time("for in loop on array a:");
for(var i in a) a[i] && console.log(a[i]);
console.timeEnd("for in loop on array a:");


@ রবি শঙ্কর রেড্ডি ভাল বেঞ্চমার্কিং সেট আপ করেছেন। যেমনটি আমি আমার উত্তরে উল্লেখ করেছি for inলুপটি অন্যদেরকে "যদি" অ্যারেগুলি বিস্মৃত হয় এবং এটি আকারে আরও বড় হয় তবে তার চেয়েও বেশি করে। সুতরাং আমি arrমাত্র ৫০ টি আইটেমের সাথে এলোমেলোভাবে [42,"test",{t:1},null, void 0]সূচকগুলিতে এলোমেলোভাবে বেছে নেওয়া আকারের ars 10000 আকারের একটি বিচ্ছিন্ন অ্যারের জন্য বেঞ্চ পরীক্ষাটি পুনরায় সাজিয়েছি। আপনি তাত্ক্ষণিকভাবে পার্থক্য লক্ষ্য করবেন। - >> এটি এখানে দেখুন << -
রেডু

8

অন্যান্য সমস্যাগুলির পাশাপাশি, "for..in" সিনট্যাক্সটি সম্ভবত ধীরে ধীরে, কারণ সূচকটি একটি স্ট্রিং, কোনও পূর্ণসংখ্যা নয়।

var a = ["a"]
for (var i in a)
    alert(typeof i)  // 'string'
for (var i = 0; i < a.length; i++)
    alert(typeof i)  // 'number'

সম্ভবত পুরো অনেক কিছুই যায় আসে না। অ্যারে উপাদানগুলি হ'ল অ্যারে-ভিত্তিক বা অ্যারে-জাতীয় বস্তুর বৈশিষ্ট্য এবং সমস্ত বস্তুর বৈশিষ্ট্যে স্ট্রিং কী রয়েছে keys আপনার জেএস ইঞ্জিন যদি না কোনওভাবে এটি অনুকূল করে তোলে, আপনি যদি একটি নম্বর ব্যবহার করেন তবে এটি শেষ পর্যন্ত অনুসন্ধানের জন্য একটি স্ট্রিংয়ে পরিণত হবে turned
সিএওও

নির্বিশেষে যে কোনও পারফরম্যান্স সমস্যা, আপনি যদি জাভাস্ক্রিপ্টে নতুন হন var i in aতবে সূচকটি পূর্ণসংখ্যা হিসাবে ব্যবহার এবং প্রত্যাশা করেন, তবে এর মতো কিছু a[i+offset] = <value>করা মানকে পুরোপুরি ভুল জায়গায় স্থান দেবে। ("1" + 1 == "11")।
szmoore

8

একটি গুরুত্বপূর্ণ দিকটি হ'ল for...inকেবলমাত্র কোনও অবজেক্টের মধ্যে থাকা বৈশিষ্ট্যগুলিতে পুনরাবৃত্তি হয় যা তাদের অগণিত সম্পত্তি বৈশিষ্ট্যকে সত্য হিসাবে সেট করে। সুতরাং যদি কেউ কোনও জিনিস ব্যবহার করে পুনরাবৃত্তি করার চেষ্টা করে for...inতবে তাদের অগণিত সম্পত্তির বৈশিষ্ট্যটি মিথ্যা হলে স্বতন্ত্র বৈশিষ্ট্যগুলি মিস করা যেতে পারে। সাধারণ অ্যারে অবজেক্টের জন্য গণনাযোগ্য সম্পত্তি বৈশিষ্ট্যটি পরিবর্তন করা বেশ সম্ভব যাতে নির্দিষ্ট উপাদানগুলি গণনা করা যায় না। যদিও সাধারণভাবে সম্পত্তি বৈশিষ্ট্যগুলি কোনও অবজেক্টের মধ্যে ফাংশন বৈশিষ্ট্যগুলিতে প্রয়োগ হয়।

যে কোনও দ্বারা সম্পত্তি হিসাবে গণ্য করা যায় এমন গুণাবলীর গুণাগুণ মূল্য পরীক্ষা করতে পারে:

myobject.propertyIsEnumerable('myproperty')

বা চারটি সম্পত্তি বৈশিষ্ট্য অর্জন করতে:

Object.getOwnPropertyDescriptor(myobject,'myproperty')

এটি ECMAScript 5 এ উপলব্ধ একটি বৈশিষ্ট্য - পূর্ববর্তী সংস্করণগুলিতে গণনাযোগ্য সম্পত্তি বৈশিষ্ট্যের মান পরিবর্তন করা সম্ভব ছিল না (এটি সর্বদা সত্য হিসাবে সেট করা থাকে)।


8

for/ inHashtables (মিশুক অ্যারে) এবং অ্যারে (অ-মিশুক): ভেরিয়েবল দুই ধরনের সঙ্গে কাজ করে।

জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে আইটেমগুলির মধ্য দিয়ে যায় তা নির্ধারণ করে। সুতরাং যদি আপনি জানেন যে আপনার অ্যারেটি সত্যিই অ-অ্যাসোসিয়েটিভ হিসাবে ব্যবহার করতে পারেন for (var i=0; i<=arrayLen; i++)তবে আপনি স্বয়ংক্রিয় সনাক্তকরণ পুনরাবৃত্তিটি এড়িয়ে যেতে পারেন ।

তবে আমার মতে, for/ ব্যবহার করা ভাল in, সেই স্বতঃ-সনাক্তকরণের জন্য প্রয়োজনীয় প্রক্রিয়াটি খুব কম।

ব্রাউজারটি জাভাস্ক্রিপ্ট কোডটি পার্সার / ব্যাখ্যা করে কীভাবে তার উপর নির্ভর করে এর প্রকৃত উত্তর। এটি ব্রাউজারগুলির মধ্যে পরিবর্তন করতে পারে।

for/ ব্যবহার না করার জন্য আমি অন্য উদ্দেশ্যে ভাবতে পারি না in;

//Non-associative
var arr = ['a', 'b', 'c'];
for (var i in arr)
   alert(arr[i]);

//Associative
var arr = {
   item1 : 'a',
   item2 : 'b',
   item3 : 'c'
};

for (var i in arr)
   alert(arr[i]);

সত্য, যদি না আপনি প্রোটোটাইপযুক্ত অবজেক্ট ব্যবহার না করেন। ;) নীচে
রিকার্ডো

এখানেই কারণ Arrayহল Objectখুব
ফ্রি কনসাল্টিং

2
for ... inবস্তুর সাথে কাজ করে। স্বতঃ-সনাক্তকরণের মতো কোনও জিনিস নেই।
আরও ভাল অলিভার

7

কারণ আপনি যদি যত্নশীল না হন তবে প্রোটোটাইপ চেইন আপ অবজেক্টের মালিকানাধীন বৈশিষ্ট্যগুলির পুনরাবৃত্তি হবে।

আপনি ব্যবহার করতে পারেন for.. in, হ্যাশঅনপ্রপার্টি দিয়ে প্রতিটি সম্পত্তি যাচাই করতে ভুলবেন না ।


2
যথেষ্ট নয় - এটি অ্যারের ইনস্ট্যান্সের নির্বিচারে নামে বৈশিষ্ট্য যোগ করার জন্য পুরোপুরি ঠিক আছে, এবং যারা পরীক্ষা হবে trueথেকে hasOwnProperty()চেক।
পয়েন্টটি

ভালো কথা, ধন্যবাদ আমি নিজেই কোনও অ্যারের সাথে এটি করার মতো নিরীহ ছিলাম না, তাই আমি এটি বিবেচনা করি নি!
জাল

1
@ পয়েন্টি আমি এটি পরীক্ষা করি নি তবে সম্ভবত isNaNপ্রতিটি সম্পত্তি নামের একটি চেক ব্যবহার করে এটি কাটিয়ে উঠতে পারে ।
WynandB

1
@ উইনানড আকর্ষণীয় ধারণা; একটি সাধারণ সংখ্যাসূচক সূচক দিয়ে পুনরাবৃত্তি করা এত সহজ কেন তবে আমি কেন সত্যিই সমস্যাটির কারণ তা দেখতে পাচ্ছি না।
পয়েন্টি

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

6

এটি অগত্যা খারাপ নয় (আপনি যা করছেন তার উপর ভিত্তি করে), তবে অ্যারেগুলির ক্ষেত্রে যদি কিছু যুক্ত করা হয় Array.prototypeতবে আপনি অদ্ভুত ফলাফল পেতে চলেছেন। আপনি যেখানে এই লুপটি তিনবার চালানোর আশা করতেন:

var arr = ['a','b','c'];
for (var key in arr) { ... }

একটি ফাংশন বলা যদি helpfulUtilityMethodযোগ করা হয়েছে Array'র prototype, তারপর আপনার লুপ চারবার চলমান শেষ হবে: keyহবে 0, 1, 2, এবং helpfulUtilityMethod। আপনি যদি কেবল পূর্ণসংখ্যার আশা করছিলেন, উফ!


6

আপনার for(var x in y)কেবলমাত্র সম্পত্তি তালিকায় ব্যবহার করা উচিত , বস্তুগুলিতে নয় (উপরে বর্ণিত হিসাবে)।


13
এসও সম্পর্কে কেবল একটি নোট - কোনও 'উপরে' নেই কারণ মন্তব্যগুলি পৃষ্ঠায় সার্বক্ষণিক ক্রম পরিবর্তন করে। সুতরাং, আপনি কোন মন্তব্যটি বলতে চাইছেন তা আমরা সত্যই জানি না। এই কারণে "এক্স ব্যক্তির মন্তব্যে" বলা ভাল।
জাল

@ জাল ... বা উত্তরে পারমালিঙ্ক যুক্ত করুন।
উইনান্দবি

5

ব্যবহার for...inএকটি অ্যারের জন্য লুপ ভুল নয়, যদিও আমি অনুমান করতে পারেন কেন কেউ তোমাকে বলেছিলাম যে:

১) ইতিমধ্যে একটি উচ্চতর অর্ডার ফাংশন বা পদ্ধতি রয়েছে যার একটি অ্যারের জন্য সেই উদ্দেশ্য রয়েছে তবে এতে আরও কার্যকারিতা এবং লেনার সিনট্যাক্স রয়েছে, যাকে 'ফর ইচ' বলা হয়: Array.prototype.forEach(function(element, index, array) {} );

2.) অ্যারেগুলির সবসময় একটি দৈর্ঘ্য আছে, কিন্তু for...inএবং forEachযে কোনো মান জন্য একটি ফাংশন চালানো না 'undefined', শুধুমাত্র ইনডেক্স সংজ্ঞায়িত একটি মান আছে জন্য। সুতরাং আপনি যদি কেবল একটি মান নির্ধারণ করেন তবে এই লুপগুলি কেবল একবার একটি ফাংশন সম্পাদন করবে, তবে যেহেতু একটি অ্যারে অঙ্কিত হয়, এটির সর্বদা সর্বোচ্চ সূচকের দৈর্ঘ্য থাকবে যার একটি নির্ধারিত মান রয়েছে তবে এইগুলি ব্যবহার করার সময় সেই দৈর্ঘ্যটি লক্ষ করা যায় না লুপ।

৩) লুপের মানটি প্যারামিটারগুলিতে যতবার সংজ্ঞায়িত হয় ততবার একটি ফাংশন সম্পাদন করবে এবং যেহেতু একটি অ্যারে সংখ্যাযুক্ত, তাই আপনি কতবার একটি ফাংশন সম্পাদন করতে চান তা নির্ধারণ করতে এটি আরও অর্থবোধ করে। অন্যান্য লুপগুলির বিপরীতে, ফর লুপটি তখন অ্যারের প্রতিটি সূচির জন্য একটি ক্রিয়াকলাপ চালাতে পারে, মান নির্ধারিত হয় কিনা whether

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

এছাড়াও, সাধারণভাবে লুপের forEachচেয়ে পদ্ধতিটি ব্যবহার করা আরও ভাল অনুশীলন হিসাবে বিবেচিত হতে পারে for...in, কারণ এটি লেখার পক্ষে সহজ এবং আরও কার্যকারিতা রয়েছে, তাই আপনি কেবল এই পদ্ধতিটি এবং স্ট্যান্ডার্ডের জন্য ব্যবহার করতে অভ্যস্ত হতে পারেন, তবে আপনার কল করুন।

নীচে দেখুন যে প্রথম দুটি লুপগুলি কেবল একবার কনসোল.লগ স্টেটমেন্টগুলি সম্পাদন করে, যখন লুপের মানটি এই ক্ষেত্রে অ্যারে.এলনেথ = 6 হিসাবে নির্দিষ্ট হিসাবে ফাংশনটি নির্ধারিত হিসাবে বহুবার কার্যকর করে।

var arr = [];
arr[5] = 'F';

for (var index in arr) {
console.log(index);
console.log(arr[index]);
console.log(arr)
}
// 5
// 'F'
// => (6) [undefined x 5, 6]

arr.forEach(function(element, index, arr) {
console.log(index);
console.log(element);
console.log(arr);
});
// 5
// 'F'
// => Array (6) [undefined x 5, 6]

for (var index = 0; index < arr.length; index++) {
console.log(index);
console.log(arr[index]);
console.log(arr);
};
// 0
// undefined
// => Array (6) [undefined x 5, 6]

// 1
// undefined
// => Array (6) [undefined x 5, 6]

// 2
// undefined
// => Array (6) [undefined x 5, 6]

// 3
// undefined
// => Array (6) [undefined x 5, 6]

// 4
// undefined
// => Array (6) [undefined x 5, 6]

// 5
// 'F'
// => Array (6) [undefined x 5, 6]

4

এটি (সাধারণত) খারাপ অভ্যাস হওয়ার কারণগুলি এখানে রয়েছে:

  1. for...inলুপ বারবার সব তাদের নিজস্ব গণনীয় বৈশিষ্ট্য উপর এবং তাদের প্রোটোটাইপ (গুলি) গণনীয় বৈশিষ্ট্য। সাধারণত একটি অ্যারে পুনরাবৃত্তিতে আমরা কেবল অ্যারের উপরেই পুনরাবৃত্তি করতে চাই। এবং যদিও আপনি নিজে অ্যারেতে কিছু নাও যোগ করতে পারেন, আপনার গ্রন্থাগারগুলি বা কাঠামোতে কিছু যুক্ত হতে পারে।

উদাহরণ :

Array.prototype.hithere = 'hithere';

var array = [1, 2, 3];
for (let el in array){
    // the hithere property will also be iterated over
    console.log(el);
}

  1. for...inলুপগুলি নির্দিষ্ট পুনরাবৃত্তির আদেশের গ্যারান্টি দেয় না । যদিও আজকাল বেশিরভাগ আধুনিক ব্রাউজারগুলিতে অর্ডার সাধারণত দেখা যায়, এখনও 100% গ্যারান্টি নেই।
  2. for...inলুপগুলি undefinedঅ্যারে উপাদানগুলি, অর্থাৎ অ্যারে উপাদানগুলিকে অগ্রাহ্য করে যা এখনও নির্ধারিত হয়নি।

উদাহরণ :

const arr = []; 
arr[3] = 'foo';   // resize the array to 4
arr[4] = undefined; // add another element with value undefined to it

// iterate over the array, a for loop does show the undefined elements
for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

console.log('\n');

// for in does ignore the undefined elements
for (let el in arr) {
    console.log(arr[el]);
}


2

জাভাস্ক্রিপ্টে কোনও অবজেক্টে কাজ করার সময় ... এর জন্য দরকারী, তবে অ্যারের জন্য নয়, তবে আমরা এটি কোনও ভুল উপায় বলতে পারি না, তবে এটি প্রস্তাবিত নয়, লুপের জন্য নীচে ব্যবহার করে উদাহরণটি দেখুন :

let txt = "";
const person = {fname:"Alireza", lname:"Dezfoolian", age:35}; 
for (const x in person) {
    txt += person[x] + " ";
}
console.log(txt); //Alireza Dezfoolian 35 

ঠিক আছে, অ্যারে দিয়ে এখন এটি করা যাক :

let txt = "";
const person = ["Alireza", "Dezfoolian", 35]; 
for (const x in person) {
   txt += person[x] + " ";
}
console.log(txt); //Alireza Dezfoolian 35 

আপনি ফলাফল যেমন দেখতে পান ...

তবে আসুন কিছু চেষ্টা করা যাক, অ্যারেতে কিছু প্রোটোটাইপ করা যাক ...

Array.prototype.someoneelse = "someoneelse";

এখন আমরা একটি নতুন অ্যারে () তৈরি করি;

let txt = "";
const arr = new Array();
arr[0] = 'Alireza';
arr[1] = 'Dezfoolian';
arr[2] = 35;
for(x in arr) {
 txt += arr[x] + " ";
}
console.log(txt); //Alireza Dezfoolian 35 someoneelse

আপনি দেখতে someoneelse !!! ... আমরা আসলে এই ক্ষেত্রে নতুন এরে বস্তুর মাধ্যমে looping!

সুতরাং এটির একটি কারণ যা আমাদের জন্য..যে সাবধানে ব্যবহার করা দরকার , তবে এটি সর্বদা হয় না ...


2

এ জন্য ... লুপে সর্বদা কীগুলি গণনা করে। অবজেক্ট বৈশিষ্ট্য কীগুলি সর্বদা স্ট্রিং থাকে, এমনকি কোনও অ্যারের সূচকযুক্ত বৈশিষ্ট্য:

var myArray = ['a', 'b', 'c', 'd'];
var total = 0
for (elem in myArray) {
  total += elem
}
console.log(total); // 00123

1

যেহেতু জাভাস্ক্রিপ্ট উপাদানগুলি স্ট্যান্ডার্ড অবজেক্টের বৈশিষ্ট্য হিসাবে সংরক্ষিত হয়েছে, জাভা স্ক্রিপ্ট অ্যারেগুলির মাধ্যমে ... লুপগুলিতে ব্যবহার করে পুনরাবৃত্তি করার পরামর্শ দেওয়া হয় না কারণ সাধারণ উপাদান এবং সমস্ত গণ্য বৈশিষ্ট্য তালিকাভুক্ত করা হবে।

Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_colifications থেকে


0

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

একক ফলাফলের ক্ষেত্রে, আমি পেয়েছি:

var nodes = document.querySelectorAll(selector);
nodes
 NodeList [a._19eb]
for (node in nodes) {console.log(node)};
VM505:1 0
VM505:1 length
VM505:1 item
VM505:1 entries
VM505:1 forEach
VM505:1 keys
VM505:1 values

যা ব্যাখ্যা করল কেন আমার for (node in nodes) node.href = newLink;ব্যর্থতা ছিল।

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