আমি এই চেষ্টা করে দেখুন। নোট করুন যে আমি ইসিএমএর সাথে অনুমোদিত নয় এবং তাদের সিদ্ধান্ত গ্রহণের প্রক্রিয়াটির কোনও দৃশ্যমানতা নেই, তাই তারা কেন বা কেন কিছু করেনি তা আমি নিশ্চিতভাবে বলতে পারি না। তবে, আমি আমার অনুমানগুলি বর্ণনা করব এবং আমার সেরা শট নেব।
for...of
প্রথম স্থানটিতে একটি নির্মাণ কেন যুক্ত করবেন ?
জাভাস্ক্রিপ্ট ইতিমধ্যে একটি for...in
নির্মাণ অন্তর্ভুক্ত যা একটি বস্তুর বৈশিষ্ট্য পুনরাবৃত্তি করতে ব্যবহার করা যেতে পারে। যাইহোক, এটি সত্যই কোনও ফর লুপ নয় , কারণ এটি কোনও সামগ্রীর সমস্ত বৈশিষ্ট্যকে গণনা করে এবং কেবল সাধারণ ক্ষেত্রে কেবল অনুমানযোগ্যভাবে কাজ করে।
এটি আরও জটিল ক্ষেত্রে বিভক্ত হয়ে যায় (অ্যারে সহ, যেখানে এর ব্যবহারটি হ'লfor...in
অ্যারে দিয়ে সঠিকভাবে ব্যবহারের জন্য প্রয়োজনীয় সুরক্ষাকারীদের দ্বারা নিরুৎসাহিত করা বা পুঙ্খানুপুঙ্খভাবে বিস্মৃত হয় )। আপনি এটি ব্যবহার করে চারপাশে কাজ করতে পারেনhasOwnProperty
(অন্যান্য জিনিসের মধ্যে) তবে এটি কিছুটা আড়ম্বরপূর্ণ এবং অদৃশ্য।
সুতরাং আমার ধারনাটি হ'ল for...of
কনস্ট্রাক্টটি নির্মাণের সাথে যুক্ত ঘাটতিগুলি সমাধান করার জন্য যুক্ত করা হচ্ছে for...in
এবং জিনিসগুলি পুনরাবৃত্ত করার সময় বৃহত্তর ইউটিলিটি এবং নমনীয়তা সরবরাহ করে। লোকেরা for...in
এমন একটি forEach
লুপ হিসাবে বিবেচনা করে যা সাধারণত যে কোনও সংগ্রহের জন্য প্রয়োগ করা যেতে পারে এবং যে কোনও সম্ভাব্য প্রেক্ষাপটে বুদ্ধিমান ফলাফল আনতে পারে, তবে তা ঘটে না। for...of
লুপ সংশোধন করা হয়েছে যে।
আমি এটিও ধরে নিয়েছি যে বিদ্যমান ES5 কোডটি ES6 এর অধীনে চালিত হওয়া এবং ES5 এর অধীনে একই ফলাফল উত্পন্ন করার জন্য এটি গুরুত্বপূর্ণ, সুতরাং ব্রেকিং পরিবর্তনগুলি করা যায় না, উদাহরণস্বরূপ, আচরণের ক্ষেত্রে for...in
নির্মাণের
2. কিভাবে for...of
কাজ করে?
রেফারেন্স ডকুমেন্টেশন এই অংশের জন্য দরকারী। বিশেষত, কোনও বিষয় বিবেচনা করা হয় iterable
যদি এটি Symbol.iterator
সম্পত্তিটি নির্ধারণ করে considered
সম্পত্তি-সংজ্ঞাটি এমন একটি ফাংশন হওয়া উচিত যা সংগ্রহের আইটেমগুলি একে একে এক করে ফেরত দেয় এবং আরও একটি আইটেম আনতে হবে কিনা তা নির্দেশ করে একটি পতাকা সেট করে। পূর্বনির্ধারিত বাস্তবায়নগুলি কিছু অবজেক্ট-প্রকারের জন্য সরবরাহ করা হয় এবং এটি অপেক্ষাকৃত স্পষ্ট যে for...of
কেবল পুনরাবৃত্তকারী ফাংশনে প্রতিনিধি ব্যবহার করে।
এই পদ্ধতিটি কার্যকর, কারণ এটি আপনার নিজের পুনরাবৃত্তকারীগুলি সরবরাহ করা খুব সোজা করে তোলে। আমি বলতে পারি যে কোনও সম্পত্তি যেখানে আগে ছিল না তা নির্ধারণের উপর নির্ভরতার কারণে পদ্ধতির ব্যবহারিক বিষয়গুলি উপস্থাপন করতে পারত, আমি যা বলতে পারি তা বাদ দিয়ে নতুন সম্পত্তিটি অবশ্যই অবহেলা করা হয় যদি না আপনি ইচ্ছাকৃতভাবে এটি অনুসন্ধান না করেন (যেমন) এটি for...in
কোনও কী হিসাবে লুপগুলিতে উপস্থিত হবে না ইত্যাদি)। সুতরাং যে কেস না।
ব্যবহারিক অ-ইস্যুগুলি বাদ দিয়ে, এটি একটি নতুন পূর্বনির্ধারিত সম্পত্তি দিয়ে সমস্ত অবজেক্টটি শুরু করার জন্য, বা স্পষ্টভাবে বলতে হবে যে "প্রতিটি বস্তু একটি সংগ্রহ"।
৩. কেন অবজেক্টগুলি ডিফল্টরূপে iterable
ব্যবহার করছে না for...of
?
আমার অনুমান যে এটি একটি সংমিশ্রণ:
iterable
ডিফল্টরূপে সমস্ত বস্তু তৈরি করা অগ্রহণযোগ্য বলে বিবেচিত হতে পারে কারণ এটি এমন একটি সম্পত্তি যুক্ত করে যেখানে আগে ছিল না, বা কোনও বস্তু (প্রয়োজনীয়ভাবে) সংগ্রহ নয়। যেমন ফেলিক্স নোট করেছেন, "কোনও ফাংশন বা নিয়মিত এক্সপ্রেশন অবজেক্টের উপর পুনরাবৃত্তি করার অর্থ কী"?
- সরল অবজেক্টগুলি ইতিমধ্যে ব্যবহার করে পুনরাবৃত্তি করা যেতে পারে
for...in
, এবং এটি অন্তর্নির্মিত পুনরুদ্ধারক প্রয়োগটি বিদ্যমান for...in
আচরণের চেয়ে আলাদাভাবে / ভাল কী করতে পারে তা পরিষ্কার নয় । সুতরাং যদি # 1 টি ভুল হয় এবং সম্পত্তি যুক্ত করা গ্রহণযোগ্য ছিল, তবে এটি দরকারী হিসাবে দেখা যায় নি ।
- ব্যবহারকারীরা যাঁর জিনিসগুলি তৈরি
iterable
করতে চান তারা Symbol.iterator
সম্পত্তি সংজ্ঞা দিয়ে সহজেই তা করতে পারেন ।
- ES6 বৈশিষ্ট একটি উপলব্ধ ম্যাপ ধরন, যা হয়
iterable
ডিফল্টরূপে এবং যেমন একটি প্লেইন বস্তুর ব্যবহার কিছু অন্যান্য ছোট সুফল রয়েছে Map
।
রেফারেন্স ডকুমেন্টেশনে # 3 এর জন্য একটি উদাহরণ সরবরাহ করা আছে:
var myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
for (var value of myIterable) {
console.log(value);
}
প্রদত্ত যে অবজেক্টগুলি সহজেই তৈরি করা যায় iterable
, এটি ব্যবহার করে ইতিমধ্যে পুনরাবৃত্তি করা যেতে পারে for...in
এবং কোনও ডিফল্ট অবজেক্টের পুনরাবৃত্তিটি কী করা উচিত তার বিষয়ে স্পষ্ট চুক্তি নেই (এটি যদি করে তবে বোঝায় যে এটি যা কিছু করে তার থেকে আলাদা হবে for...in
), এটি যুক্তিসঙ্গত বলে মনে হয় iterable
ডিফল্টরূপে বস্তুগুলি তৈরি করা হয়নি enough
মনে রাখবেন যে আপনার উদাহরণ কোডটি আবার ব্যবহার করে এটি ব্যবহার করা যেতে পারে for...in
:
for (let levelOneKey in object) {
console.log(levelOneKey);
console.log(object[levelOneKey]);
var levelTwoObj = object[levelOneKey];
for (let levelTwoKey in levelTwoObj ) {
console.log(levelTwoKey);
console.log(levelTwoObj[levelTwoKey]);
}
}
... বা আপনি iterable
নিম্নলিখিত বিষয়গুলির মতো কিছু করে নিজের ইচ্ছাকে নিজের মতো করে তৈরি করতে পারেন (বা পরিবর্তে বরাদ্দ করে আপনি সমস্ত বস্তু তৈরি করতে পারেন ):iterable
Object.prototype[Symbol.iterator]
obj = {
a: '1',
b: { something: 'else' },
c: 4,
d: { nested: { nestedAgain: true }}
};
obj[Symbol.iterator] = function() {
var keys = [];
var ref = this;
for (var key in this) {
keys.push(key);
}
return {
next: function() {
if (this._keys && this._obj && this._index < this._keys.length) {
var key = this._keys[this._index];
this._index++;
return { key: key, value: this._obj[key], done: false };
} else {
return { done: true };
}
},
_index: 0,
_keys: keys,
_obj: ref
};
};
আপনি এটির সাথে এখানে খেলতে পারেন (ক্রোমে, ইজারা নিয়ে): http://jsfiddle.net/rncr3ppz/5/
সম্পাদনা করুন
এবং আপনার আপডেট হওয়া প্রশ্নের জবাবে হ্যাঁ, ES6 iterable
এ স্প্রেড অপারেটরটি ব্যবহার করে একটি অ্যারেতে রূপান্তর করা সম্ভব ।
তবে এটি এখনও ক্রোমে কাজ করছে বলে মনে হয় না, বা কমপক্ষে আমি এটি আমার জেএসফিডেলে কাজ করতে পারি না। তত্ত্বের ক্ষেত্রে এটি এতটা সহজ হওয়া উচিত:
var array = [...myIterable];
Symbol.iterator
সম্পত্তি একটি iterable হয়। সুতরাং আপনি ঠিক যে সম্পত্তি বাস্তবায়ন করতে চাই। কেন বস্তুগুলি পুনরাবৃত্তিযোগ্য নয় তার একটি সম্ভাব্য ব্যাখ্যা হ'ল এটি বোঝাতে পারে যে সমস্ত কিছু পুনরাবৃত্ত ছিল, যেহেতু সবকিছুই একটি বস্তু (অবশ্যই আদিম বাদে)। যাইহোক, কোনও ফাংশন বা নিয়মিত অভিব্যক্তি অবজেক্টের মাধ্যমে পুনরাবৃত্তি করার অর্থ কী?