জাভাস্ক্রিপ্টের মধ্যে Object.getOwnPropertyNamesএবং এর মধ্যে পার্থক্য কী Object.keys? এছাড়াও কিছু উদাহরণ প্রশংসা করা হবে।
জাভাস্ক্রিপ্টের মধ্যে Object.getOwnPropertyNamesএবং এর মধ্যে পার্থক্য কী Object.keys? এছাড়াও কিছু উদাহরণ প্রশংসা করা হবে।
উত্তর:
একটু পার্থক্য আছে। Object.getOwnPropertyNames(a)ফেরৎ সব বস্তুর নিজের বৈশিষ্ট্য a। Object.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ফাংশনটি কাজ করে না তবে আমি এটি ক্যাট 2 টাইপের বস্তুগুলি দিই।
অবজেক্ট তৈরির অন্যান্য উপায় রয়েছে যাতে সেখানে অন্যান্য কিঙ্কসও থাকতে পারে।
Object.getOwnPropertyNamesসম্পত্তি নামগুলি cat1এবং না ফেরত দেবে 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()করে।