এর জন্য জাভা স্ক্রিপ্ট ... বনাম জন্য


461

আপনি কি মনে করেন ... লুপ এবং ইন লুপের মধ্যে একটি বড় পার্থক্য আছে? আপনি কোন ধরণের "জন্য" ব্যবহার করতে পছন্দ করেন এবং কেন?

ধরা যাক আমাদের সাথে অ্যা্যাসোসিয়েটিভ অ্যারে রয়েছে:

var myArray = [{'key': 'value'}, {'key': 'value1'}];

সুতরাং আমরা পুনরাবৃত্তি করতে পারেন:

for (var i = 0; i < myArray.length; i++)

এবং:

for (var i in myArray)

আমি একটি বড় পার্থক্য দেখতে পাচ্ছি না। কোন কার্যকারিতা সমস্যা আছে?


13
নোট আমরা যে জাতীয় 1.6 হিসাবে , আছে: myArray.forEach(callback[, thisarg])
বেনজি XVI

14
@ বেঞ্জি অ্যারে.ফের প্রতিটি ইএস 5 এ রয়েছে।
মাইকম্যাকানা

2
একটি ইন- if(myArray.hasOwnProperty(i)){true}
লুপটিতে আপনার

6
['foo', 'bar', 'baz'].forEach(function(element, index, array){ console.log(element, index, array); }); আইই 8 ব্যতীত অন্য কোথাও ব্যবহার করা ঠিক আছে- এবং এটি এখন পর্যন্ত সবচেয়ে মার্জিত সিনট্যাক্স
Jon z

5
রয়েছে for...ofবিবৃতিতে ECMAScript প্রোগ্রামিং 6 : উদাহরণস্বরূপfor (let i of myArray) console.log(i);
Vitalii Fedorenko

উত্তর:


548

পছন্দটি হ'ল আইডিয়মটি ভালভাবে বোঝা যায় তার উপর ভিত্তি করে হওয়া উচিত।

একটি অ্যারে ব্যবহার করে পুনরাবৃত্তি করা হয়:

for (var i = 0; i < a.length; i++)
   //do stuff with a[i]

সহযোগী অ্যারে হিসাবে ব্যবহৃত একটি অবজেক্টটি পুনরাবৃত্তি করে এটি ব্যবহার করে:

for (var key in o)
  //do stuff with o[key]

যদি আপনার পৃথিবী ভেঙে যাওয়ার কারণ না থাকে তবে ব্যবহারের প্রতিষ্ঠিত প্যাটার্নটিতে আটকে থাকুন।


38
এটি উল্লেখ করা উচিত যে স্টেটমেন্টের সাথে ফিল্টারিংয়ের সাথে ... এর জন্য ব্যবহার করা একটি দুর্দান্ত অনুশীলন। অবজেক্টের একটি সহজ পদ্ধতি রয়েছে "اعتراض.হাসসনপ্রোপার্টি (সদস্য)" যা পরীক্ষা করে যে পুনরুক্তি দ্বারা ফিরে আসা কোনও সদস্য আসলে বস্তুর সদস্য কিনা। দেখুন: javascript.crockford.com/code.html
দামির জেকি

57
অন্য উত্তরে (টি) মন্তব্য করাতে, "ফর ... ইন" অ্যারেগুলির জন্য সঠিকভাবে কাজ করে না, কারণ এটি সমস্ত অ্যারে বৈশিষ্ট্য এবং পদ্ধতিতে পুনরাবৃত্তি করবে। সুতরাং, কেবলমাত্র বস্তুর বৈশিষ্ট্যগুলিকে পুনরাবৃত্তি করার জন্য আপনার "for ... in" ব্যবহার করা উচিত। অন্যথায়, "এর জন্য (i = 0; i <কিছু; i ++)" আটকে থাকুন
ডেনিলসন সা মিয়া

পারফরম্যান্সের কারণে, আইএমও forলারের আগে অ্যারের দৈর্ঘ্যের মূল্যায়ন না করে , অ্যারের দৈর্ঘ্যের মূল্যায়ন করা ভাল ।
আপক্রিক

