javascript - tutorial - w3schools




কিভাবে একটি বস্তু জাভাস্ক্রিপ্ট একটি সম্পত্তি আছে কিভাবে আমি চেক করবেন? (16)

HasOwnProperty "কোন বস্তুর নির্দিষ্ট বস্তুর সরাসরি সম্পত্তি হিসাবে নির্দিষ্ট বস্তুর আছে কিনা তা নির্ধারণ করতে ব্যবহার করা যেতে পারে; ইন অপারেটরের বিপরীতে , এই পদ্ধতিটি বস্তুর প্রোটোটাইপ শৃঙ্খলাটি পরীক্ষা করে না।"

তাই সম্ভবত, আপনার প্রশ্নের দ্বারা যা মনে হয়, তার জন্য আপনি ওউনপ্রপ্রিটিটি ব্যবহার করতে চান না, যা নির্ধারণ করে যে সম্পত্তিটি বস্তুর সাথে সরাসরি সংযুক্ত থাকে কিনা তা নির্ধারণ করে

যদি আপনি প্রোটোটাইপ শৃঙ্খলে থাকা সম্পত্তিটি নির্ধারণ করতে চান তবে আপনি এটি ব্যবহার করতে চান, যেমন:

if( prop in object ){ // do something }

আশা করি এটা কাজে লাগবে.

কিভাবে একটি বস্তু জাভাস্ক্রিপ্ট একটি সম্পত্তি আছে কিভাবে আমি চেক করবেন?

বিবেচনা:

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

এটা কি সর্বোত্তম উপায়?



আপনি পদ্ধতি object.hasOwnProperty(property) ব্যবহার করতে হবে। যদি বস্তুটির সম্পত্তি থাকে না এবং বস্তুটি না থাকে তবে এটি সত্য ফেরত দেয়।


আপনি যদি কোন সম্পত্তি অনুসন্ধান করেন তবে "না"। তুমি চাও:

if ('prop' in obj) { }

সাধারণত আপনি সম্পত্তি প্রোটোটাইপ বা বস্তুর থেকে আসে কিনা তা যত্ন করা উচিত নয়।

যাইহোক, কারণ আপনি আপনার নমুনা কোডে 'কী' ব্যবহার করেছিলেন, তাই মনে হচ্ছে আপনি বস্তুর সাথে হ্যাশ হিসাবে আচরণ করছেন, আপনার ক্ষেত্রে এটির উত্তরটি বুঝবে। হ্যাশের সমস্ত কী বস্তুর বৈশিষ্ট্য হতে পারে এবং আপনি প্রোটোটাইপ দ্বারা অবদান অতিরিক্ত বৈশিষ্ট্যগুলি এড়াতে পারবেন।

জন রেসিগ এর উত্তর খুব ব্যাপক ছিল, কিন্তু আমি এটা স্পষ্ট ছিল না। বিশেষ করে যখন "obj মধ্যে" prop "ব্যবহার করার জন্য।


আমি সত্যিই দেওয়া উত্তর দ্বারা বিভ্রান্ত করছি - তাদের অধিকাংশই ঠিক সঠিক। অবশ্যই আপনি অনির্ধারিত, নাল, বা মিথ্যা মান আছে বস্তুর বৈশিষ্ট্য থাকতে পারে। তাই কেবল typeof this[property] x.key করতে সম্পত্তি চেক হ্রাস করা বা এমনকি খারাপ, x.key আপনাকে সম্পূর্ণ বিভ্রান্তিকর ফলাফল দেবে।

এটা আপনি খুঁজছেন কি উপর নির্ভর করে। যদি আপনি জানতে চান যে কোনো বস্তুর শারীরিকভাবে কোনও সম্পত্তি রয়েছে (এবং এটি প্রোটোটাইপ শৃঙ্খলে কোথাও থেকে আসছে না) তাহলে object.hasOwnProperty হ'ল যেতে হবে। সব আধুনিক ব্রাউজার এটি সমর্থন করে। (এটি Safari - 2.0.1 এবং পুরোনো এর পুরোনো সংস্করণগুলিতে অনুপস্থিত ছিল - তবে ব্রাউজারগুলির যে সংস্করণগুলি খুব কমই ব্যবহৃত হয়।)

যদি আপনি যা খুঁজছেন তা যদি কোন বস্তুর উপর কোনও সম্পত্তি থাকে তবে এটি যথোপযুক্ত সৃষ্টিকর্তা (যখন আপনি বস্তুর বৈশিষ্ট্যগুলির উপর পুনরাবৃত্তি করেন তখন এটি উপস্থিত হবে) তারপর করছেন: prop in object আপনাকে আপনার পছন্দসই প্রভাব দেবে।

যেহেতু hasOwnProperty ব্যবহার করার পরে সম্ভবত আপনি চান, এবং বিবেচনা করে যে আপনি একটি ফাল্যাকব্যাক পদ্ধতি চান, আমি আপনাকে নিম্নলিখিত সমাধান উপস্থাপন:

var obj = {
    a: undefined,
    b: null,
    c: false
};

// a, b, c all found
for ( var prop in obj ) {
    document.writeln( "Object1: " + prop );
}

function Class(){
    this.a = undefined;
    this.b = null;
    this.c = false;
}

Class.prototype = {
    a: undefined,
    b: true,
    c: true,
    d: true,
    e: true
};

var obj2 = new Class();

// a, b, c, d, e found
for ( var prop in obj2 ) {
    document.writeln( "Object2: " + prop );
}

function hasOwnProperty(obj, prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in obj) &&
        (!(prop in proto) || proto[prop] !== obj[prop]);
}

