যদি (অবজেক্টে কী) বা যদি (অবজেক্ট.হসনপ্রন্টি (কী))


173

নিম্নলিখিত দুটি বিবৃতি একই আউটপুট উত্পাদন করে? একটি উপায় অন্য উপায় পছন্দ করার কোন কারণ আছে?

 if (key in object)

 if (object.hasOwnProperty(key))

উত্তর:


181

সাবধান হন - তারা একই ফলাফল উত্পাদন করবে না same

inএছাড়াও ফিরে আসবে trueযদি keyপাওয়া কোথাও পায় প্রোটোটাইপ শৃঙ্খল , যেহেতু Object.hasOwnProperty(যেমন নামটি ইতিমধ্যেই আমাদের বলে), শুধুমাত্র ফিরে আসবে trueযদি keyযে বস্তুর সরাসরি পাওয়া যায় (তার সম্পত্তি "মালিক")।


3
আপনি ঠিক কি বোঝাতে চেয়েছেন in will also return true if key gets found somewhere in the prototype chain। আপনি একটি উদাহরণ লিখতে পারেন? ধন্যবাদ।
লোরেন বার্নার্ড

44
@ লোর: ({foo:"bar"}).hasOwnProperty("toString")বনাম"toString" in ({foo:"bar"})
আমি

68

আমি অন্য একটি উদাহরণ দিয়ে ব্যাখ্যা করার চেষ্টা করব। বলুন যে আমাদের দুটি বৈশিষ্ট্য সহ নিম্নলিখিত বিষয়বস্তু রয়েছে:

function TestObj(){
    this.name = 'Dragon';
}
TestObj.prototype.gender = 'male';

আসুন টেস্টওবিজের উদাহরণ তৈরি করুন:

var o = new TestObj();

আসুন বস্তুর উদাহরণটি পরীক্ষা করা যাক:

console.log(o.hasOwnProperty('name')); // true
console.log('name' in o); // true

console.log(o.hasOwnProperty('gender')); // false
console.log('gender' in o); // true

উপসংহার:

  • অপারেটরটিতে সর্বদা সত্য ফিরে আসে, যদি সম্পত্তিটি সরাসরি বা প্রোটোটাইপ থেকে বস্তুর মাধ্যমে অ্যাক্সেসযোগ্য হয়

  • hasOwnProperty () কেবলমাত্র প্রকৃত প্রত্যাবর্তন করে যদি সম্পত্তি উদাহরণে উপস্থিত থাকে তবে এর প্রোটোটাইপে নয়

আমরা যদি যুক্তিযুক্তভাবে প্রোটোটাইপে কিছু সম্পত্তি বিদ্যমান তা পরীক্ষা করতে চাই তবে আমরা বলব:

console.log(('name' in o) && !o.hasOwnProperty('name')); //false
console.log(('gender' in o) && !o.hasOwnProperty('gender')); //true - it's in prototype

অবশেষে:

সুতরাং, বিবৃতি সম্পর্কিত যে এই দুটি শর্ত ...

if (key in object)
if (object.hasOwnProperty(key))

... একই ফলাফল উত্পাদন, উত্তর সুস্পষ্ট, এটি নির্ভর করে।


28

inউত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তিগুলির জন্যও যাচাই করা হবে যা এর ক্ষেত্রে নয় hasOwnProperty


25

সংক্ষেপে, hasOwnProperty()প্রোটোটাইপটিতে প্রোটোটাইপের দিকে inতাকান না।

ও'রিলি হাই পারফরম্যান্স জাভাস্ক্রিপ্ট থেকে নেওয়া :

HasOwnProperty () পদ্ধতিটি ব্যবহার করে এবং সদস্যের নাম দিয়ে কোনও অবজেক্টের প্রদত্ত নামের সাথে ইনস্ট্যান্স সদস্য রয়েছে কিনা তা আপনি নির্ধারণ করতে পারেন। প্রদত্ত নামের সাথে কোনও বস্তুর কোনও সম্পত্তি অ্যাক্সেস রয়েছে কিনা তা নির্ধারণ করতে আপনি ইন অপারেটরটি ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

var book = {
    title: "High Performance JavaScript",
    publisher: "Yahoo! Press" 
};

alert(book.hasOwnProperty("title"));  //true
alert(book.hasOwnProperty("toString"));  //false
alert("title" in book); //true 
alert("toString" in book); //true