9
@ ইউপিকেক্রিক: এটি অবশ্যই সত্য যখন অ্যারেটি এইচটিএমএলডম দ্বারা ফিরিয়ে দেওয়া হয়েছে, তবে আমি আশ্চর্য হয়েছি যে আপনি কোনও প্রশংসনীয় পার্থক্য দেখার আগে স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট অ্যারে কত বড় হওয়া দরকার? ব্যক্তিগতভাবে আমি কোডটি অন্য কিছু করার প্রয়োজনীয় প্রমাণিত না হওয়া পর্যন্ত যথাসম্ভব সহজ রাখি।
অ্যান্থনিডব্লু জোন্স

2
@ পিচান আমার মনে হয় আপনার লুপ অবস্থায় আপনার অর্থ নেই i < l, নয় i < a
সর্বাধিক ন্যানসি

161

ডগলাস ক্রকফোর্ড জাভাস্ক্রিপ্টে সুপারিশ করেছেন :for in বিবৃতিটি ব্যবহার এড়াতে গুড পার্টস (পৃষ্ঠা 24) ।

আপনি যদি for inকোনও বস্তুতে সম্পত্তির নাম লুপ করতে ব্যবহার করেন তবে ফলাফলগুলি অর্ডার করা হয় না। আরও খারাপ: আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন; এতে প্রোটোটাইপ চেইন এবং পদ্ধতির নাম থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সদস্যদের অন্তর্ভুক্ত রয়েছে।

বৈশিষ্ট্যগুলি ছাড়াও সমস্ত কিছু দিয়ে ফিল্টার করা যায় .hasOwnProperty। এই কোড নমুনাটি সম্ভবত আপনি সম্ভবত যা চেয়েছিলেন তা করে:

for (var name in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, name)) {
        // DO STUFF
    }
}

70
জন্য ... বস্তুর বৈশিষ্ট্যগুলি লুপিংয়ের জন্য পুরোপুরি উপযুক্ত। অ্যারের উপাদানগুলির উপর লুপিংয়ের জন্য এটি উপযুক্ত নয়। যদি আপনি এই পরিস্থিতিতেগুলির মধ্যে পার্থক্য বুঝতে না পারেন, তবে হ্যাঁ, আপনার জন্য ... এড়ানো উচিত; অন্যথায়, বাদাম যেতে।
শোগ 9

8
এটি অর্ডার না হওয়াতে জোর দিয়ে বলতে চান! এটি একটি বড় সমস্যা হতে পারে, এবং এটি ধরা শক্ত সমস্যা হবে।
জেসন

4
প্রোটোটাইপ চেইন এবং পদ্ধতির নাম থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সদস্যদের অন্তর্ভুক্ত +1 এর জন্য +1। উদাহরণস্বরূপ, কেউ প্রোটোটাইপযুক্ত লোডযুক্ত আপনার কোড ব্যবহার করতে ঘটলে আপনি মজা পাবেন।
আইজডব্লু

13
দয়া করে ভেরিয়েবলটি ঘোষণা করতে ভুলবেন না name: for(var name in object)...অন্যথায়, যদি কোডটি কোনও ফাংশনের অভ্যন্তরে থাকে, তবে nameভেরিয়েবলটি বৈশ্বিক অবজেক্টের সম্পত্তি হয়ে থাকে (একটি অঘোষিত শনাক্তকারীকে একটি অ্যাসাইনমেন্ট দেয় এটি), নতুন ইসসিএমএসক্রিপ্টেও 5 স্ট্রিক্ট মোড, কোডটি একটি নিক্ষেপ করবে ReferenceError
সিএমএস 21

6
@ নসরডেনা: ক্রোমের পুনরাবৃত্তির ক্রম সম্পর্কিত একটি সমস্যা রয়েছে, জন রেসিগ ছাড়া অন্য কারও দ্বারা দায়ের করা, এটি ওন্টফিক্স হিসাবে চিহ্নিত নয়। কোড . google.com/p/chromium/issues/detail?id=883 । ক্রোমের আগেও, পুনরাবৃত্তির ক্রমটি ব্রাউজারগুলিতে একই ছিল না যদি আপনি আবার কোনও সম্পত্তি যোগ করেন এবং রাখেন। এছাড়াও আই 9 9 অনেকটা ক্রোমের মতো আচরণ করে (ধারণা করা হয় গতির উন্নতির জন্য)। সুতরাং ... অনুগ্রহ করে ভুল তথ্য ছড়িয়ে দেওয়া বন্ধ করুন, আপনি তার উপর নির্ভর করে চালিয়ে যাবেন না।
হুয়ান মেন্ডেস 21

