অবজেক্ট.জেটঅনপ্রনিরনেটস বনাম অবজেক্ট.কিস


213

জাভাস্ক্রিপ্টের মধ্যে Object.getOwnPropertyNamesএবং এর মধ্যে পার্থক্য কী Object.keys? এছাড়াও কিছু উদাহরণ প্রশংসা করা হবে।


3
উভয় বিষয়ে এমডিএন নিবন্ধগুলি বিচার করে, পার্থক্যটি হ'ল, প্রত্যাবর্তিত তালিকায় অগণিত বৈশিষ্ট্য অন্তর্ভুক্ত রয়েছে কিনা: Object.keys()সেগুলি তাদের ফিরিয়ে দেয় না, যখন Object.getOwnPropertyNames()করে।
সিরকো

উত্তর:


289

একটু পার্থক্য আছে। 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;

তারপরে এ জাতীয় সম্পত্তি স্বয়ংক্রিয়ভাবে একটি গণ্য হয়ে যায় এবং উভয় পদ্ধতিই একই অ্যারে উত্পাদন করে।


26
বিশেষত, lengthঅ্যারে অবজেক্টগুলির বৈশিষ্ট্যগুলি গণনীয় নয়, সুতরাং এটি প্রদর্শিত হবে না Object.keys
বর্মার

6
@Barmar lengthবস্তুর সম্পত্তি প্রোটোটাইপ চালু থাকে, তখন বস্তুর নিজেই না, তাই তন্ন তন্ন Object.keysনা Object.getOwnPropertyNamesএটা তালিকা প্রস্তুত করা।
কোডস্মিথ

9
@ দ্য কিউডসেমির ফলাফলের মধ্যে Object.getOwnPropertyNames(anyArray)রয়েছেlength
কাঁটা̈

6
আমি সংশোধন করেছি! প্রত্যাবর্তিত অ্যারে Object.getOwnPropertyNames(anyArray)অন্তর্ভুক্ত lengthনা!
কোডস্মিথ

হ্যাঁ, তবে অ্যারে.প্রোটোটাইপটিও রয়েছে। এটি এক ধরণের অদ্ভুত যে কোনও সাধারণ অ্যারের মতো অ্যারে.প্রোটোটাইপ (যেমন অ্যারে.প্রোটোটাইপ.পুশ ('যাই হোক না কেন')) পরিবর্তন করতে পারে। তবে মনে হয় এটি সদ্য তৈরি হওয়া অ্যারে উদাহরণগুলিতে কোনও প্রভাব ফেলেনি। stackoverflow.com/questions/48020958/...
trollkotze

21

আরেকটি পার্থক্য অ্যারে Object.getOwnPropertyNamesপদ্ধতি ক্ষেত্রে হয় একটি অতিরিক্ত সম্পত্তি যে ফিরে আসবে length

var x = ["a", "b", "c", "d"];
Object.keys(x);  //[ '0', '1', '2', '3' ]
Object.getOwnPropertyNames(x);  //[ '0', '1', '2', '3', 'length' ]

1

অবজেক্ট তৈরি করার সময় লিটারাল নোটেশন বনাম কনস্ট্রাক্টর। এখানে কিছু আছে যা আমাকে পেয়েছে।

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
বোরিক

1
@ বোরিক হ্যাঁ আপনি সঠিক আছেন। আমি কেবল ক্যাট 2 এর পরিবর্তে উভয় পদ্ধতিতে অবজেক্ট.জেটপ্রোটোটাইপফ (ক্যাট 2) ব্যবহার করতে পারি। আমি নিশ্চিত হতে পারি না কারণ আমার মনে নেই এবং কোড নেই। আমি উত্তরে এটি ঠিক করব।
h3dkandi

0

যেমন ইতিমধ্যে ব্যাখ্যা করা হয়েছিল, .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')));


-5

আর একটি পার্থক্য হ'ল (কমপক্ষে নোডেজ সহ) "getOwNPropertyNames" ফাংশন কী ক্রমের গ্যারান্টি দেয় না, এজন্য আমি সাধারণত "কী" ফাংশন ব্যবহার করি:

    Object.keys(o).forEach(function(k) {
      if (!o.propertyIsEnumerable(k)) return;
      // do something...
    });

1
নোড.জেএস এর বর্তমান সংস্করণগুলিতে এখনও কি এটি রয়েছে এবং যদি তাই হয় তবে আপনি কি ক্রমবিহীন কোনও উদাহরণ জানেন getOwnPropertyNames? কারণ ES2015 এর জন্য একটি অর্ডারObect.getOwnPropertyNames নির্দিষ্ট করে , যখন এর জন্য আদেশটিObect.keys এখনও বাস্তবায়ন অবধি।
szupie

7
আমি সবসময় ভেবেছিলাম যে জেএস অবজেক্ট কীগুলির কোনও অর্ডার নেই এবং কোনও বাস্তবায়ন আদেশ রাখে এমনকি আপনার উপর নির্ভর করা উচিত নয়?
হুয়ান মেন্ডিস

1
উম, আমি মনে করি এটি অন্য উপায়ে আছে; getOwNPropertyNames জন্য ক্রম নির্দিষ্ট করা হয়েছে। অবজেক্ট.কিগুলি বাস্তবায়ন পর্যন্ত।
tjvr

1
নিম্নলিখিত সমস্ত অনির্দিষ্ট অর্ডার আছে: for-in loop, Object.keys, এবং Object.getOwnPropertyNames। এটি বলেছিল যে, তিনটিই একে অপরের প্রতি সম্মান রেখে একটি ধারাবাহিক ক্রমে গণনা করবে।
টমাস এডিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.