টি এল; ডিআর
তবে অন্বেষণ করার, পড়ার মতো আরও অনেক কিছুই আছে ...
জাভা স্ক্রিপ্টে অ্যারে এবং অ্যারের মতো অবজেক্টগুলির মাধ্যমে লুপিংয়ের জন্য শক্তিশালী শব্দার্থক শব্দ রয়েছে। আমি উত্তরটি দুটি ভাগে বিভক্ত করেছি: খাঁটি অ্যারেগুলির জন্য বিকল্পগুলি এবং ঠিক এমন অ্যারেগুলির মতো বিকল্পগুলির জন্য বিকল্পগুলি , যেমন argumentsবস্তু, অন্যান্য পুনরাবৃত্ত বস্তু (ES2015 +), ডোম সংগ্রহ এবং আরও অনেক কিছু on
আমি তাড়াতাড়ি করে মনে রাখবেন আপনি ES2015 অপশন ব্যবহার করতে পারেন করব এখন , এমনকি ES5 ইঞ্জিনের উপর দ্বারা transpiling ES5 করার ES2015। "ES2015 ট্রান্সপ্লিং" / "ES6 ট্রান্সপ্লাইং" আরও জন্য অনুসন্ধান করুন ...
ঠিক আছে, আসুন আমাদের বিকল্পগুলি দেখুন:
প্রকৃত অ্যারেগুলির জন্য
আপনার ECMAScript 5 ("ES5") এ তিনটি বিকল্প রয়েছে , সংস্করণটি এই মুহূর্তে সর্বাধিক বিস্তৃতভাবে সমর্থিত এবং ECMAScript 2015 ("ES2015", "ES6") এ আরও দুটি যুক্ত হয়েছে :
- ব্যবহার
forEachএবং সম্পর্কিত (ES5 +)
- একটি সাধারণ
forলুপ ব্যবহার করুন
- সঠিকভাবে ব্যবহার করুন
for-in
- ব্যবহার করুন
for-of(স্পষ্টভাবে একটি পুনরুক্তি ব্যবহার করুন ) (ES2015 +)
- একটি পুনরাবৃত্তি স্পষ্টভাবে ব্যবহার করুন (ES2015 +)
বিবরণ:
1. ব্যবহার forEachএবং সম্পর্কিত
যে কোনও অস্পষ্ট-আধুনিক পরিবেশে (সুতরাং, IE8 নয়) যেখানে আপনার ArrayES5 (সরাসরি বা পলিফিল ব্যবহার করে) যুক্ত বৈশিষ্ট্যগুলিতে অ্যাক্সেস রয়েছে, আপনি forEach( spec| MDN) ব্যবহার করতে পারেন :
var a = ["a", "b", "c"];
a.forEach(function(entry) {
console.log(entry);
});
forEachএকটি কলব্যাক ফাংশন গ্রহণ করে এবং allyচ্ছিকভাবে, thisসেই কলব্যাকটি কল করার সময় ব্যবহার করার মতো একটি মান (উপরে ব্যবহৃত হয় না)। অ্যারেতে প্রতিটি প্রবেশের জন্য কলব্যাক কল করা হয় যাতে ক্রমবর্ধমান অ্যারেগুলিতে অস্তিত্বহীন এন্ট্রিগুলি এড়ানো যায়। যদিও আমি কেবল উপরে একটি যুক্তি ব্যবহার করেছি, কলব্যাকটি তিনটি দিয়ে কল করা হয়েছে: প্রতিটি প্রবেশের মান, সেই প্রবেশের সূচক এবং আপনি যে অ্যারেটির উপরে পুনরাবৃত্তি করছেন তার একটি রেফারেন্স (যদি আপনার ফাংশনটি ইতিমধ্যে কার্যকর না হয় তবে) )।
আপনি যদি IE8 এর মতো অপ্রচলিত ব্রাউজারগুলিকে সমর্থন না করেন (যা নেট অ্যাপস সেপ্টেম্বর ২০১ in-এ এই লেখার হিসাবে 4% এর বেশি বাজার ভাগ দেখায়), আপনি খুশিতে forEachশিম ছাড়াই সাধারণ উদ্দেশ্যে ওয়েব পৃষ্ঠায় ব্যবহার করতে পারেন । যদি আপনার অপ্রচলিত ব্রাউজারগুলিকে সমর্থন করার প্রয়োজন হয় তবে শিমিং / পলফিলিং forEachসহজেই হয়ে যায় (বেশ কয়েকটি বিকল্পের জন্য "এসএস শিম" অনুসন্ধান করুন)।
forEach আপনার এই সুবিধাটি রয়েছে যে আপনাকে ইনডেক্সিং এবং মান ভেরিয়েবলগুলি সমাহারযোগ্য স্কোপ হিসাবে ঘোষণা করতে হবে না কারণ এগুলি পুনরাবৃত্তি ফাংশনে আর্গুমেন্ট হিসাবে সরবরাহ করা হয় এবং কেবলমাত্র সেই পুনরাবৃত্তিতে খুব সুন্দরভাবে স্কোপ করা হয়।
আপনি যদি প্রতিটি অ্যারে প্রবেশের জন্য একটি ফাংশন কল করার রানটাইম ব্যয় সম্পর্কে উদ্বিগ্ন হন তবে তা হবেন না; বিশদ ।
অতিরিক্তভাবে, forEach"ফাংশনটি তাদের সকলের মাধ্যমেই হয়" তবে ES5 আরও অনেকগুলি দরকারী "অ্যারের মাধ্যমে আপনার পথে কাজ করে কাজগুলি করুন" ফাংশন সংজ্ঞায়িত করে:
every(প্রথমবার কলব্যাক ফিরে আসে falseবা মিথ্যা কিছু বলে লুপিং বন্ধ করে দেয় )
some(প্রথমবার কলব্যাক ফিরে আসে trueবা সত্যবাদী কিছু লুপ করা বন্ধ করে দেয়)
filter(ফিল্টার ফাংশনটি ফিরে আসে trueএবং যেখানে ফিরে আসে সেখানে বাদ দিয়ে এমন উপাদানগুলি সহ একটি নতুন অ্যারে তৈরি করে false)
map (কলব্যাক দিয়ে ফিরে আসা মানগুলি থেকে একটি নতুন অ্যারে তৈরি করে)
reduce (বারবার কলব্যাক কল করে, পূর্বের মানগুলিতে পাস করে একটি মান বাড়িয়ে তোলে; বিশদটির জন্য অনুমানটি দেখুন; অ্যারের সামগ্রী এবং অন্যান্য অনেকগুলি সামগ্রীর সংমিশ্রনের জন্য দরকারী)
reduceRight(যেমন reduce, তবে আরোহী ক্রমের পরিবর্তে অবতরণে কাজ করে)
2. একটি সাধারণ forলুপ ব্যবহার করুন
কখনও কখনও পুরানো উপায়গুলি সেরা:
var index;
var a = ["a", "b", "c"];
for (index = 0; index < a.length; ++index) {
console.log(a[index]);
}
অ্যারের দৈর্ঘ্য লুপ সময় পরিবর্তন না হলে, এবং এটি (অসম্ভাব্য) কার্য সম্পাদন সংবেদনশীল কোডে আছে, সামান্য আরো জটিল সংস্করণ সামনে দৈর্ঘ্য দখল একটি হতে পারে অতি ক্ষুদ্র বিট দ্রুততর:
var index, len;
var a = ["a", "b", "c"];
for (index = 0, len = a.length; index < len; ++index) {
console.log(a[index]);
}
এবং / বা পিছনে গণনা:
var index;
var a = ["a", "b", "c"];
for (index = a.length - 1; index >= 0; --index) {
console.log(a[index]);
}
তবে আধুনিক জাভাস্ক্রিপ্ট ইঞ্জিনগুলির সাথে, আপনার শেষের রসটি বের করা খুব বিরল।
ES2015 এবং উচ্চতর ক্ষেত্রে, আপনি আপনার সূচক এবং মান ভেরিয়েবলগুলি forলুপে স্থানীয় করতে পারেন :
let a = ["a", "b", "c"];
for (let index = 0; index < a.length; ++index) {
let value = a[index];
console.log(index, value);
}
//console.log(index); // would cause "ReferenceError: index is not defined"
//console.log(value); // would cause "ReferenceError: value is not defined"
let a = ["a", "b", "c"];
for (let index = 0; index < a.length; ++index) {
let value = a[index];
console.log(index, value);
}
try {
console.log(index);
} catch (e) {
console.error(e); // "ReferenceError: index is not defined"
}
try {
console.log(value);
} catch (e) {
console.error(e); // "ReferenceError: value is not defined"
}
আর যখন আপনি যে কি, শুধু valueবরং indexপ্রতিটি লুপ পুনরাবৃত্তির জন্য recreated হয়, লুপ শরীরের নির্মিত, যার অর্থ বন্ধ একটি রেফারেন্স রাখতে index(এবং value) যে নির্দিষ্ট পুনরাবৃত্তির তৈরি করা হয়েছে:
let divs = document.querySelectorAll("div");
for (let index = 0; index < divs.length; ++index) {
divs[index].addEventListener('click', e => {
console.log("Index is: " + index);
});
}
let divs = document.querySelectorAll("div");
for (let index = 0; index < divs.length; ++index) {
divs[index].addEventListener('click', e => {
console.log("Index is: " + index);
});
}
<div>zero</div>
<div>one</div>
<div>two</div>
<div>three</div>
<div>four</div>
আপনার যদি পাঁচটি ডিভ থাকে, আপনি যদি প্রথমটি ক্লিক করেন তবে "সূচকটি হ'ল: 0" এবং আপনি সর্বশেষে ক্লিক করলে "সূচকটি হ'ল: 4" পাবেন। আপনি যদি এর পরিবর্তে ব্যবহার করেন তবে এটি কাজ করে না ।varlet
৩. সঠিকভাবে ব্যবহার করুনfor-in
লোকেরা আপনাকে ব্যবহার করতে বলবে for-in, তবে এটি সেটির for-inজন্য নয় । for-inমাধ্যমে loops একটি বস্তুর গণনীয় বৈশিষ্ট্য , না একটি অ্যারের ইনডেক্স। অর্ডার গ্যারান্টিযুক্ত নয়, এমনকি ES2015 (ES6) এও নয়। ES2015 অবজেক্ট বৈশিষ্ট্য একটি আদেশ সংজ্ঞায়িত করে (মাধ্যমে [[OwnPropertyKeys]], [[Enumerate]]ও যার অস্তিত্ব তাদের ব্যবহার পছন্দ Object.getOwnPropertyKeys), কিন্তু এটি সংজ্ঞায়িত না যে for-in, যাতে অনুসরণ করবে; যদিও ES2020 করেছে। ( এই অন্যান্য উত্তরে বিশদ ।)
for-inঅ্যারেতে কেবল আসল ব্যবহারের ক্ষেত্রে হ'ল:
- এটা একটা ব্যাপার বিক্ষিপ্ত অ্যারে সঙ্গে বৃহদায়তন , এটা ফাঁক বা
- আপনি অ-উপাদান উপাদান ব্যবহার করছেন এবং আপনি এগুলিকে লুপে অন্তর্ভুক্ত করতে চান
কেবলমাত্র সেই প্রথম উদাহরণটির দিকে তাকানো: আপনি for-inযদি যথাযথ সুরক্ষার ব্যবস্থা ব্যবহার করেন তবে আপনি সেই বিচ্ছুরিত অ্যারে উপাদানগুলি ঘুরে দেখার জন্য ব্যবহার করতে পারেন :
// `a` is a sparse array
var key;
var a = [];
a[0] = "a";
a[10] = "b";
a[10000] = "c";
for (key in a) {
if (a.hasOwnProperty(key) && // These checks are
/^0$|^[1-9]\d*$/.test(key) && // explained
key <= 4294967294 // below
) {
console.log(a[key]);
}
}
তিনটি চেক নোট করুন:
যে নামটির সাথে ওই বস্তুর নিজস্ব সম্পত্তি রয়েছে (এটি তার প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নয়) এবং
যে কীটি হ'ল দশমিক সংখ্যা (যেমন, স্বাভাবিক স্ট্রিং ফর্ম, বৈজ্ঞানিক স্বরলিপি নয়) এবং
যে কোনও সংখ্যায় জোর করা হলে কীটির মান <= 2 ^ 32 - 2 (যা 4,294,967,294)। এই সংখ্যাটি কোথা থেকে আসে? এটি স্পেসিফিকেশনে একটি অ্যারে সূচকের সংজ্ঞাটির অংশ । অন্যান্য সংখ্যা (অ-পূর্ণসংখ্যার, নেতিবাচক সংখ্যা, 2 ^ 32 - 2 এর চেয়ে বেশি সংখ্যার) অ্যারে সূচকগুলি নয়। এটি 2 ^ 32 - 2 এর কারণটি হ'ল এটিই সর্বোচ্চ সূচক মানকে 2 ^ 32 - 1 এর চেয়ে কম করে তোলে, এটি অ্যারেরের সর্বোচ্চ মূল্য lengthহতে পারে। (উদাহরণস্বরূপ, একটি অ্যারের দৈর্ঘ্য 32-বিট স্বাক্ষরবিহীন পূর্ণ পূর্ণসংখ্যায় ফিট করে)) ( আমার ব্লগ পোস্টে আমার আগের পরীক্ষাটি বেশ সঠিক ছিল না এমন মন্তব্যে ইঙ্গিত করার জন্য রবকে প্রপস করে ))
আপনি অবশ্যই ইনলাইন কোডে এটি করবেন না। আপনি একটি ইউটিলিটি ফাংশন লিখতে চাই। সম্ভবত:
// Utility function for antiquated environments without `forEach`
var hasOwn = Object.prototype.hasOwnProperty;
var rexNum = /^0$|^[1-9]\d*$/;
function sparseEach(array, callback, thisArg) {
var index;
for (var key in array) {
index = +key;
if (hasOwn.call(a, key) &&
rexNum.test(key) &&
index <= 4294967294
) {
callback.call(thisArg, array[key], index, array);
}
}
}
var a = [];
a[5] = "five";
a[10] = "ten";
a[100000] = "one hundred thousand";
a.b = "bee";
sparseEach(a, function(value, index) {
console.log("Value at " + index + " is " + value);
});
4. ব্যবহার করুন for-of(স্পষ্টভাবে একটি পুনরুক্তি ব্যবহার করুন ) (ES2015 +)
ES2015 যোগ iterators জাভাস্ক্রিপ্ট করতে। পুনরুক্তিকারীদের ব্যবহারের সহজতম উপায় হ'ল নতুন for-ofবিবৃতি। দেখে মনে হচ্ছে:
const a = ["a", "b", "c"];
for (const val of a) {
console.log(val);
}
কভারগুলির নীচে, এটি অ্যারে থেকে একটি পুনরুক্তি পেতে পারে এবং এর মধ্য দিয়ে লুপ করে, এটি থেকে মানগুলি পাবে। এটি ব্যবহার করে for-inএমন সমস্যা নেই যেহেতু এটি অবজেক্ট (অ্যারে) দ্বারা সংজ্ঞায়িত একটি পুনরুক্তি ব্যবহার করে এবং অ্যারেগুলি সংজ্ঞায়িত করে যে তাদের পুনরাবৃত্তিগুলি তাদের এন্ট্রিগুলির মাধ্যমে পুনরাবৃত্তি করে (তাদের বৈশিষ্ট্য নয়)। for-inইএস 5 এর বিপরীতে , প্রবেশাগুলি যে ক্রমটিতে প্রবেশ করা হয় তা হ'ল তাদের সূচকের সংখ্যার ক্রম order
5. একটি পুনরাবৃত্তি স্পষ্টভাবে ব্যবহার করুন (ES2015 +)
কখনও কখনও, আপনি একটি পুনরাবৃত্তি স্পষ্টভাবে ব্যবহার করতে চাইতে পারেন । আপনি এটি করতেও পারেন, যদিও এটি এর চেয়ে অনেক ক্লানকিয়ার for-of। দেখে মনে হচ্ছে:
const a = ["a", "b", "c"];
const it = a.values();
let entry;
while (!(entry = it.next()).done) {
console.log(entry.value);
}
পুনরুক্তি একটি স্পেসিফিকেশন মধ্যে Iterator সংজ্ঞা মেলে একটি বস্তু। আপনি যতবার কল করবেন এর nextপদ্ধতিটি নতুন ফলাফলের বস্তুটি ফেরত দেয়। ফলাফল অবজেক্টটির একটি সম্পত্তি রয়েছে, doneএটি আমাদের হয়ে গেছে কিনা তা valueজানিয়ে দেয় এবং সেই পুনরাবৃত্তির মান সহ একটি সম্পত্তি রয়েছে। ( doneএটি যদি হয় তবে এটি alচ্ছিক false, valueএটি যদি ifচ্ছিক হয় undefined))
valueপুনরুক্তির উপর নির্ভর করে এর অর্থ পরিবর্তিত হয়; অ্যারে সমর্থন করে (কমপক্ষে) তিনটি ফাংশন যা পুনরাবৃত্তিকারীদের ফিরিয়ে দেয়:
values(): এটি আমি উপরে ব্যবহার করেছি। এটি একটি পুনরুক্তিকারীর যেখানে প্রতিটি ফেরৎ valueযে পুনরাবৃত্তির জন্য অ্যারের এন্ট্রি ( "a", "b", এবং "c"উদাহরণ আগের মধ্যে)।
keys(): রিটার্নস কোনো ইটারেটরে যেখানে প্রতিটি valueযে পুনরাবৃত্তির জন্য চাবিকাঠি (তাই আমাদের জন্য aউপরে, যে হবে "0", তারপর "1", তারপর "2")।
entries(): valueএমন একটি [key, value]পুনরাবৃত্তি প্রদান করে যেখানে প্রতিটি সেই পুনরাবৃত্তির জন্য ফর্মের একটি অ্যারে is
অ্যারে-লাইক অবজেক্টের জন্য
সত্যিকারের অ্যারেগুলি বাদে, অ্যারের মতো বস্তুগুলিও lengthরয়েছে যাগুলির একটি সংখ্যা এবং সংখ্যার নাম সহ বৈশিষ্ট্য রয়েছে: NodeListউদাহরণস্বরূপ, argumentsবস্তু ইত্যাদি we আমরা কীভাবে তাদের সামগ্রীগুলি লুপ করব?
অ্যারেগুলির জন্য উপরের যে কোনও বিকল্প ব্যবহার করুন
উপরের অ্যারে পদ্ধতির মধ্যে কমপক্ষে কয়েকটি এবং সম্ভবত বেশিরভাগ বা সমস্ত কিছু অ্যারে-জাতীয় বস্তুগুলিতে প্রায়শই সমানভাবে ভাল প্রয়োগ করা হয়:
ব্যবহার forEachএবং সম্পর্কিত (ES5 +)
উপরের বিভিন্ন ফাংশনগুলি Array.prototype"ইচ্ছাকৃত জেনেরিক" এবং সাধারণত Function#callবা এর মাধ্যমে অ্যারের মতো বস্তুগুলিতে ব্যবহার করা যেতে পারে Function#apply। ( এই উত্তরের শেষে হোস্ট-সরবরাহিত বস্তুর জন্য গুহাটি দেখুন , তবে এটি একটি বিরল বিষয়))
আপনি ব্যবহার করতে চেয়েছিলেন ধরুন forEachএকটি উপর Node'র childNodesসম্পত্তি। আপনি এটি করবেন:
Array.prototype.forEach.call(node.childNodes, function(child) {
// Do something with `child`
});
আপনি যদি এটি অনেক কিছু করতে চলেছেন তবে আপনি ফাংশন রেফারেন্সের একটি অনুলিপি পুনঃব্যবহারের জন্য একটি ভেরিয়েবলের মধ্যে নিতে পারেন, যেমন:
// (This is all presumably in some scoping function)
var forEach = Array.prototype.forEach;
// Then later...
forEach.call(node.childNodes, function(child) {
// Do something with `child`
});
একটি সাধারণ forলুপ ব্যবহার করুন
স্পষ্টতই, সরল forলুপটি অ্যারের মতো অবজেক্টগুলিতে প্রযোজ্য।
সঠিকভাবে ব্যবহার করুনfor-in
for-inঅ্যারের মতো একই সুরক্ষার সাথে অ্যারের মতো বস্তুগুলির সাথেও কাজ করা উচিত; উপরে # 1 এ হোস্ট-সরবরাহিত সামগ্রীর জন্য সতর্কবার্তা প্রয়োগ হতে পারে।
ব্যবহার করুন for-of(স্পষ্টভাবে একটি পুনরুক্তি ব্যবহার করুন ) (ES2015 +)
for-ofঅবজেক্ট দ্বারা সরবরাহিত পুনরুক্তি ব্যবহার করে (যদি থাকে)। এতে হোস্ট-সরবরাহিত অবজেক্টগুলি অন্তর্ভুক্ত রয়েছে। উদাহরণস্বরূপ, জন্য স্পেসিফিকেশন NodeListথেকে querySelectorAllপুনরাবৃত্তির সমর্থন করার জন্য আপডেট করা হয়েছে। জন্য বৈশিষ্ট HTMLCollectionথেকে getElementsByTagNameছিল না।
একটি পুনরাবৃত্তি স্পষ্টভাবে ব্যবহার করুন (ES2015 +)
# 4 দেখুন।
একটি সত্য অ্যারে তৈরি করুন
অন্য সময়, আপনি কোনও অ্যারের মতো অবজেক্টটিকে সত্য অ্যারে রূপান্তর করতে চাইতে পারেন। এটি করা আশ্চর্যজনকভাবে সহজ:
sliceঅ্যারে পদ্ধতিটি ব্যবহার করুন
আমরা sliceঅ্যারে পদ্ধতিটি ব্যবহার করতে পারি , যা উপরে উল্লিখিত অন্যান্য পদ্ধতির মতো "ইচ্ছাকৃত জেনেরিক" এবং তাই অ্যারের মতো বস্তুগুলির সাথে এটি ব্যবহার করা যেতে পারে:
var trueArray = Array.prototype.slice.call(arrayLikeObject);
সুতরাং উদাহরণস্বরূপ, আমরা যদি NodeListএকটি সত্য অ্যারে রূপান্তর করতে চান , আমরা এটি করতে পারে:
var divs = Array.prototype.slice.call(document.querySelectorAll("div"));
দেখুন হোস্ট-প্রদান করা অবজেক্টের জন্য সতর্কীকরণ নিচে। বিশেষত, নোট করুন যে এটি আইই 8 এবং এর আগে ব্যর্থ হবে, যা আপনাকে হোস্ট-সরবরাহিত অবজেক্টগুলিকে এর মতো ব্যবহার করতে দেয় না this।
স্প্রেড সিনট্যাক্স ব্যবহার করুন ( ...)
এই বৈশিষ্ট্যটি সমর্থন করে এমন জাভাস্ক্রিপ্ট ইঞ্জিনগুলির সাথে ES2015 এর স্প্রেড সিনট্যাক্স ব্যবহার করাও সম্ভব । যেমন for-of, এটি অবজেক্ট দ্বারা সরবরাহিত পুনরুক্তি ব্যবহার করে (পূর্ববর্তী বিভাগে # 4 দেখুন):
var trueArray = [...iterableObject];
সুতরাং উদাহরণস্বরূপ, আমরা যদি NodeListএকটি সত্য অ্যারে রূপান্তর করতে চান , স্প্রেড সিনট্যাক্স সহ এটি যথেষ্ট সংযোগযুক্ত হয়:
var divs = [...document.querySelectorAll("div")];
ব্যবহার Array.from
Array.from (spec) | (MDN) (ES2015 +, তবে সহজেই পলিফিল্ড) একটি অ্যারের মতো অবজেক্ট থেকে একটি অ্যারে তৈরি করে optionচ্ছিকভাবে প্রথমে ম্যাপিং ফাংশনটির মাধ্যমে এন্ট্রিগুলি পাস করে। তাই:
var divs = Array.from(document.querySelectorAll("div"));
অথবা যদি আপনি প্রদত্ত শ্রেণীর সাথে উপাদানগুলির ট্যাগ নামের একটি অ্যারে পেতে চান, আপনি ম্যাপিং ফাংশনটি ব্যবহার করতে পারবেন:
// Arrow function (ES2015):
var divs = Array.from(document.querySelectorAll(".some-class"), element => element.tagName);
// Standard function (since `Array.from` can be shimmed):
var divs = Array.from(document.querySelectorAll(".some-class"), function(element) {
return element.tagName;
});
হোস্ট-সরবরাহিত অবজেক্টের জন্য ক্যাভেট
আপনি যদি হোস্ট-সরবরাহিত অ্যারে-জাতীয় বস্তুগুলির Array.prototypeসাথে ফাংশন ব্যবহার করেন (জাভাস্ক্রিপ্ট ইঞ্জিনের পরিবর্তে ব্রাউজারের সরবরাহিত ডিওএম তালিকা এবং অন্যান্য জিনিস), হোস্ট-সরবরাহিত বস্তুটি সঠিকভাবে আচরণ করে তা নিশ্চিত করার জন্য আপনার লক্ষ্য পরিবেশে পরীক্ষা করা নিশ্চিত হওয়া দরকার । বেশিরভাগই সঠিকভাবে আচরণ করে (এখন) তবে এটি পরীক্ষা করা গুরুত্বপূর্ণ। কারণটি হ'ল আপনি যে পদ্ধতিগুলি সম্ভবত ব্যবহার করতে চান সেগুলি বেশিরভাগ বিমূর্ত ক্রিয়াকলাপের একটি সৎ উত্তর দেওয়ার জন্য হোস্ট-সরবরাহিত বস্তুর উপর নির্ভর করে । এই লেখার হিসাবে, ব্রাউজারগুলি এটির একটি খুব ভাল কাজ করে তবে 5.1 বৈশিষ্টটি কোনও হোস্ট-সরবরাহিত বস্তুটি সততা না হওয়ার সম্ভাবনার পক্ষে অনুমতি দেয়। এটি §8.6.2 এর মধ্যে রয়েছে , বিভাগটির শুরুতে বড় টেবিলের নীচে বেশ কয়েকটি অনুচ্ছেদ), যেখানে এটি বলে:Array.prototype[[HasProperty]]
হোস্ট অবজেক্টগুলি অন্য কোনওভাবে নির্দিষ্ট না করে কোনওভাবেই এই অভ্যন্তরীণ পদ্ধতিগুলি প্রয়োগ করতে পারে; উদাহরণস্বরূপ, একটি সম্ভাবনা হ'ল [[Get]]এবং [[Put]]কোনও নির্দিষ্ট হোস্ট অবজেক্টের জন্য প্রকৃতপক্ষে সম্পত্তি মানগুলি সংগ্রহ এবং সঞ্চয় করা কিন্তু [[HasProperty]]সর্বদা মিথ্যা উত্পন্ন করে ।
(আমি ES2015 বৈশিষ্ট মধ্যে সমতুল্য শব্দবাহুল্য খুঁজে পাইনি, কিন্তু এটি এখনও মামলা হতে আবদ্ধ।) আবার, এই হিসাবে সাধারণ হোস্ট প্রদত্ত [আধুনিক ব্রাউজারে বস্তু অ্যারের মত লেখা NodeListউদাহরণস্বরূপ দৃষ্টান্ত,] কি হ্যান্ডেল [[HasProperty]]সঠিকভাবে, তবে এটি পরীক্ষা করা গুরুত্বপূর্ণ।)
forEachএবং ঠিক নয়for। যেমনটি বলা হয়েছে, সি # তে এটি কিছুটা আলাদা ছিল এবং এটি আমাকে বিভ্রান্ত করেছিল :)