62

এফওয়াইআই - jQuery ব্যবহারকারীরা


jQuery এর মধ্যে each(callback)পদ্ধতি ব্যবহার for( ; ; )ডিফল্টরূপে লুপ, এবং ব্যবহার করবে for( in ) শুধুমাত্র যদি দৈর্ঘ্য হল undefined

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

উদাহরণ :

$(['a','b','c']).each(function() {
    alert(this);
});
//Outputs "a" then "b" then "c"

এটির ব্যবহারের ক্ষতিটি হ'ল আপনি যদি কিছু ইউআই যুক্তি না করেন তবে আপনার ফাংশনগুলি অন্যান্য ফ্রেমওয়ার্কগুলিতে কম পোর্টেবল হবে। each()ফাংশন সম্ভবত শ্রেষ্ঠ jQuery নির্বাচক সাথে ব্যবহারের জন্য সংরক্ষিত এবং for( ; ; )অন্যথায় যুক্তিযুক্ত হতে পারে।



4
এখানে সবসময় ডকুমেন্টক্লাউড. github.com/underscore রয়েছে যা _.each এবং সম্পূর্ণ অন্যান্য দরকারী কার্যাদি রয়েছে
w00t

1
এটির অর্থ কি যদি আমার অবজেক্টে দৈর্ঘ্যের সম্পত্তি থাকে - তবে ব্যর্থ হবে? যেমন x = {a: "1", খ: "2", দৈর্ঘ্য: 3}
ওনুর টপাল

29

আপনি কোন ধরণের লুপ ব্যবহার করেন এবং কোন ব্রাউজারের উপর নির্ভর করে পারফরম্যান্সের পার্থক্য রয়েছে।

এই ক্ষেত্রে:

for (var i = myArray.length-1; i >= 0; i--)

কিছু ব্রাউজারের তুলনায় প্রায় দ্বিগুণ দ্রুত:

for (var i = 0; i < myArray.length; i++)

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


5
লুপিংয়ের আগে "মাইআরএলাইট লেন্থ" কে ভেরিয়েবলের মধ্যে রাখলে পারফরম্যান্সের পার্থক্য কেটে যাবে? আমার অনুমান "হ্যাঁ"।
টমলক

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

3
হ্যা এখানে. বৈশিষ্ট্যগুলি ভেরিয়েবল নয়; তারা কোড পেতে / সেট আছে।
স্টে

12
আমার ব্যবহারের প্রবণতা রয়েছেfor(var i = myArray.length; i--;)
কেভিন

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

26

নোট করুন যে নেটিভ অ্যারে.ফোর প্রতিটি পদ্ধতি এখন ব্যাপকভাবে সমর্থিত


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

2
* নিক্স ব্যবহারকারী যতই তা তুচ্ছ করেন, IE8 হ'ল সকল সাব উইন্ডোজ 7 ব্যবহারকারী of ব্রাউজার বাজারের একটি বিশাল অংশকে ধন্যবাদ দেয়।
sbartell

2
@Rauni - আমি অনুযায়ী আপনার পয়েন্ট, কিন্তু ডেস্কটপে ডিভাইসের জন্য ইন্টারনেট ব্রাউজার ভাগ কম 40%, en.wikipedia.org/wiki/Usage_share_of_web_browsers#Summary_table , এবং অনুযায়ী marketshare.hitslink.com/... এবং অন্যান্য সাইট, কমপক্ষে 8% ব্রাউজারগুলি আইই 9. হয় other অন্য কথায়, অ্যারে.ফোর্চ প্রায় 70% ডেস্কটপ ব্রাউজার দ্বারা সমর্থিত, তাই আমি মনে করি না 'ব্যাপকভাবে সমর্থিত' অযৌক্তিক। আমি চেক করিনি, তবে মোবাইল সমর্থন (ওয়েবকিট এবং অপেরা ব্রাউজারগুলিতে) আরও বেশি হতে পারে। স্পষ্টতই, ভৌগোলিকভাবে যথেষ্ট পার্থক্য রয়েছে।
স্যাম ডটন