if ( Object.prototype.hasOwnProperty ) {
    var hasOwnProperty = function(obj, prop) {
        return obj.hasOwnProperty(prop);
    }
}

// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
    if ( hasOwnProperty(obj2, prop) ) {
        document.writeln( "Object2 w/ hasOwn: " + prop );
    }
}

উপরে একটি কাজ, ক্রস-ব্রাউজার, hasOwnProperty সমাধান রয়েছে, একটি সতর্কতা সহ: এটি এমন একটি ক্ষেত্রে পার্থক্য করতে পারে না যেখানে একটি অভিন্ন সম্পত্তি প্রোটোটাইপ এবং উদাহরণস্বরূপ - এটি অনুমান করে যে এটি প্রোটোটাইপ থেকে আসছে। আপনি এটি আপনার পরিস্থিতির উপর ভিত্তি করে আরো লেনদেন বা কঠোর হতে পারে, কিন্তু অন্তত এটি আরও সহায়ক হতে হবে।


আরেকটি অপেক্ষাকৃত সহজ উপায় Object.keys ব্যবহার করা Object.keys । এটি একটি array যার মানে আপনি একটি array সমস্ত বৈশিষ্ট্য পান।

var noInfo = {};
var info = {something: 'data'};

Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true

আমরা মহান ব্রাউজার সমর্থন সঙ্গে একটি বিশ্বের যদিও। এই প্রশ্নটি এত পুরনো কারণ আমি ভাবলাম যে আমি এটি যুক্ত করব: এটি JS v1.8.5 হিসাবে ব্যবহার করা নিরাপদ


কি সম্পর্কে?

var x = {'key': 1};

if ('key' in x) {
    console.log('has');
}

চলুন এখানে কিছু বিভ্রান্তির মাধ্যমে কাটা। প্রথমত, hasOwnProperty দ্বারা সরলীকৃত করা আছে hasOwnProperty ইতিমধ্যে বিদ্যমান আছে; এই ব্যবহার বর্তমান ব্রাউজার বিপুল সংখ্যাগরিষ্ঠ সত্য।

hasOwnProperty সত্যটি ফেরত দেয় যদি এটিতে প্রদত্ত বৈশিষ্ট্য নামটি বস্তুতে যোগ করা হয়েছে। এটি পুরোপুরি undefined হতে পারে যা এটি নির্ধারিত প্রকৃত মান থেকে সম্পূর্ণরূপে স্বাধীন।

