एक प्राप्य संपत्ति वह है जिसे for..in
लूप के दौरान शामिल किया जा सकता है (या गुणों का एक समान पुनरावृत्ति, जैसे Object.keys()
)।
यदि किसी संपत्ति की पहचान योग्य नहीं है, तो लूप इस बात को नजरअंदाज कर देगा कि यह वस्तु के भीतर है।
var obj = { key: 'val' };
console.log('toString' in obj); // true
console.log(typeof obj.toString); // "function"
for (var key in obj)
console.log(key); // "key"
किसी गुण की पहचान उसके [[Enumerable]]
गुण के आधार पर की जाती है या नहीं । आप इसे संपत्ति के विवरणक के भाग के रूप में देख सकते हैं :
var descriptor = Object.getOwnPropertyDescriptor({ bar: 1 }, 'bar');
console.log(descriptor.enumerable); // true
console.log(descriptor.value); // 1
console.log(descriptor);
// { value: 1, writable: true, enumerable: true, configurable: true }
एक for..in
लूप तब ऑब्जेक्ट के प्रॉपर्टी नामों के माध्यम से प्रसारित होता है।
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
लेकिन, केवल उसके बयान का मूल्यांकन करता है - console.log(prop);
इस मामले में - उन गुणों के लिए जिनकी [[Enumerable]]
विशेषता है true
।
यह स्थिति इसलिए है क्योंकि वस्तुओं में कई गुण हैं , विशेषकर विरासत से :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
इनमें से प्रत्येक गुण अभी भी वस्तु पर मौजूद है :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
लेकिन, वे for..in
लूप द्वारा छोड़े गए हैं क्योंकि वे असंख्य नहीं हैं।
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
करता है?