1
আপডেটের জন্য ধন্যবাদ. আমি সম্মত হই যে এটি বলা যেতে পারে যে এটি "ব্যাপকভাবে সমর্থিত"। কেবলমাত্র সমস্যাটি হ'ল যদি ব্যবহারকারী এই জেএস পদ্ধতিটি ব্যবহার করেন তবে সমর্থন না করা হলে তাকে / এখনও মামলাটির জন্য একটি ব্যাক-আপ পদ্ধতি লিখতে হবে ..
রাউনি লিলমেটস

1
@ রৌনি - আপনি স্বয়ংক্রিয়ভাবে ব্যাকআপ পদ্ধতি সরবরাহ করতে এস 5-শিম এবং এস 6-শিম ব্যবহার করতে পারেন। github.com/es-shims/es5-shim
ভ্যান ডার ব্লঙ্ক

24

সমস্ত বড় ব্রাউজারের 2012 বর্তমান সংস্করণের জন্য আপডেট হওয়া উত্তর - ক্রোম, ফায়ারফক্স, আই 9, সাফারি এবং অপেরা ইএস 5 এর নেটিভ অ্যারে.ফোরে সমর্থন করে।

আপনি যদি IE8 স্থানীয়ভাবে সমর্থন করার কোনও কারণ না পান (ES5-shim বা ক্রোম ফ্রেমটি এই ব্যবহারকারীদের জন্য সরবরাহ করা যেতে পারে যা একটি উপযুক্ত জেএস পরিবেশ সরবরাহ করবে), কেবলমাত্র ভাষার যথাযথ বাক্য গঠনটি পরিষ্কার করা এটি ক্লিনার:

myArray.forEach(function(item, index) {
    console.log(item, index);
});

অ্যারে.ফোর প্রতিটি () এর জন্য সম্পূর্ণ ডকুমেন্টেশন MDN এ রয়েছে।


1
আপনার সত্যিই কলব্যাকের প্যারামিটারগুলি নথী করা উচিত: 1 ম মৌলিক মান, 2 তম উপাদান সূচক, 3 য় অ্যারেটি
ট্রান্সভার করা

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

1
@ কোরি: ইএস 5 ফর ইচ্ছুক উত্তরাধিকার ES3 ব্রাউজারগুলিতে মোটামুটি সহজেই যুক্ত করা যায়। কম কোড ভাল কোড।
মাইকমেকানা

2
@ এনাইলার এটি কী অ্যারে এবং অবজেক্টগুলিতে বিনিময়যোগ্য হিসাবে ব্যবহার করা যেতে পারে?
hitautodestruct

1
@ হাইটাডোডস্ট্রাক্ট এটি অ্যারের প্রোটোটাইপের অংশ, অবজেক্টের নয়। সাধারণত সম্প্রদায়টিতে বর্তমানে অ-অ্যারে অবজেক্টগুলি এখনও 'ফর (অবজেক্টে কী কী) {}' দিয়ে পুনরাবৃত্তি করা হয়।
মাইকম্যাকানা

14

অ্যারেগুলি বিরল হলে দুটি এক হয় না।

var array = [0, 1, 2, , , 5];

for (var k in array) {
  // Not guaranteed by the language spec to iterate in order.
  alert(k);  // Outputs 0, 1, 2, 5.
  // Behavior when loop body adds to the array is unclear.
}

for (var i = 0; i < array.length; ++i) {
  // Iterates in order.
  // i is a number, not a string.
  alert(i);  // Outputs 0, 1, 2, 3, 4, 5
  // Behavior when loop body modifies array is clearer.
}

14

প্রোটোটাইপ চেইন এড়াতে forEach ব্যবহার করে

উপরে @ নায়েলারের উত্তরের উপরে কেবলমাত্র একটি দ্রুত সংযোজন , অবজেক্ট.কিসের সাথে প্রত্যেকটি ব্যবহারের অর্থ হ্যাশঅনপ্রপার্টি ব্যবহার না করে আপনি প্রোটোটাইপ চেইনে পুনরাবৃত্তি এড়াতে পারবেন।