অত: পর:

var o = {}
o.x = undefined

var a = o.hasOwnProperty('x')  // a is true
var b = o.x === undefined // b is also true

যাহোক:

var o = {}

var a = o.hasOwnProperty('x')  // a is now false
var b = o.x === undefined // b is still true

সমস্যাটি কি হয় যখন প্রোটোটাইপ শৃঙ্খলের একটি বস্তুর অনির্ধারিত মানের সাথে একটি বৈশিষ্ট্য থাকে? hasOwnProperty এটি জন্য মিথ্যা হবে, এবং তাই হবে !== undefined । তবুও for..in এখনও এটি গণনা তালিকাভুক্ত করা হবে।

নিচের লাইনটি কোন ক্রস-ব্রাউজার উপায় নেই (যেহেতু ইন্টারনেট এক্সপ্লোরার __prototype__ প্রকাশ করে না) একটি নির্দিষ্ট শনাক্তকারী কোনও বস্তু বা তার প্রোটোটাইপ শৃঙ্খলে সংযুক্ত করা হয়েছে তা নির্ধারণ করতে।


প্রতিফলিত সঙ্গে ECMA স্ক্রিপ্ট 6 সমাধান। মত রপার তৈরি করুন:

/**
Gets an argument from array or object.
The possible outcome:
- If the key exists the value is returned.
- If no key exists the default value is returned.
- If no default value is specified an empty string is returned.
@param obj    The object or array to be searched.
@param key    The name of the property or key.
@param defVal Optional default version of the command-line parameter [default ""]
@return The default value in case of an error else the found parameter.
*/
function getSafeReflectArg( obj, key, defVal) {
   "use strict";
   var retVal = (typeof defVal === 'undefined' ? "" : defVal);
   if ( Reflect.has( obj, key) ) {
       return Reflect.get( obj, key);
   }
   return retVal;
}  // getSafeReflectArg

বস্তুর উপর "hasOwnProperty" পদ্ধতি আছে, তবে এটি সরাসরি এই পদ্ধতিতে কল করার সুপারিশ করা হয় না কারণ কখনও কখনও বস্তুটি নিল হয় বা বস্তুর মতো কিছু সম্পত্তি বিদ্যমান থাকে: { hasOwnProperty: false }

তাই ভাল উপায় হবে:

// good
var obj = {"bar": "here bar desc"}
console.log(Object.prototype.hasOwnProperty.call(obj, "bar"));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(obj, "bar"));


যদি আপনি যে কীটি চেক করছেন তা একটি পরিবর্তনশীলতে সংরক্ষণ করা হয়, তবে আপনি এটির মতো এটি পরীক্ষা করতে পারেন:

x = {'key': 1};
y = 'key';
x[y];

সম্পত্তিটি কোন বস্তুর উপর বিদ্যমান কিনা তা যাচাই করতে in অপারেটর ব্যবহার করতে পারেন:

x = {'key': 1};
alert("key" in x);

আপনি for - in লুপ ব্যবহার করে বস্তুর সমস্ত বৈশিষ্ট্যের মাধ্যমেও লুপ করতে পারেন এবং তারপরে নির্দিষ্ট সম্পত্তিটি পরীক্ষা করতে পারেন:

for (prop in x) {
    if (prop == "key") {
        //Do something
    }
}

আপনি এই বস্তুর সম্পত্তি সংখ্যাবহুল কিনা তা বিবেচনা করতে হবে, কারণ অ-সংখ্যাসূচক বৈশিষ্ট্যগুলি for-in লুপে প্রদর্শিত হবে না। এছাড়াও, যদি সংখ্যাসূচক সম্পত্তি প্রোটোটাইপের একটি অ-সংখ্যাসূচক সম্পত্তি ছায়াচ্ছন্ন হয় তবে এটি Internet Explorer 8 এবং এর আগে প্রদর্শিত হবে না।