এই কোডটিতে, "শিরোনাম" পাশ করা হলে hasOwNProperty () সত্য হয় কারণ শিরোনাম একটি বস্তুর উদাহরণ; "টু স্ট্রিং" পাস করার সময় পদ্ধতিটি মিথ্যা প্রত্যাবর্তন করে কারণ এটি উপস্থিত নেই। প্রতিটি সম্পত্তি নাম যখন অপারেটরের সাথে ব্যবহার করা হয়, ফলাফল দুটি সময়ই সত্য হয় কারণ এটি উদাহরণ এবং প্রোটোটাইপ অনুসন্ধান করে।


5

আপনি কিছু সত্যিই দুর্দান্ত উত্তর পেয়েছি। আমি কেবল এমন কিছু প্রস্তাব দিতে চাই যা আপনাকে কোনও বস্তুর পুনরাবৃত্তি করার সময় "hasOwnProperty" পরীক্ষা করার প্রয়োজনীয়তা বাঁচায়।

কোনও বস্তু তৈরি করার সময় সাধারণত লোকেরা এটিকে এটি তৈরি করবে:

const someMap = {}
// equivalent to: Object.create(Object.prototype)
// someMap.constructor will yield -> function Object() { [native code] }

এখন, আপনি যদি "কিছু ম্যাপ" এর মাধ্যমে পুনরাবৃত্তি করতে চান তবে আপনাকে এটি এইভাবে করতে হবে:

const key
for(key in someMap ){
 if (someMap.hasOwnProperty(key)) { 
   // Do something
 }
}

উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলির পুনরাবৃত্তি এড়াতে আমরা এটি করছি।

যদি আপনি একটি সাধারণ অবজেক্ট তৈরি করতে চান যা কেবলমাত্র "মানচিত্র" হিসাবে ব্যবহৃত হবে (যেমন কী - মান জোড়া) আপনি এটি করতে পারেন:

const newMap = Object.create(null);
// Now, newMap won't have prototype at all.
// newMap.constructor will yield -> undefined

সুতরাং এখন এটি এর মতো পুনরাবৃত্তি করা নিরাপদ হবে:

for(key in cleanMap){
 console.log(key + " -> " + newMap [key]);
 // No need to add extra checks, as the object will always be clean
}

আমি এই দুর্দান্ত টিপটি এখানে শিখেছি



2

অন্য ফর্ম (যার জন্য আহ্বান জানানো হয়েছে) কোনও বস্তুর সম্পত্তির নাম (বা কীগুলি) গণনা করে। প্রতিটি পুনরাবৃত্তির উপরে, বস্তু থেকে অন্য সম্পত্তি নামের স্ট্রিংটি ভেরিয়েবলকে বরাদ্দ করা হয়। সাধারণত প্রোজোটাইপ চেইনে সম্পত্তিটির নামটি সত্যিকার অর্থে সদস্য কিনা বা পরিবর্তে পাওয়া গিয়েছিল তা নির্ধারণের জন্য অবজেক্ট.হসনপ্রপার্টি (ভেরিয়েবল) পরীক্ষা করা প্রয়োজন।

 for (myvar in obj) {
     if (obj.hasOwnProperty(myvar)) { ... } }

(ক্রকফোর্ডের জাভাস্ক্রিপ্ট থেকে: গুড পার্টস )


5
inঅপারেটর থেকে ভিন্ন for-inবিবৃতি।
আমি

প্রকৃতপক্ষে উভয়ই কীওয়ার্ডের বিভিন্ন ব্যবহার
জাহান

4
হ্যাঁ, inএকটি কীওয়ার্ড। তবে ওপি inঅপারেটর হিসাবে নির্দিষ্ট ব্যবহার সম্পর্কে জিজ্ঞাসা করছে । আপনার উত্তরটি for-inবিবৃতিটির অংশ হিসাবে অন্যান্য ব্যবহারের সাথে সম্পর্কিত ।
আমি

-3

প্রথম সংস্করণটি সংক্ষিপ্ত (বিশেষত সংশোধিত কোডে যেখানে ভেরিয়েবলগুলির নাম পরিবর্তন করা হয়)

a in b

বনাম

b.hasOwnProperty(a)

যাইহোক, @ অ্যান্ড্রেইমেনহোল্ড যেমন বলেছে, তারা সবসময় একই ফলাফল দেয় না।


1
এটি একটি মন্তব্য হিসাবে ভাল হত। :-)
হালাউলেকা এমএএস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.