var Base = function () {
    this.coming = "hey";
};

var Sub = function () {
    this.leaving = "bye";
};

Sub.prototype = new Base();
var tst = new Sub();

for (var i in tst) {
    console.log(tst.hasOwnProperty(i) + i + tst[i]);
}

Object.keys(tst).forEach(function (val) {
    console.log(val + tst[val]);
});

2
অভিশাপ, এটাই লুক্কায়িত। এটি পেতে 50 টি অন্যান্য পোস্ট পড়ার মূল্য ছিল। اعتراض = {"গোলাপী": "হাঁস", লাল: "গিজ"}; অবজেক্ট.কিজ (আপত্তি) === ["গোলাপী", "লাল"]
ওড়ওলোফিল

14

আমি দ্বিতীয় মতামত দিচ্ছি যে আপনার প্রয়োজন অনুসারে আপনার পুনরাবৃত্তি পদ্ধতিটি বেছে নেওয়া উচিত। আমি আপনি আসলে না সুপারিশ করবে কি নেটিভ মাধ্যমে লুপ Arrayসঙ্গে for inকাঠামো। এই মুহুর্তের আগে চেইস সেবার্ট যেভাবে প্রোটোটাইপ কাঠামোর সাথে সামঞ্জস্যপূর্ণ নয়, এটি ধীরে ধীরে এবং ধীরে ধীরে is

বিভিন্ন লুপিং শৈলীতে একটি দুর্দান্ত বেঞ্চমার্ক রয়েছে যা আপনি জাভাস্ক্রিপ্টের সাথে কাজ করে কিনা আপনার অবশ্যই একেবারে নজর দেওয়া উচিত । প্রারম্ভিক অপ্টিমাইজেশন করবেন না, তবে আপনার সেই জিনিসটি আপনার মাথার পেছনের কোথাও রাখা উচিত।

আমি কোনও সামগ্রীর for inসমস্ত বৈশিষ্ট্য পেতে ব্যবহার করব যা আপনার স্ক্রিপ্টগুলি ডিবাগ করার সময় বিশেষত কার্যকর useful উদাহরণস্বরূপ, আমি যখন অপরিচিত বস্তুটি ঘুরে দেখি তখন এই লাইনটি ব্যবহার করতে পছন্দ করি:

l = ''; for (m in obj) { l += m + ' => ' + obj[m] + '\n' } console.log(l);

এটি আমার ফায়ারব্যাগ লগতে পুরো বস্তুর সামগ্রী (একত্রিত পদ্ধতিগুলির সাথে একসাথে) ফেলে দেয়। খুব সহজ।


লিঙ্কটি এখন ভেঙে গেছে। অবশ্যই বেঞ্চমার্কটি দেখতে চাইবেন, যদি কারও অন্য লিঙ্ক থাকে।
বিলবাদ

এটি আর ভাঙা হয়নি।
ওলি

প্রোটোটাইপে ভাঙা ফোরচ লুপ? এটি এখন সাধারণভাবে সমর্থিত হিসাবে, এটি প্রোটোটাইপ সমাধান করা উচিত।
mvrak

7

এখানে আমি কিছু করেছি।

function foreach(o, f) {
 for(var i = 0; i < o.length; i++) { // simple for loop
  f(o[i], i); // execute a function and make the obj, objIndex available
 }
}

আপনি এটি কীভাবে এটি ব্যবহার করবেন এটি
অ্যারে এবং অবজেক্টগুলিতে কাজ করবে (যেমন এইচটিএমএল উপাদানগুলির একটি তালিকা)

foreach(o, function(obj, i) { // for each obj in o
  alert(obj); // obj
  alert(i); // obj index
  /*
    say if you were dealing with an html element may be you have a collection of divs
  */
  if(typeof obj == 'object') { 
   obj.style.marginLeft = '20px';
  }
});

আমি ঠিক এটি তৈরি করেছি তাই আমি পরামর্শের জন্য উন্মুক্ত :)


দুর্দান্ত জিনিস - বেশ সোজা!
ক্রিস

6

আমি কীভাবে আইটেমগুলি রেফারেন্স করতে চেয়েছি তার উপর ভিত্তি করে আমি বিভিন্ন পদ্ধতি ব্যবহার করব।