আপনি সমস্ত ইনস্ট্যান্স বৈশিষ্ট্যগুলির একটি তালিকা চাইলে, সংখ্যাযুক্ত কিনা বা না, আপনি এটি ব্যবহার করতে পারেন

Object.getOwnPropertyNames(x);

এটি একটি বস্তুর বিদ্যমান সমস্ত বৈশিষ্ট্যের নামের একটি অ্যারে ফিরিয়ে দেবে।

অবশেষে, আপনি টাইপ অফ অপারেটরটি সরাসরি বস্তুর সম্পত্তিটির ডাটা টাইপ চেক করতে ব্যবহার করতে পারেন:

if (typeof x.key == "undefined") {
    alert("undefined");
}

যদি সম্পত্তি বস্তুর উপর বিদ্যমান না থাকে, এটি স্ট্রিং অনির্ধারিত ফিরে আসবে। অন্যথায় এটি উপযুক্ত সম্পত্তি টাইপ ফেরত হবে। যাইহোক, নোট করুন যে কোনও বস্তুর সম্পত্তি আছে কিনা তা যাচাই করার জন্য এটি সর্বদা একটি বৈধ উপায় নয়, কারণ আপনার কোনও সম্পত্তি থাকতে পারে যা অনির্দিষ্টতে সেট করা আছে, এই ক্ষেত্রে, typeof x.key ব্যবহার করে এখনও সত্য ফিরে আসবে (যদিও কী এখনও বস্তুর মধ্যে)।

আপডেট: অনির্ধারিত জাভাস্ক্রিপ্ট সম্পত্তি তুলনায় একটি সম্পত্তি বিদ্যমান কিনা তা আপনি পরীক্ষা করতে পারেন

if (x.key === undefined) {
    alert("undefined");
}

এইটি কাজ করা উচিত না যতক্ষণ না মূলত x বস্তুর উপরে undefined সেট করা হয়


হ্যাঁ এটি হল :) আমি মনে করি Object.prototype.hasOwnProperty.call(x, 'key') hasOwnProperty Object.prototype.hasOwnProperty.call(x, 'key') যা x এর প্রোপার্টি নামে পরিচিত একটি সম্পত্তি থাকলেও কাজ করতে হবে :)

কিন্তু যে নিজের সম্পত্তি জন্য পরীক্ষা। আপনি যদি এমন কোনও সম্পত্তি আছে কিনা তা যাচাই করতে চান তবে এটিও হতে পারে আপনি typeof x.foo != 'undefined' ব্যবহার করতে পারেন।


lodash বা ( এমনকি আরও ভাল ) lodash :

_.has(x, 'key');

যা Object.prototype.hasOwnProperty কল করে, তবে (ক) টাইপ করার জন্য ছোট, এবং (খ) " hasOwnProperty নিরাপদ রেফারেন্স" ব্যবহার করে (অর্থাত এটি hasOwnProperty হয় hasOwnProperty এটি কাজ করে)।

বিশেষ করে, লোডশ _.has হিসাবে সংজ্ঞায়িত করে:

   function has(object, key) {
      return object ? hasOwnProperty.call(object, key) : false;
   }
   // hasOwnProperty = Object.prototype.hasOwnProperty

if (typeof x.key != "undefined") {

}

কারণ

if (x.key)

x.key সমাধান করলে ব্যর্থ হয় (উদাহরণস্বরূপ, x.key = "" )।


if (x.key !== undefined)

আর্মি রোনাশার ইতিমধ্যে আমাকে এটি মারতে বলে মনে হচ্ছে, কিন্তু:

Object.prototype.hasOwnProperty = function(property) {
    return this[property] !== undefined;
};

x = {'key': 1};

if (x.hasOwnProperty('key')) {
    alert('have key!');
}

if (!x.hasOwnProperty('bar')) {
    alert('no bar!');
}

একটি নিরাপদ, কিন্তু ধীর সমাধান, যেমন এবং আর্মিন রোনাচারের দ্বারা নির্দেশিত হবে:

Object.prototype.hasOwnProperty = function(property) {
    return typeof this[property] !== 'undefined';
};





javascript