জাভাস্ক্রিপ্টে কোনও বস্তুর প্রদত্ত সম্পত্তি আছে কি না তা কীভাবে নির্ধারণ করবেন


311

আমি কীভাবে নির্ধারণ করতে পারি যে কোনও বস্তুর মান নির্বিশেষে xনির্ধারিত সম্পত্তি রয়েছে কিনা ?yx.y

আমি বর্তমানে ব্যবহার করছি

if (typeof(x.y) !== 'undefined')

তবে এটি কিছুটা জটিল বলে মনে হচ্ছে। একটি ভাল উপায় আছে কি?

উত্তর:


584

বস্তুর সম্পত্তি রয়েছে:

আপনি যদি সেই সামগ্রীর জন্য যা নিজে নিজেই পরীক্ষা করে থাকেন (এর প্রোটোটাইপ চেইনের একটি অংশ নয়) আপনি ব্যবহার করতে পারেন .hasOwnProperty():

if (x.hasOwnProperty('y')) { 
  // ......
}

অবজেক্ট বা এর প্রোটোটাইপের একটি সম্পত্তি রয়েছে:

inউত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তিগুলির পরীক্ষার জন্য আপনি অপারেটরটি ব্যবহার করতে পারেন ।

if ('y' in x) {
  // ......
}

23
বা আরও ভাল - Object.prototype.hasOwnProperty.call(x, 'y')সুতরাং "hasOwnProperty" নামে সম্পত্তিটি পরিদর্শন প্রক্রিয়াটির সাথে বিরোধ করবে না;)
kangax

4
বা এমনকি ছোট - {}.hasOwnProperty.call(x, 'y')
axmrnv

78

আপনি যদি জানতে চান যে বস্তুটিতে শারীরিকভাবে সম্পত্তি রয়েছে কিনা @ জিএনআরএফ এর উত্তর ব্যবহার hasOwnPropertyকরে কাজ করবে।

আপনি যদি জানতে চান যে সম্পত্তিটি কোথাও আছে কিনা, তা নিজেই বস্তুতে বা প্রোটোটাইপ চেইনে রয়েছে, আপনি inঅপারেটরটি ব্যবহার করতে পারেন ।

if ('prop' in obj) {
  // ...
}

যেমন .:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically

18

ইন্ডজোর.জেএস বা লোডাশ

if (_.has(x, "y")) ...

:)


নাঃ। এটি কেবল একটি উপনামের জন্য Object.prototype.hasOwnProperty.call(x, "y")। অ্যারে জন্য আমি মনে করি আপনি চাইতে পারেন Array.prototype.indexOf, _.indexOfঅথবা_.contains
nackjicholson

13

আপনি এটিকে কিছুটা ছাঁটাই করতে পারেন:

if ( x.y !== undefined ) ...

15
এটি দিয়ে ব্যর্থ হবেx = {y:undefined}
জেমস

20
"সংজ্ঞায়িত নয়" এবং "সংজ্ঞায়িত করার জন্য সংজ্ঞায়িত করা" এর মধ্যে কারও পার্থক্য করা দরকার?
jpsimons

16
@darkporter আমি কখনও কখনও না;)
MMM

6

আমার মূল কোডটির একটি বৈশিষ্ট্য

if ( typeof(x.y) != 'undefined' ) ...

এটি কিছু পরিস্থিতিতে কার্যকর হতে পারে এটি xবিদ্যমান বা না থাকাই ব্যবহার করা নিরাপদ । জিএনআরএফ-এর উত্তরের যে কোনও একটি পদ্ধতির সাহায্যে প্রথমে পরীক্ষা করা উচিত xযদি এটির কোন সন্দেহ থাকে কিনা।

সুতরাং সম্ভবত তিনটি পদ্ধতিরই কারও এক কৌশলতে একটি ব্যাগ রয়েছে।


আপনি সর্বদা ব্যবহার করতে পারেন (x && x.hasOwnProperty('y'))বা(x && 'y' in x)
gnarf

আমি সম্মত, এক্স এর জন্য পরীক্ষা করা এটি নিজস্ব একটি পৃথক কেস হওয়া উচিত। আরও ভাল ত্রুটি প্রতিবেদন উত্পাদন করে।
b01

এটা আমার জন্য ব্যর্থ হয়েছিল X যদি অপরিজ্ঞাত থাকে তবে টাইপফ (xy) ReferenceError'অপরিজ্ঞাপিত' স্ট্রিংয়ের পরিবর্তে একটি ফেরত
ক্রেগ

1

যেহেতু সম্পত্তি সম্পত্তি যাচাইয়ের বিশৃঙ্খলা সম্পর্কিত ছিল, এবং এটির জন্য একটি নিয়মিত ইউজকেস ফাংশন আর্গুমেন্ট বিকল্পগুলির বস্তুর বৈধতা ছিল বলে ভেবেছিলাম যে আমি একাধিক সংখ্যার সম্পত্তি অস্তিত্ব পরীক্ষা করার জন্য একটি লাইব্রেরি-মুক্ত সংক্ষিপ্ত উপায় উল্লেখ করব। অস্বীকৃতি: এর জন্য ECMAScript 5 প্রয়োজন (তবে আইএমও যে কেউ এখনও আই 8 ব্যবহার করছেন এটি একটি ভাঙা ওয়েবের প্রাপ্য)।

function f(opts) {
  if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
      throw new Error("IllegalArgumentException");
  }
  alert("ok");
}
f({req1: 123});  // error
f({req1: 123, req2: 456});  // ok

-2

কেন সহজভাবে নয়:

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

অথবা আপনি যদি একটি নির্দিষ্ট প্রকারের আশা করেন:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");

1
কারণ এটি পড়া খারাপ এবং কঠোরভাবে টাইপ করা নয়। আমি আপনাকে অবশ্যই জিজ্ঞাসা করব: কেন সহজ নয় x.hasOwnProperty('y')?
ফ্যাবিয়ান পিকন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.