আপনি যদি কেবলমাত্র বর্তমান আইটেমটি চান তবে অগ্রণী ব্যবহার করুন।

আপেক্ষিক তুলনা করতে যদি আপনার সূচকের প্রয়োজন হয় তবে এটি ব্যবহার করুন। (অর্থাৎ এটি পূর্ববর্তী / পরবর্তী আইটেমের সাথে কীভাবে তুলনা করে?)

আমি পারফরম্যান্সের পার্থক্যটি কখনই লক্ষ্য করিনি। আমি এটি নিয়ে উদ্বিগ্ন হওয়ার আগে একটি পারফরম্যান্স সমস্যা না হওয়া পর্যন্ত অপেক্ষা করতাম।


নীচে বিনস উত্তরটি দেখুন - কারণ ... এখানে আপনি যা প্রত্যাশা করছেন তা করছে না এবং আপনি যদি এটি ব্যবহার করেন তবে আপনার পক্ষে সমস্ত ধরণের মজা থাকতে পারে। রেকর্ডের জন্য, প্রোটোটাইপ জিনিস আছে অধিকার উপায়।
marcus.greasly

4

সঙ্গে (myArray আমি Var) জন্য আপনি বস্তুর উপর লুপ খুব, করতে আমি কী নাম থাকতে হবে এবং আপনি মাধ্যমে সম্পত্তি অ্যাক্সেস করতে পারেন myArray [আমি] । সংযোজনীয়ভাবে, আপনি যে কোনও পদ্ধতিতে অবজেক্টে যুক্ত করবেন সেটি লুপের মধ্যেও অন্তর্ভুক্ত থাকবে, অর্থাত্, আপনি যদি জিক্যুয়ারি বা প্রোটোটাইপের মতো কোনও বাহ্যিক কাঠামো ব্যবহার করেন, বা আপনি যদি সরাসরি প্রোটোটাইপগুলিকে অবজেক্ট করার জন্য পদ্ধতি যুক্ত করেন তবে এক পর্যায়ে আমি নির্দেশ করব এই পদ্ধতিগুলি।


4

সতর্ক থেকো!

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

https://developer.mozilla.org/en/DOM/HTMLCollection

যদি আপনি (আপনার তালিকার ক্ষেত্রে আমি এর জন্য) ভবিষ্যদ্বাণী বিবরণটি ব্যবহার করেন তবে এটি বেশিরভাগ ব্রাউজারে এইচটিএমএল সংগ্রহের পদ্ধতি এবং পদ্ধতিগুলি ফিরিয়ে দেবে!

var scriptTags = document.getElementsByTagName("script");

for(var i = 0; i < scriptTags.length; i++)
alert(i); // Will print all your elements index (you can get src attribute value using scriptTags[i].attributes[0].value)

for(var i in scriptTags)
alert(i); // Will print "length", "item" and "namedItem" in addition to your elements!

এমনকি যদি এলিমেটস বাইট্যাগনাম কোনও নোডলিস্ট ফিরিয়ে দেয় তবে বেশিরভাগ ব্রাউজার একটি এইচটিএমএল সংগ্রহ সংগ্রহ করছে: https://developer.mozilla.org/en/DOM/docament.getElementsByTagName


3

অ্যারেগুলিতে লুপগুলি প্রোটোটাইপের সাথে সামঞ্জস্যপূর্ণ নয়। যদি আপনি ভাবেন যে ভবিষ্যতে আপনার সেই লাইব্রেরিটি ব্যবহার করার প্রয়োজন হতে পারে তবে লুপগুলি আটকে রাখা অর্থপূর্ণ হবে।

http://www.prototypejs.org/api/array


"আপনার সেই লাইব্রেরিটি ব্যবহার করার প্রয়োজন হতে পারে" ভুলে যান। পরিবর্তে চিন্তা করুন "আপনার জেএস সম্ভবত সেই লাইব্রেরি ব্যবহার করে এমন অন্য কোনও কিছুর সাথে অন্তর্ভুক্ত করা যেতে পারে ", কারণ সমস্যাগুলি এখনও রয়েছে।
আইজডাব্লু

3

