जावास्क्रिप्ट में Object.getOwnPropertyNamesऔर क्या अंतर है Object.keys? इसके अलावा कुछ उदाहरणों की सराहना की जाएगी।
जावास्क्रिप्ट में Object.getOwnPropertyNamesऔर क्या अंतर है Object.keys? इसके अलावा कुछ उदाहरणों की सराहना की जाएगी।
जवाबों:
थोड़ा अंतर है। वस्तु के सभी गुणों को Object.getOwnPropertyNames(a)लौटाता है । सभी प्राप्य स्वयं के गुणों को लौटाता है । इसका अर्थ है कि यदि आप उनमें से कुछ को बनाए बिना अपनी वस्तु गुणों को परिभाषित करते हैं, तो ये दो विधियां आपको एक ही परिणाम देंगी।aObject.keys(a)enumerable: false
यह परीक्षण करना आसान है:
var a = {};
Object.defineProperties(a, {
one: {enumerable: true, value: 'one'},
two: {enumerable: false, value: 'two'},
});
Object.keys(a); // ["one"]
Object.getOwnPropertyNames(a); // ["one", "two"]
यदि आप संपत्ति गुण वर्णनकर्ता प्रदान किए बिना किसी संपत्ति को परिभाषित करते हैं ( Object.definePropertiesउदाहरण के लिए, जिसका आप उपयोग नहीं करते हैं ), उदाहरण के लिए:
a.test = 21;
तब ऐसी संपत्ति स्वचालित रूप से एक पहेली बन जाती है और दोनों विधियाँ एक ही सरणी का उत्पादन करती हैं।
lengthसरणी ऑब्जेक्ट्स के गुण गणना योग्य नहीं हैं, इसलिए यह दिखाई नहीं देता है Object.keys।
lengthवस्तुओं का गुण प्रोटोटाइप पर होता है, न कि वस्तु पर, इसलिए न तो इसे सूचीबद्ध करेगा Object.keysऔर न ही Object.getOwnPropertyNames।
Object.getOwnPropertyNames(anyArray)शामिल हैंlength
Object.getOwnPropertyNames(anyArray)वास्तव lengthमें लौटे सरणी में शामिल है!
ऑब्जेक्ट बनाते समय शाब्दिक संकेतन बनाम कंस्ट्रक्टर। यहाँ कुछ ऐसा है जो मुझे मिला है।
const cat1 = {
eat() {},
sleep() {},
talk() {}
};
// here the methods will be part of the Cat Prototype
class Cat {
eat() {}
sleep() {}
talk() {}
}
const cat2 = new Cat()
Object.keys(cat1) // ["eat", "sleep", "talk"]
Object.keys(Object.getPrototypeOf(cat2)) // []
Object.getOwnPropertyNames(cat1) // ["eat", "sleep", "talk"]
Object.getOwnPropertyNames(Object.getPrototypeOf(cat2)) // ["eat", "sleep", "talk"]
cat1 // {eat: function, sleep: function, talk: function}
cat2 // Cat {}
// a partial of a function that is used to do some magic redeclaration of props
function foo(Obj) {
var propNames = Object.keys(Obj);
// I was missing this if
// if (propNames.length === 0) {
// propNames = Object.getOwnPropertyNames(Obj);
// }
for (var prop in propNames) {
var propName = propNames[prop];
APIObject[propName] = "reasign/redefine or sth";
}
}
तो fooअगर मैं इसे cat2 प्रकार की वस्तुएं देता हूं तो मेरे मामले में यह काम नहीं करता है।
वस्तुओं को बनाने के अन्य तरीके हैं ताकि वहाँ भी अन्य किंक हो सकें।
Object.getOwnPropertyNamescat1और नहीं के लिए संपत्ति के नाम वापस कर देंगे cat2। ऑब्जेक्ट बनाने के दो तरीके Object.getOwnPropertyNamesऔर के बीच अंतर पैदा नहीं करते हैं Object.keys।
जैसा कि पहले ही समझाया जा चुका था, .keysअसंख्य गुणों को वापस नहीं करता है।
उदाहरणों के संबंध में, गड्ढे के मामलों में से एक एक Errorवस्तु है: इसके कुछ गुण हैं।
इसलिए console.log(Object.keys(new Error('some msg')))उपज देते समय [],
console.log(Object.getOwnPropertyNames(new Error('some msg')))पैदावार["stack", "message"]
console.log(Object.keys(new Error('some msg')));
console.log(Object.getOwnPropertyNames(new Error('some msg')));
एक और अंतर यह है कि (कम से कम नोडज के साथ) "getOwnPropertyNames" फ़ंक्शन कुंजियों के आदेश की गारंटी नहीं देता है, इसलिए मैं आमतौर पर "कुंजियों" फ़ंक्शन का उपयोग करता हूं:
Object.keys(o).forEach(function(k) {
if (!o.propertyIsEnumerable(k)) return;
// do something...
});
getOwnPropertyNamesक्रम में नहीं होने के किसी भी उदाहरण को जानते हैं ? क्योंकि ES2015 के लिए एक आदेशObect.getOwnPropertyNames निर्दिष्ट करता है , जबकि आदेश के लिएObect.keys अभी भी कार्यान्वयन तक है।
for-in loop, Object.keys, और Object.getOwnPropertyNames। उस ने कहा, तीनों एक दूसरे के संबंध में एक सुसंगत क्रम में गणना करेंगे।
Object.keys()उन्हें वापस नहीं करता है, जबकिObject.getOwnPropertyNames()करता है।