আমি "প্রত্যেকের জন্য" অবজেক্টস এবং প্রোটোটাইপ এবং অ্যারে ব্যবহার করে সমস্যাগুলি দেখেছি

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


3

আপনি যদি সত্যিই আপনার কোডটি দ্রুত করতে চান তবে তার কী হবে?

for( var i=0,j=null; j=array[i++]; foo(j) );

এটি বিবৃতিতে কিছুটা যুক্তি রাখার মতো বিষয় এবং এটি কম অপ্রয়োজনীয়। এছাড়াও ফায়ারফক্সে অ্যারে.ফোরএচ এবং অ্যারে.ফিল্টার রয়েছে


2
কেন এটি আপনার কোডটি গতি বাড়িয়ে তুলবে? আমি দেখতে পাচ্ছি না কেন এরকম বিবৃতি রেকর্ডিংয়ের ফলে এটি দ্রুত হয়।
রুপ

3

Jsperf অনুযায়ী একটি খাটো এবং সেরা কোড

keys  = Object.keys(obj);
for (var i = keys.length; i--;){
   value = obj[keys[i]];// or other action
}

1

সমান্তরালতার সুবিধা নিতে প্রতিটি লুপের জন্য অ্যারে () ব্যবহার করুন


4
ব্রাউজারে জাভাস্ক্রিপ্ট ইভেন্ট লুপ সমবর্তী তাই Array.prototype.forEachসমান্তরালে কলব্যাকে একাধিক কল কার্যকর করবে না।
মাইক স্যামুয়েল

1

(;;) এর জন্য অ্যারে : [20,55,33]

for..in অবজেক্টের জন্য : {x: 20, y: 55: z: 33}


0

সাবধান হও!!! আমি ম্যাক ওএসে ক্রোম 22.0 ব্যবহার করছি এবং প্রতিটি সিনট্যাক্সের জন্য আমার সমস্যা হচ্ছে।

আমি জানি না এটি ব্রাউজারের সমস্যা, জাভাস্ক্রিপ্ট ইস্যু বা কোডটিতে কিছু ত্রুটি, তবে এটি খুব আশ্চর্যের। বস্তুর বাইরে এটি নিখুঁতভাবে কাজ করে।

var MyTest = {
    a:string = "a",
    b:string = "b"
};

myfunction = function(dicts) {
    for (var dict in dicts) {
        alert(dict);
        alert(typeof dict); // print 'string' (incorrect)
    }

    for (var i = 0; i < dicts.length; i++) {
        alert(dicts[i]);
        alert(typeof dicts[i]); // print 'object' (correct, it must be {abc: "xyz"})
    }
};

MyObj = function() {
    this.aaa = function() {
        myfunction([MyTest]);
    };
};
new MyObj().aaa(); // This does not work

myfunction([MyTest]); // This works

0

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

for (var i = 0; i < myArray.length; i++) { 
    console.log(i) 
}

//Output
0
1

for (var i in myArray) { 
    console.log(i) 
} 

// Output
0 
1 
remove

আপনি একটি সঙ্গে জন্য ইন ব্যবহার করতে পারেন if(myArray.hasOwnProperty(i))। তবুও, অ্যারেগুলিতে পুনরাবৃত্তি করার সময় আমি সর্বদা এটি এড়াতে পছন্দ করি এবং কেবল (;;) বিবৃতি ব্যবহার করি।


0

যদিও তারা উভয়ই অনেক বেশি একত্রে সামান্য পার্থক্য:

var array = ["a", "b", "c"];
array["abc"] = 123;
console.log("Standard for loop:");
for (var index = 0; index < array.length; index++)
{
  console.log(" array[" + index + "] = " + array[index]); //Standard for loop
}

এই ক্ষেত্রে আউটপুট হয়:

লুপের জন্য স্ট্যান্ডার্ড:

আগমন [0] = এ

আগমন [1] = খ

আগমন [2] = গ

console.log("For-in loop:");
for (var key in array)
{
  console.log(" array[" + key + "] = " + array[key]); //For-in loop output
}

যখন এই ক্ষেত্রে আউটপুট হয়:

লুপের জন্য:

আগমন [1] = খ

আগমন [2] = গ

আগমন [10] = ডি

প্রবেশ করুন [এবিসি] = 123


0

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

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