কোনও মান জাভাস্ক্রিপ্টে একটি অবজেক্ট কিনা তা আপনি কীভাবে চেক করবেন?
কোনও মান জাভাস্ক্রিপ্টে একটি অবজেক্ট কিনা তা আপনি কীভাবে চেক করবেন?
উত্তর:
আপডেট :
এই উত্তরটি অসম্পূর্ণ এবং বিভ্রান্তিমূলক ফলাফল দেয় । উদাহরণস্বরূপ, জাভাস্ক্রিপ্ট null
টাইপ বিবেচনা করা হয় object
, বিভিন্ন অন্যান্য প্রান্ত ক্ষেত্রে উল্লেখ না। নীচের প্রস্তাবটি অনুসরণ করুন এবং অন্যান্য "সর্বাধিক উত্সাহিত (এবং সঠিক!) উত্তর" তে যান ।
আসল উত্তর :
ব্যবহার করার চেষ্টা করুন typeof(var)
এবং / অথবা var instanceof something
।
সম্পাদনা করুন: এই উত্তরটি কিভাবে পরিবর্তনশীল এর বৈশিষ্ট্য পরীক্ষা করার একটি ধারণা দেয়, কিন্তু তা না হয় না তা চেক একটি বস্তু, এটি থেকে অনেক দূরে একটি বুলেটপ্রুফ রেসিপি (সমস্ত পরে সেখানে সব সময়ে কোন রেসিপি!)। যেহেতু লোকেরা কোনও গবেষণা না করেই এখান থেকে অনুলিপি করার জন্য কিছু সন্ধান করার ঝোঁক রয়েছে, তাই আমি অত্যন্ত পরামর্শ দিই যে তারা অন্যটিতে সর্বাধিক উত্সাহিত (এবং সঠিক!) উত্তরটির দিকে চলে।
typeof
একটি অপারেটর, তাই প্রয়োজন নেই ()
।
typeof
শূন্যের জন্য 'অবজেক্ট' প্রদান করে, যা কোনও বস্তু instanceof
নয় এবং ব্যবহার করে তৈরি বস্তুর জন্য কাজ করে না Object.create(null)
।
যদি typeof yourVariable === 'object'
এটি কোনও বস্তু বা নাল হয়। যদি আপনি নাল বাদ দিতে চান তবে এটি তৈরি করুন typeof yourVariable === 'object' && yourVariable !== null
।
yourVariable !== null
ভাল অনুশীলন হবে?
typeof null == 'object'
সংশোধন করা হইনি ES6 । তারা বলেছে:This proposal has been rejected. It was implemented in V8 but it turned out that it broke a lot of existing sites. In the spirit of One JavaScript this is not feasible.
typeof
কারণ এতে কয়েকটি বিশেষ মামলা রয়েছে যা অগত্যা পুরোটা বোঝায় না। যদি আপনি অ্যারে এবং অ্যারে না এমন বস্তুর মধ্যে পার্থক্য করার চেষ্টা করছেন তবে আপনি অবশ্যই ব্যবহার করতে চাইবেন না typeof
।
Object.prototype.toString.call(yourVar)
হচ্ছে, yourVar কি পরিদর্শন করা প্রয়োজন। অ্যারেগুলির ক্ষেত্রে, Object.prototype.toString.call([1,2])
প্রত্যাবর্তন[object Array]
জাভাস্ক্রিপ্টে "অবজেক্ট" সংজ্ঞায়িত করা যাক । এমডিএন ডক্স অনুসারে , প্রতিটি মান হয় একটি বস্তু বা আদিম:
আদিম, আদিম মান
এমন একটি ডেটা যা কোনও অবজেক্ট নয় এবং এর কোনও পদ্ধতি নেই। জাভাস্ক্রিপ্টে ৫ টি আদিম ডেটাটাইপ রয়েছে: স্ট্রিং, সংখ্যা, বুলিয়ান, নাল, অপরিজ্ঞাত।
আদিম কি?
3
'abc'
true
null
undefined
কোন বস্তু (অর্থাত্ আদিম নয়) কী?
Object.prototype
Object.prototype
Function.prototype
Object
Function
function C(){}
- ব্যবহারকারী সংজ্ঞায়িত ফাংশনC.prototype
- কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশনের প্রোটোটাইপ সম্পত্তি: এটি কোনও C
প্রোটোটাইপ নয়
new C()
- "নতুন" ব্যবহারকারী-সংজ্ঞায়িত ফাংশনMath
Array.prototype
{"a": 1, "b": 2}
- আক্ষরিক স্বরলিপি ব্যবহার করে তৈরি বস্তুnew Number(3)
- আদিমদের চারপাশে মোড়কObject.create(null)
Object.create(null)
মানটি কোনও বস্তু কিনা তা কীভাবে পরীক্ষা করবেন
instanceof
নিজে থেকে কাজ করবে না, কারণ এটি দুটি ক্ষেত্রে মিস করে:
// oops: isObject(Object.prototype) -> false
// oops: isObject(Object.create(null)) -> false
function isObject(val) {
return val instanceof Object;
}
typeof x === 'object'
মিথ্যা ধনাত্মক ( null
) এবং মিথ্যা নেতিবাচক (ফাংশন) এর কারণে কাজ করবে না :
// oops: isObject(Object) -> false
function isObject(val) {
return (typeof val === 'object');
}
Object.prototype.toString.call
আদিম সকলের জন্য মিথ্যা ধনাত্মকতার কারণে কাজ করবে না:
> Object.prototype.toString.call(3)
"[object Number]"
> Object.prototype.toString.call(new Number(3))
"[object Number]"
সুতরাং আমি ব্যবহার:
function isObject(val) {
if (val === null) { return false;}
return ( (typeof val === 'function') || (typeof val === 'object') );
}
@ দানের উত্তরটিও কার্যকর বলে মনে হচ্ছে:
function isObject(obj) {
return obj === Object(obj);
}
কারণ, এমডিএন ডক্স অনুসারে :
অবজেক্ট কনস্ট্রাক্টর প্রদত্ত মানের জন্য একটি অবজেক্ট র্যাপার তৈরি করে। মানটি যদি নাল বা অপরিজ্ঞাত হয় তবে এটি একটি খালি অবজেক্ট তৈরি করে এবং ফিরে আসবে, অন্যথায়, এটি প্রদত্ত মানের সাথে মিলিত কোনও প্রকারের বস্তুটি ফেরত দেবে। যদি মানটি ইতিমধ্যে একটি অবজেক্ট হয় তবে এটি মানটি ফিরিয়ে দেবে।
তৃতীয় উপায় যা কাজ করে বলে মনে হচ্ছে (এটি 100% কিনা তা নিশ্চিত নয়) হ'ল এটি ব্যবহার করা Object.getPrototypeOf
যা কোন যুক্তি যদি তার যুক্তি না হয় তবে ব্যতিক্রম করে :
// these 5 examples throw exceptions
Object.getPrototypeOf(null)
Object.getPrototypeOf(undefined)
Object.getPrototypeOf(3)
Object.getPrototypeOf('abc')
Object.getPrototypeOf(true)
// these 5 examples don't throw exceptions
Object.getPrototypeOf(Object)
Object.getPrototypeOf(Object.prototype)
Object.getPrototypeOf(Object.create(null))
Object.getPrototypeOf([])
Object.getPrototypeOf({})
obj === Object(obj)
true
অ্যারে জন্য ফেরত ।
var x = []; console.log(x === Object(x)); // return true
getPrototypeOf
যেমন প্রত্যাহারিত প্রক্সিগুলির সাথে কাজ করে না, যা বস্তু তবে নিক্ষেপ করে।
({}).toString.apply(obj) === '[object Object]'
অ্যারে নয় এমন অ্যারে এবং অবজেক্টগুলির মধ্যে কেন পার্থক্য করবে না
আন্ডারস্কোর.জেএস সত্যিকার অর্থে কোনও জিনিস কিনা তা জানতে নিম্নলিখিত পদ্ধতিটি সরবরাহ করে:
_.isObject = function(obj) {
return obj === Object(obj);
};
হালনাগাদ
ভি 8-র পূর্বের বাগ এবং গৌণ মাইক্রো স্পিড অপ্টিমাইজেশনের কারণে পদ্ধতিটি আন্ডারস্কোর.জেস 1.7.0 (আগস্ট 2014) থেকে নিম্নলিখিত হিসাবে দেখায় :
_.isObject = function(obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};
return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'
null
। গ্রহণযোগ্য উত্তর হওয়া উচিত।
Object.prototype.toString.call(myVar)
ফিরে আসবে:
"[object Object]"
যদি মাইভার একটি বস্তু হয়"[object Array]"
যদি মাইভার একটি অ্যারে হয়এটি এবং কেন এটি টাইপফোর একটি ভাল বিকল্প হিসাবে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন ।
typeof [] === 'object'
-> true
। আপনার এই পদ্ধতির প্রয়োজন।
Object.prototype.toString.call(3)
-> "[object Number]"
। Object.prototype.toString.call(new Number(3))
-> "[object Number]
"
getType=function(obj){return Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1];};
অতিরিক্ত ফাংশন কল (গতি) ছাড়াই কেবল অবজেক্ট বা অ্যারের বিরুদ্ধে পরীক্ষা করার জন্য। হিসাবে এখানে পোস্ট ।
isArray ()
isArray = function(a) {
return (!!a) && (a.constructor === Array);
};
console.log(isArray( )); // false
console.log(isArray( null)); // false
console.log(isArray( true)); // false
console.log(isArray( 1)); // false
console.log(isArray( 'str')); // false
console.log(isArray( {})); // false
console.log(isArray(new Date)); // false
console.log(isArray( [])); // true
আইসজেক্ট () - দ্রষ্টব্য: কেবলমাত্র অবজেক্ট লিটারেলের জন্য ব্যবহার করুন, কারণ এটি কাস্টম অবজেক্টগুলির জন্য যেমন নতুন তারিখ বা নতুন আপনারকাস্টমঅবজেক্টের জন্য মিথ্যা প্রদান করে।
isObject = function(a) {
return (!!a) && (a.constructor === Object);
};
console.log(isObject( )); // false
console.log(isObject( null)); // false
console.log(isObject( true)); // false
console.log(isObject( 1)); // false
console.log(isObject( 'str')); // false
console.log(isObject( [])); // false
console.log(isObject(new Date)); // false
console.log(isObject( {})); // true
isObject
শুধুমাত্র বস্তুর আক্ষরিক সাথে কাজ করে। যদি আমি একটি কাস্টম টাইপ তৈরি করি, টাইপের একটি উদাহরণ তৈরি করুন এবং এটি পরীক্ষা করুন, এটি ফিরে আসেfalse
Boolean(a)
লম্বা তবে অনেক বেশি স্বজ্ঞাত। শুধু ব্যবহার করবেন না new Boolean(a)
: ( এখানে কেন )!
{
চরিত্র দিয়ে শুরু করে জেএসএনে উপস্থাপন করা হবে । অ্যারের ক্ষেত্রে, যতক্ষণ না আপনার আইআই <9 সমর্থন করার প্রয়োজন নেই, আপনি Array.isArray()
কোনও কিছু অ্যারে কিনা তা নির্ধারণ করতে ব্যবহার করতে পারেন । এটি আপনার সরবরাহিত সমস্ত পরীক্ষার কেস পাস করে।
আমি সহজভাবে পছন্দ করি:
function isObject (item) {
return (typeof item === "object" && !Array.isArray(item) && item !== null);
}
আইটেমটি যদি কোনও জেএস অবজেক্ট হয়, এবং এটি জেএস অ্যারে নয়, এবং এটি নয় null
... যদি তিনটি সত্যই প্রমাণিত হয় তবে ফিরে আসুন true
। তিনটি শর্তের মধ্যে কোনওটি যদি ব্যর্থ হয় তবে &&
পরীক্ষাটি শর্ট সার্কিট হয়ে false
ফিরে আসবে। null
যদি (আপনি কীভাবে ব্যবহার উপর নির্ভর করে আকাঙ্ক্ষিত পরীক্ষা বাদ দেওয়া যেতে পারে null
)।
দস্তাবেজ:
http://devdocs.io/javascript/operators/typeof
http://devdocs.io/javascript/global_objects/object
new Date()
একটি বস্তু ফেরত। একটি অ্যারের যৌক্তিক দৃষ্টিকোণ থেকে কোনও অবজেক্ট নয় - যদিও জাভাস্ক্রিপ্ট হ্যান্ডেল করে এবং সেগুলি তাদের হিসাবে প্রতিবেদন করে। অনুশীলনে তবে এগুলি সমান দেখতে সহায়ক নয়, কারণ তারা তা নয়। length
উদাহরণস্বরূপ কোনও বস্তুর কোনও বৈশিষ্ট্য নেই এবং এটিতে পুশ () এর মতো কোনও পদ্ধতি নেই। এবং কখনও কখনও আপনি কোনও ফাংশন ওভারলোড হওয়া প্যারামগুলি দিতে চাইতে পারেন, যেখানে আপনাকে কোনও অ্যারে বা কোনও অবজেক্টের মধ্যে পার্থক্য করতে হবে বিশেষত যদি অন্য পরামিতি কোনটি দেওয়া হয়েছিল তার উপর নির্ভর করে।
length
সম্পত্তি বা পদ্ধতি থাকতে পারে না push
, Object.create(Array.prototype)
এটি একটি নন-অ্যারে অবজেক্টের একটি তুচ্ছ কাউন্টারেক্সেক্সেল which অ্যারেগুলিকে বিশেষ করে তোলে তা হ'ল এগুলি একটি কাস্টম [[DefineOwnProperty]] প্রয়োজনীয় অভ্যন্তরীণ পদ্ধতি সহ বিদেশী বস্তু, তবে তারা এখনও অবজেক্ট are
length
সম্পত্তি থাকতে পারে না (আমি বোঝাতে চেয়েছিলাম যে অবজেক্টের অক্ষরগুলির length
ডিফল্টরূপে কোনও বৈশিষ্ট্য নেই )। আমি লিখেছি যে অ্যারেগুলি যৌক্তিক দৃষ্টিকোণ থেকে বস্তু নয় । আমি প্রোগ্রাম লজিক সম্পর্কে বলছি। অ্যারেটি "আসল" অ্যারে কিনা তা অবশ্যই পরীক্ষা করা প্রয়োজন এবং অবশ্যই "সত্য" বস্তু নয়। এটা কি Array.isArray()
জন্য। আপনার কোনও ফাংশন কল্পনা করুন যা কোনও অবজেক্ট বা অবজেক্টের অ্যারে গ্রহণ করে। একটি বিশেষ গুণ বা পদ্ধতির জন্য অনুসন্ধান করা একটি নোংরা সমাধান। নেটিভ উপায় সবসময় ভাল।
typeof null
হয় "object"
, না "undefined"
।
Array.isArray
:function isObject(o) {
return o !== null && typeof o === 'object' && Array.isArray(o) === false;
}
Array.isArray
:কেবলমাত্র বিস্মিত হয়েছে যে ভুল উত্তরের জন্য কতগুলি upvotes 😮
মাত্র 1 টি উত্তর আমার পরীক্ষায় উত্তীর্ণ হয়েছে !!! এখানে আমি আমার সরলীকৃত সংস্করণ তৈরি করেছি:
function isObject(o) {
return o instanceof Object && o.constructor === Object;
}
আমার হিসাবে, এটি পরিষ্কার এবং সহজ, এবং ঠিক কাজ করে! এখানে আমার পরীক্ষা:
console.log(isObject({})); // Will return: true
console.log(isObject([])); // Will return: false
console.log(isObject(null)); // Will return: false
console.log(isObject(/.*/)); // Will return: false
console.log(isObject(function () {})); // Will return: false
আরও সময়: সমস্ত উত্তর এই পরীক্ষায় পাস করে না !!! 🙈
আপনি যদি সেই বিষয়টিকে নির্দিষ্ট শ্রেণীর উদাহরণ হিসাবে যাচাই করতে চান তবে আপনাকে আপনার নির্দিষ্ট শ্রেণীর সাথে কনস্ট্রাক্টর পরীক্ষা করতে হবে, যেমন:
function isDate(o) {
return o instanceof Object && o.constructor === Date;
}
সাধারণ পরীক্ষা:
var d = new Date();
console.log(isObject(d)); // Will return: false
console.log(isDate(d)); // Will return: true
ফলস্বরূপ, আপনার কাছে কঠোর এবং শক্তিশালী কোড থাকবে!
যদি আপনি মত ফাংশন তৈরি করা হবে না isDate
, isError
, isRegExp
, ইত্যাদি এই সাধারণ ফাংশন ব্যবহার করার অপশন বিবেচনা করতে পারেন:
function isObject(o) {
return o instanceof Object && typeof o.constructor === 'function';
}
এটি পূর্বে উল্লিখিত সমস্ত পরীক্ষার ক্ষেত্রে সঠিকভাবে কাজ করবে না, তবে এটি সমস্ত বস্তুর (সমতল বা নির্মিত) যথেষ্ট good
isObject
Object.create(null)
অভ্যন্তরীণ বাস্তবায়নের কারণে এখানে কাজ করা হবে না Object.create
যা সম্পর্কে এখানে ব্যাখ্যা করা হয়েছে তবে আপনি isObject
আরও পরিশীলিত বাস্তবায়নে ব্যবহার করতে পারেন :
function isObject(o, strict = true) {
if (o === null || o === undefined) {
return false;
}
const instanceOfObject = o instanceof Object;
const typeOfObject = typeof o === 'object';
const constructorUndefined = o.constructor === undefined;
const constructorObject = o.constructor === Object;
const typeOfConstructorObject = typeof o.constructor === 'function';
let r;
if (strict === true) {
r = (instanceOfObject || typeOfObject) && (constructorUndefined || constructorObject);
} else {
r = (constructorUndefined || typeOfConstructorObject);
}
return r;
};
এই প্রয়োগের উপর ভিত্তি করে এনপিএম ভি 1 তে ইতিমধ্যে প্যাকেজ তৈরি হয়েছে! এবং এটি পূর্বের বর্ণিত সমস্ত পরীক্ষার ক্ষেত্রে কাজ করে! 🙂
isDate
শক্তিশালী কোডটি লেখার উদ্দেশ্যে আপনার ডেটঅবজেক্টের জন্য আপনাকে ব্যবহার করতে হবে অন্যথায় আপনার নখর isObject
পদ্ধতি হবে will
Date
কারণ হ্যাঁ আমার মন্তব্যে মন্দ নির্বাচিত হয়েছে, উত্তর নিয়ে আলোচনা করেন Date
। তবে Date
অসীম সম্ভাব্য ক্লাসগুলির মধ্যে একটি মাত্র এবং পয়েন্টটি অন্য কোনও শ্রেণীর জন্য ধারন করে। উদাহরণ: class Foo() { }; var x = new Foo(); isObject(x)
আয় false
। আমি ঠিক জানি না ওপির ব্যবহারের ক্ষেত্রে কী, তবে দৃশ্যের ধারণা নেওয়া সহজ যেগুলিতে সমস্ত সম্ভাব্য ক্লাস সম্পর্কে জেনে রাখা এবং তাদের প্রত্যেকের বিরুদ্ধে বিশেষভাবে পরীক্ষা করা অপরিহার্য হতে চলেছে।
হে ভগবান! আমি মনে করি এটি আগের চেয়ে আরও খাটো হতে পারে, এটি দেখুন:
function isObject(obj)
{
return obj != null && obj.constructor.name === "Object"
}
console.log(isObject({})) // returns true
console.log(isObject([])) // returns false
console.log(isObject(null)) // returns false
টাইপ জাভাস্ক্রিপ্ট অবজেক্ট (সহ null
) প্রদান"object"
console.log(typeof null, typeof [], typeof {})
তাদের constructor
সম্পত্তি সম্পর্কিত সম্পত্তি যাচাই করা তাদের নামগুলি দিয়ে কাজ করে।
console.log(({}).constructor) // returns a function with name "Object"
console.log(([]).constructor) // returns a function with name "Array"
console.log((null).constructor) //throws an error because null does not actually have a property
Function.name
কোনও ক্রিয়াকলাপের "anonymous"
জন্য বা ক্লোজারগুলির জন্য কেবল পঠন নামটি দেয় ।
console.log(({}).constructor.name) // returns "Object"
console.log(([]).constructor.name) // returns "Array"
console.log((null).constructor.name) //throws an error because null does not actually have a property
দ্রষ্টব্য: 2018 সালের হিসাবে, ফাংশন.নাম আইই https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Global_Objects/Function/name# ব্রাউজার_সামগ্রিকতাতে কাজ করতে পারে না
Object.create(null)
এবং বেশিরভাগ ক্ষেত্রেই আপনি তা কেন করবেন ...?
ঠিক আছে, এর এই ধারণা দিতে অবজেক্ট, এছাড়াও নাল, বস্তু, অ্যারেগুলির এবং এমনকি তারিখ হয়, আপনি দেখতে যাতে আছে যাক প্রথম জাভাস্ক্রিপ্ট ফাংশন আপনার প্রশ্নের উত্তর, আগে না typeof obj === 'অবজেক্ট' পছন্দ একটি সহজ উপায়, তাই উপরে উল্লিখিত সমস্ত কিছুই সত্য হয়ে যাবে , তবে কোনও ফাংশন লিখে বা জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক ব্যবহার করে এটি পরীক্ষা করার উপায় রয়েছে, ঠিক আছে:
এখন, কল্পনা করুন আপনার কাছে এই বস্তুটি একটি আসল অবজেক্ট (নাল বা ফাংশন বা অ্যারে নয়):
var obj = {obj1: 'obj1', obj2: 'obj2'};
খাঁটি জাভাস্ক্রিপ্ট:
//that's how it gets checked in angular framework
function isObject(obj) {
return obj !== null && typeof obj === 'object';
}
অথবা
//make sure the second object is capitalised
function isObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
}
অথবা
function isObject(obj) {
return obj.constructor.toString().indexOf("Object") > -1;
}
অথবা
function isObject(obj) {
return obj instanceof Object;
}
উপরের মতো আপনার কোডগুলিতে কল করে আপনি কেবল এই ফাংশনগুলির একটি ব্যবহার করতে পারেন এবং এটি যদি কোনও বস্তু হয় তবে তা সত্য হবে:
isObject(obj);
আপনি যদি কোনও জাভাস্ক্রিপ্ট কাঠামো ব্যবহার করছেন তবে তারা সাধারণত আপনার জন্য এই ধরণের ফাংশন প্রস্তুত করে থাকে, এগুলির মধ্যে কয়েকটি হ'ল:
JQuery:
//It returns 'object' if real Object;
jQuery.type(obj);
কৌণিক:
angular.isObject(obj);
ইন্ডস্কোর এবং লোডাশ:
//(NOTE: in Underscore and Lodash, functions, arrays return true as well but not null)
_.isObject(obj);
এটি "একটি বস্তু" দিয়ে আপনি কী বোঝাতে চেয়েছেন তা নির্ভর করে। আপনি যদি এমন কিছু চান যা আদিম নয় , অর্থাৎ এমন নতুন জিনিস যা আপনি নতুন বৈশিষ্ট্য সেট করতে পারেন তবে এই কৌশলটি করা উচিত:
function isAnyObject(value) {
return value != null && (typeof value === 'object' || typeof value === 'function');
}
এটা তোলে প্রিমিটিভের বাদ (সাধারণ সংখ্যার / NaN
/ Infinity
, প্লেইন স্ট্রিং, চিহ্ন, true
/ false
, undefined
এবং null
) কিন্তু অন্য সব কিছুর (তত্সহ জন্য সত্য ফেরত পাঠাবেন Number
, Boolean
এবং String
বস্তু)। নোট করুন যে জেএস কোন "হোস্ট" অবজেক্টগুলি যেমন সংজ্ঞা দেয় না যেমন ব্যবহার করা হয় window
বা console
ফিরে আসা উচিত typeof
, সুতরাং এগুলি যেমন চেক দিয়ে আচ্ছাদন করা শক্ত।
যদি আপনি জানতে চান যে কোনও কিছু "প্লেইন" অবজেক্ট, অর্থাৎ এটি আক্ষরিক হিসাবে {}
বা এর সাথে তৈরি হয়েছিল তবে Object.create(null)
আপনি এটি করতে পারেন:
function isPlainObject(value) {
if (Object.prototype.toString.call(value) !== '[object Object]') {
return false;
} else {
var prototype = Object.getPrototypeOf(value);
return prototype === null || prototype === Object.prototype;
}
}
সম্পাদনা করুন 2018 : যেহেতু Symbol.toStringTag
এখন আউটপুট কাস্টমাইজ পারবেন Object.prototype.toString.call(...)
, isPlainObject
শক্তি প্রত্যাবর্তন উপরের ফাংশন false
কিছু ক্ষেত্রে এমনকি যখন বস্তুর একটি আক্ষরিক তার জীবন শুরু করেন। যুক্তিযুক্তভাবে, কনভেনশন অনুসারে একটি কাস্টম স্ট্রিং ট্যাগযুক্ত কোনও বস্তু আর কোনও সরল বস্তু নয়, তবে এটি জাভাস্ক্রিপ্টে একটি সরল বস্তু এমনকি কী এর সংজ্ঞাটিকে আরও বিচলিত করে তুলেছে।
instanceof Object
হ'ল দুটি অভিন্ন ফাংশন লিটারাল কঠোরভাবে সমান হয় না, তারা রেফারেন্স ইত্যাদির মাধ্যমে পাস হয়
আমার Godশ্বর, অন্যান্য উত্তরে খুব বিভ্রান্তি।
সংক্ষিপ্ত উত্তর
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array)
এটি পরীক্ষা করতে কেবল ক্রোম কনসোলে নিম্নলিখিত বিবৃতিগুলি চালান।
মামলা 1.
var anyVar = {};
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array) // true
মামলা 2।
anyVar = [];
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array) // false
মামলা 3।
anyVar = null;
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array); // false
ব্যাখ্যা
ঠিক আছে। এটিকে ভেঙে দিন
typeof anyVar == 'object'
তিন প্রার্থীর কাছ থেকে সত্য প্রত্যাবর্তিত হয়েছে - [], {} and null
,
anyVar instanceof Object
এই প্রার্থীদের দু'জনে নামিয়ে দেওয়া - [], {}
!(anyVar instanceof Array)
শুধুমাত্র একটি থেকে সংকীর্ণ - {}
ড্রাম রোল প্লিজ!
এটি দ্বারা আপনি ইতিমধ্যে জাভাস্ক্রিপ্টে অ্যারের জন্য কীভাবে চেক করবেন তা শিখে থাকতে পারেন।
false
যখন anyVar
ফাংশন হয় তখন এটি (পছন্দসই হিসাবে ) ও ফিরে আসে ।
কোনও মানের ধরণের চেক করার সবচেয়ে যুক্তিসঙ্গত উপায়টি typeof
অপারেটর বলে মনে হয় । একমাত্র সমস্যা হ'ল এটি ভয়াবহভাবে ভেঙে গেছে:
"object"
জন্য ফিরে আসে null
, যা নুল টাইপের অন্তর্গত।"function"
কলযোগ্য বস্তুর জন্য প্রত্যাবর্তন করে, যা বস্তুর ধরণের to"unknown"
। একমাত্র নিষিদ্ধ ফলাফলগুলি "function"
এবং আদিম ধরণের।typeof
অ- null
আদিমদের জন্য কেবল নির্ভরযোগ্য । সুতরাং মানটি কোনও বস্তু কিনা তা পরীক্ষা করার উপায়টি নিশ্চিত করবে যে যে স্ট্রিংটি এসেছে typeof
তার কোনও আদিমতার সাথে মিল নেই এবং এটি বস্তুটি নয় null
। তবে সমস্যাটি হ'ল ভবিষ্যতের মানক একটি নতুন আদিম ধরণের প্রবর্তন করতে পারে এবং আমাদের কোড এটিকে একটি অবজেক্ট হিসাবে বিবেচনা করবে। নতুন ধরনের প্রায়শই দেখা যায় না, তবে উদাহরণস্বরূপ ECMAScript 6 সিম্বল প্রকারটি প্রবর্তন করেছিল।
অতএব, পরিবর্তে typeof
, আমি কেবলমাত্র এমন পদ্ধতির পরামর্শ দিচ্ছি যার ফলাফলের উপর নির্ভর করে যদি মান কোনও বস্তু হয় বা না হয়। নিম্নলিখিত একটি হতে মনস্থ করে
Object
নির্মাতা
Object
কন্সট্রাকটর একটি বস্তু প্রেরণ যুক্তি coerces। যদি এটি ইতিমধ্যে কোনও অবজেক্ট থাকে তবে একই বস্তুটি ফিরে আসবে।
অতএব, আপনি এটি কোনও বস্তুর সাথে মান চাপিয়ে দেওয়ার জন্য ব্যবহার করতে পারেন এবং সেই বস্তুকে মূল মানের সাথে কঠোরভাবে তুলনা করতে পারেন।
নিম্নলিখিত ফাংশনটির জন্য ECMAScript 3 প্রয়োজন যা প্রবর্তিত ===
:
function isObject(value) { /* Requires ECMAScript 3 or later */
return Object(value) === value;
}
আমি এই পদ্ধতির পছন্দ করি কারণ এটি সহজ এবং স্ব-বর্ণনামূলক, এবং একটি অ্যালোগুলস চেক বুলিয়ান, সংখ্যা এবং স্ট্রিংয়ের জন্যও কাজ করবে। তবে সচেতন থাকুন এটি বিশ্বব্যাপী Object
ছায়া বা পরিবর্তিত না হওয়ার উপর নির্ভর করে ।
কন্সট্রাকটর
আপনি যখন কোনও কনস্ট্রাক্টর ইনস্ট্যান্ট করেন, এটি সুনির্দিষ্টভাবে তৈরির উদাহরণের চেয়ে আলাদা মান দিতে পারে। তবে কোনও মান না থাকলে মানটি উপেক্ষা করা হবে it's
নিম্নলিখিত ফাংশনটির জন্য ECMAScript 3 প্রয়োজন যা কনস্ট্রাক্টরকে অ-অবজেক্টগুলি ফেরত দেওয়ার অনুমতি দেয়। ECMAScript 3 এর আগে যা ত্রুটি ছুঁড়েছিল, কিন্তু try
বিবৃতিগুলি তখন উপস্থিত ছিল না।
function isObject(value) { /* Requires ECMAScript 3 or later */
return new function() { return value; }() === value;
}
পূর্ববর্তী উদাহরণের তুলনায় কিছুটা কম সরল হলেও, এটি কোনও বিশ্বব্যাপী সম্পত্তির উপর নির্ভর করে না এবং এটি সবচেয়ে নিরাপদ হতে পারে।
this
মান
পুরানো ECMAScript স্পেসিফিকেশনগুলির জন্য this
একটি বস্তুর মান হওয়া দরকার। ECMAScript 3 চালু হয়েছে Function.prototype.call
, যা একটি স্বেচ্ছাসেবী this
মান সহ একটি ফাংশন কল করতে অনুমতি দেয় , কিন্তু একটি বস্তুকে জোর করে।
ECMAScript 5 একটি কঠোর মোড প্রবর্তন করেছে যা এই আচরণটি সরিয়ে ফেলেছে, কিন্তু opালু মোডে আমরা এখনও (তবে তর্কসাপেক্ষে উচিত নয়) এর উপর নির্ভর করতে পারি।
function isObject(value) { /* Requires ECMAScript 3 or later in sloppy mode */
return function() { return this === value; }.call(value);
}
[[Prototype]] এ
সমস্ত সাধারণ অবজেক্টের [[প্রোটোটাইপ]] নামে একটি অভ্যন্তরীণ স্লট থাকে, যার মান নির্ধারণ করে যে এটি অন্য কোন বস্তু থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। মানটি কেবল একটি বস্তু বা হতে পারে null
। অতএব, আপনি পছন্দসই মান থেকে উত্তরাধিকারসূত্রে একটি অবজেক্ট তৈরি করার চেষ্টা করতে পারেন এবং এটি কাজ করেছে কিনা তা পরীক্ষা করতে পারেন।
উভয় Object.create
এবং Object.getPrototypeOf
ECMAScript 5 প্রয়োজন।
function isObject(value) { /* Requires ECMAScript 5 or later */
try {
Object.create(value);
return value !== null;
} catch(err) {
return false;
}
}
function isObject(value) { /* Requires ECMAScript 5 or later */
function Constructor() {}
Constructor.prototype = value;
return Object.getPrototypeOf(new Constructor()) === value;
}
কিছু নতুন ECMAScript 6 টি উপায়
ECMAScript 6 টি নতুন কিছু অপ্রত্যক্ষ উপায়ের সাথে পরিচয় করিয়ে দেয় যা একটি মান check তারা কিছু কোডের মান পাস করার জন্য পূর্বে দেখা পদ্ধতির ব্যবহার করে যার try
ত্রুটিগুলি ধরায় একটি বিবৃতিতে আবৃত করা প্রয়োজন । কিছু লুকানো উদাহরণ, মন্তব্য করার মতো নয়
দ্রষ্টব্য: আমি ইচ্ছাকৃতভাবে কিছু পদ্ধতিগুলি Object.getPrototypeOf(value)
(ES5) এবং Reflect
পদ্ধতিগুলি (ES6) এড়িয়ে গেছি কারণ তারা প্রয়োজনীয় অভ্যন্তরীণ পদ্ধতিগুলি কল করে যা দুষ্টু জিনিসগুলি করতে পারে, যেমন যদি value
প্রক্সি হয়। সুরক্ষার কারণে আমার উদাহরণগুলি value
সরাসরি এটি অ্যাক্সেস না করে কেবল উল্লেখ করে।
এটা চেষ্টা কর
if (objectName instanceof Object == false) {
alert('Not an object');
}
else {
alert('An object');
}
Object.prototype instanceof Object
-> মিথ্যা। Object.create(null) instanceof Object
-> মিথ্যা।
new Date() instanceof Object
=> সত্য
function isObject(o) {
return null != o &&
typeof o === 'object' &&
Object.prototype.toString.call(o) === '[object Object]';
}
function isDerivedObject(o) {
return !isObject(o) &&
null != o &&
(typeof o === 'object' || typeof o === 'function') &&
/^\[object /.test(Object.prototype.toString.call(o));
}
// Loose equality operator (==) is intentionally used to check
// for undefined too
// Also note that, even null is an object, within isDerivedObject
// function we skip that and always return false for null
জাভাস্ক্রিপ্টে, null
, Object
, Array
, Date
এবং function
গুলি সব বস্তু। যদিও, null
কিছুটা স্বীকৃত। সুতরাং, এটি null
শূন্য নয় তা সনাক্ত করার জন্য প্রথমে পরীক্ষা করা ভাল ।
typeof o === 'object'
গ্যারান্টির জন্য চেক করা o
যা একটি বস্তু। এই চেক ছাড়া, Object.prototype.toString
, অর্থহীন হবে যেহেতু এটি everthing, এমনকি জন্য বস্তু ফিরে আসবে undefined
এবং null
! যেমন: toString(undefined)
রিটার্ন [object Undefined]
!
পরে typeof o === 'object'
চেক toString.call (O) কিনা তা যাচাই করতে একটি দুর্দান্ত পদ্ধতি o
একটি বস্তু, মত একটি উদ্ভূত বস্তুর Array
, Date
অথবা একটি function
।
ইন isDerivedObject
ফাংশন, এটা চেক জন্য o
একটা ফাংশন। কারণ, একটি বস্তুও ফাংশন করুন, সে কারণেই এটি রয়েছে। যদি এটি না করে তবে ফাংশনটি মিথ্যা হিসাবে ফিরে আসবে। উদাহরণ: isDerivedObject(function() {})
ফিরে আসবে false
, তবে এখন এটি ফিরে আসবে true
।
যে কোনও বস্তু কী তার সংজ্ঞাটি সর্বদা পরিবর্তন করা যায়। সুতরাং, কেউ সেই অনুযায়ী এই ফাংশন পরিবর্তন করতে পারেন।
function isObject(o) {
return null != o &&
typeof o === 'object' &&
Object.prototype.toString.call(o) === '[object Object]';
}
function isDerivedObject(o) {
return !isObject(o) &&
null != o &&
(typeof o === 'object' || typeof o === 'function') &&
/^\[object /.test(Object.prototype.toString.call(o));
}
// TESTS
// is null an object?
console.log(
'is null an object?', isObject(null)
);
console.log(
'is null a derived object?', isDerivedObject(null)
);
// is 1234 an object?
console.log(
'is 1234 an object?', isObject(1234)
);
console.log(
'is 1234 a derived object?', isDerivedObject(1234)
);
// is new Number(1234) an object?
console.log(
'is new Number(1234) an object?', isObject(new Number(1234))
);
console.log(
'is new Number(1234) a derived object?', isDerivedObject(1234)
);
// is function object an object?
console.log(
'is (new (function (){})) an object?',
isObject((new (function (){})))
);
console.log(
'is (new (function (){})) a derived object?',
isObject((new (function (){})))
);
// is {} an object?
console.log(
'is {} an object?', isObject({})
);
console.log(
'is {} a derived object?', isDerivedObject({})
);
// is Array an object?
console.log(
'is Array an object?',
isObject([])
)
console.log(
'is Array a derived object?',
isDerivedObject([])
)
// is Date an object?
console.log(
'is Date an object?', isObject(new Date())
);
console.log(
'is Date a derived object?', isDerivedObject(new Date())
);
// is function an object?
console.log(
'is function an object?', isObject(function(){})
);
console.log(
'is function a derived object?', isDerivedObject(function(){})
);
যদি আপনি চেক করতে চান, তাহলে prototype
একটি জন্য object
একমাত্র থেকে আসে Object
। ফিল্টার আউট String
, Number
, Array
, Arguments
, ইত্যাদি
function isObject (n) {
return Object.prototype.toString.call(n) === '[object Object]';
}
বা একটি একক-এক্সপ্রেশন তীর ফাংশন হিসাবে (ES6 +)
const isObject = n => Object.prototype.toString.call(n) === '[object Object]'
return Object.prototype.toString.call(n) === '[object Object]'
null
Object.prototype.toString.call(null) === '[object Null]'
var a = [1]
typeof a //"object"
a instanceof Object //true
a instanceof Array //true
var b ={a: 1}
b instanceof Object //true
b instanceof Array //false
var c = null
c instanceof Object //false
c instanceof Array //false
আমাকে আরও বিশদ সরবরাহ করতে বলা হয়েছিল। আমাদের পরিবর্তনশীল কোনও বস্তু কিনা তা যাচাইয়ের সর্বাধিক পরিষ্কার এবং বোধগম্য উপায় typeof myVar
। এটি একটি টাইপ (যেমন "object"
, "undefined"
) সহ একটি স্ট্রিং প্রদান করে ।
দুর্ভাগ্যক্রমে অ্যারে এবং নাল উভয়ই একটি টাইপ আছে object
। কেবল আসল অবজেক্ট নিতে instanceof
অপারেটর ব্যবহার করে উত্তরাধিকার শৃঙ্খলা পরীক্ষা করা দরকার । এটি নাল দূর করবে, তবে অ্যারেটির উত্তরাধিকার শৃঙ্খলে অবজেক্ট রয়েছে।
সুতরাং সমাধানটি হ'ল:
if (myVar instanceof Object && !(myVar instanceof Array)) {
// code for objects
}
/./ instanceof Object //true
সামান্য দেরিতে ... "প্লেইন অবজেক্টস" এর জন্য (মানে, 'x': 5, 'y': 7}) এর কাছে আমার এই ছোট স্নিপেট রয়েছে:
function isPlainObject(o) {
return ((o === null) || Array.isArray(o) || typeof o == 'function') ?
false
:(typeof o == 'object');
}
এটি পরবর্তী আউটপুট উত্পন্ন করে:
console.debug(isPlainObject(isPlainObject)); //function, false
console.debug(isPlainObject({'x': 6, 'y': 16})); //literal object, true
console.debug(isPlainObject(5)); //number, false
console.debug(isPlainObject(undefined)); //undefined, false
console.debug(isPlainObject(null)); //null, false
console.debug(isPlainObject('a')); //string, false
console.debug(isPlainObject([])); //array?, false
console.debug(isPlainObject(true)); //bool, false
console.debug(isPlainObject(false)); //bool, false
এটা সবসময় আমার জন্য কাজ করে। যদি "সত্য" কেবল তখনই ফিরে আসে যদি "ও" প্রকারটি "অবজেক্ট" হয় তবে নাল, বা অ্যারে বা ফাংশন হয় না। :)
লোড্যাশের রয়েছে আইপ্লেইন অবজেক্ট , যা এই পৃষ্ঠায় আসা অনেকেই সন্ধান করতে পারে। কোনও ফাংশন বা অ্যারে দেওয়ার সময় এটি মিথ্যা প্রত্যাবর্তন করে।
_.isObject
যে জেএস কোনও জিনিসকে কী বিবেচনা করে তার সাথে কোনটি মেলে। তবে আমার সাধারণত যা প্রয়োজন তা হ'ল উদাহরণস্বরূপ একটি বস্তু আক্ষরিক এবং একটি অ্যারের মধ্যে পার্থক্য করা, যা _.isPlainObject
আমাকে ঠিক তাই করতে দেয়।
এটি কাজ করবে। এটি এমন একটি ফাংশন যা সত্য, মিথ্যা বা সম্ভবত বাতিল হয়ে যায়।
const isObject = obj => obj && obj.constructor && obj.constructor === Object;
console.log(isObject({})); // true
console.log(isObject([])); // false
console.log(isObject(new Function)); // false
console.log(isObject(new Number(123))); // false
console.log(isObject(null)); // null
null
বরং চূড়ান্ত পরীক্ষার ফলাফল হিসাবে পেয়েছি false
। দেখুন আমি কোডটি সম্পর্কিত সম্পাদনাগুলি করা উচিত কবে?
যেহেতু এই সমস্যাটি সঠিকভাবে পরিচালনা করতে হবে তা নিয়ে প্রচুর বিভ্রান্তি দেখা যাচ্ছে, তাই আমি আমার 2 সেন্ট রেখে যাব (এই উত্তরটি অনুগত এবং এটি প্রতিটি পরিস্থিতিতে সঠিক ফলাফল আনবে):
আদিমদের জন্য পরীক্ষা:
undefined
null
boolean
string
number
function isPrimitive(o){return typeof o!=='object'||null}
কোনও বস্তু আদিম নয়:
function isObject(o){return !isPrimitive(o)}
বা বিকল্পভাবে:
function isObject(o){return o instanceof Object}
function isPrimitive(o){return !isObject(o)}
যে কোনও অ্যারে পরীক্ষা করা:
const isArray=(function(){
const arrayTypes=Object.create(null);
arrayTypes['Array']=true;
arrayTypes['Int8Array']=true;
arrayTypes['Uint8Array']=true;
arrayTypes['Uint8ClampedArray']=true;
arrayTypes['Int16Array']=true;
arrayTypes['Uint16Array']=true;
arrayTypes['Int32Array']=true;
arrayTypes['Uint32Array']=true;
arrayTypes['BigInt64Array']=true;
arrayTypes['BigUint64Array']=true;
arrayTypes['Float32Array']=true;
arrayTypes['Float64Array']=true;
return function(o){
if (!o) return false;
return !isPrimitive(o)&&!!arrayTypes[o.constructor.name];
}
}());
বাদ দিয়ে অবজেক্টের জন্য পরীক্ষা করা: যে Date
RegExp
Boolean
Number
String
Function
কোনও অ্যারে
const isObjectStrict=(function(){
const nativeTypes=Object.create(null);
nativeTypes['Date']=true;
nativeTypes['RegExp']=true;
nativeTypes['Boolean']=true;
nativeTypes['Number']=true;
nativeTypes['String']=true;
nativeTypes['Function']=true;
return function(o){
if (!o) return false;
return !isPrimitive(o)&&!isArray(o)&&!nativeTypes[o.constructor.name];
}
}());
যখন সমস্ত কিছু ব্যর্থ হয়, আমি এটি ব্যবহার করি:
var isObject = function(item) {
return item.constructor.name === "Object";
};
item.constructor === Object
?
null
একটি ব্যতিক্রম ছুঁড়েUncaught TypeError: Cannot read property 'constructor' of null(…)
indexOf
নাকি constructor.name
?
Ramda কার্মিক গ্রন্থাগার জাভাস্ক্রিপ্ট ধরনের detecting জন্য একটি বিস্ময়কর ফাংশন আছে।
সম্পূর্ণ ফাংশন প্যারাফ্রেসিং :
function type(val) {
return val === null ? 'Null' :
val === undefined ? 'Undefined' :
Object.prototype.toString.call(val).slice(8, -1);
}
সমাধানটি কতটা সহজ এবং সুন্দর তা বুঝতে পেরে আমাকে হাসতে হয়েছিল।
রামদা ডকুমেন্টেশন থেকে ব্যবহারের উদাহরণ :
R.type({}); //=> "Object"
R.type(1); //=> "Number"
R.type(false); //=> "Boolean"
R.type('s'); //=> "String"
R.type(null); //=> "Null"
R.type([]); //=> "Array"
R.type(/[A-z]/); //=> "RegExp"
R.type(() => {}); //=> "Function"
R.type(undefined); //=> "Undefined"
পড়া ও বাস্তবায়নের অনেক চেষ্টা আউট পর, আমি লক্ষ্য করেছি যে খুব কম লোকই মত মান পরীক্ষা করার জন্য চেষ্টা JSON
, Math
,document
1 টি পদক্ষেপ চেয়ে দীর্ঘতর প্রোটোটাইপ চেইন সহ বা বস্তু।
typeof
আমাদের ভেরিয়েবলের পরীক্ষা করার এবং তারপরে প্রান্ত-কেসগুলি হ্যাক করার পরিবর্তে , আমি ভেবেছিলাম যে চেকটি রিফ্যাক্টরটি এড়াতে যতটা সম্ভব সরল রাখলে নতুন আদিম বা নেটিভ অবজেক্টস যুক্ত হয়েছে যা রেজিস্টার হিসাবে যুক্ত হয়েছেtypeof
'অবজেক্ট' '।
সর্বোপরি, typeof
অপারেটর আপনাকে জানায় যে কোনও জিনিস জাভাস্ক্রিপ্টের জন্য কোনও বস্তু কিনা, তবে জাভাস্ক্রিপ্টের কোনও সামগ্রীর সংজ্ঞা বেশিরভাগ বাস্তব-বিশ্বের পরিস্থিতিগুলির জন্য খুব বেশি বিস্তৃত (যেমন typeof null === 'object'
)। নীচে একটি ফাংশন দেওয়া হয়েছে যা ভেরিয়েবলটি v
মূলত দুটি চেক পুনরাবৃত্তি করে একটি বস্তু কিনা তা নির্ধারণ করে:
v
হয় '[object Object]'
। v
চেইনের সাথে পরবর্তী প্রোটোটাইপ দিয়ে প্রতিস্থাপন করা হয় তবে v = Object.getPrototypeOf(v)
পরে সরাসরি মূল্যায়নও করা হয়। যখন এর নতুন মান v
হয় null
, এর অর্থ হ'ল রুট প্রোটোটাইপ সহ প্রতিটি প্রোটোটাইপ (যা চেইনের অভ্যন্তরে একমাত্র প্রোটোটাইপ হতে পারে ) সেই সময় লুপটিতে পাস করে এবং আমরা সত্যটিতে ফিরে আসতে পারি। অন্যথায়, একটি নতুন পুনরাবৃত্তি শুরু হয়।function isObj (v) {
while ( Object.prototype.toString.call(v) === '[object Object]')
if ((v = Object.getPrototypeOf(v)) === null)
return true
return false
}
console.log('FALSE:')
console.log('[] -> ', isObj([]))
console.log('null -> ', isObj(null))
console.log('document -> ', isObj(document))
console.log('JSON -> ', isObj(JSON))
console.log('function -> ', isObj(function () {}))
console.log('new Date() -> ', isObj(new Date()))
console.log('RegExp -> ', isObj(/./))
console.log('TRUE:')
console.log('{} -> ', isObj({}))
console.log('new Object() -> ', isObj(new Object()))
console.log('new Object(null) -> ', isObj(new Object(null)))
console.log('new Object({}) -> ', isObj(new Object({foo: 'bar'})))
console.log('Object.prototype -> ', isObj(Object.prototype))
console.log('Object.create(null) -> ', isObj(Object.create(null)))
console.log('Object.create({}) -> ', isObj(Object.create({foo: 'bar'})))
console.log('deep inheritance -> ', isObj(Object.create(Object.create({foo: 'bar'}))))
if(typeof value === 'object' && value.constructor === Object)
{
console.log("This is an object");
}
value
হয় তবে এটি null
একটি ত্রুটি ছুঁড়ে ফেলবে ...
false
বস্তুর জন্য হবে Object.assign({}, {constructor: null})
।
এটি একটি পুরানো প্রশ্ন তবে এটিকে এখানে রেখেই ভাবেন। বেশিরভাগ লোকেরা ভেরিয়েবলটি {}
কী-মূল্যের জোড়যুক্ত অর্থ কিনা তা যাচাই করছেন এবং জাভাস্ক্রিপ্ট কোনও প্রদত্ত জিনিসের জন্য যে আন্ডারলাইনটি ব্যবহার করছেন তা জাভাস্ক্রিপ্টের বেশিরভাগ ক্ষেত্রেই সত্যই নিখুঁত বলে মনে হচ্ছে। সুতরাং যে উপায় থেকে নেওয়া। যদি তুমি করো...
let x = function() {}
typeof x === 'function' //true
x === Object(x) // true
x = []
x === Object(x) // true
// also
x = null
typeof null // 'object'
বেশিরভাগ সময় আমরা যা চাই তা হ'ল আমাদের যদি কোনও API থেকে কোনও রিসোর্স অবজেক্ট থাকে বা ORM থেকে আমাদের ডাটাবেস কলটি ফিরে আসে returned তারপরে আমরা পরীক্ষা করতে পারি যদি এটি একটি Array
না হয় null
, হয় না, টাইপফোন না হয় 'function'
এবং এটি হয় তবেObject
// To account also for new Date() as @toddmo pointed out
x instanceof Object && x.constructor === Object
x = 'test' // false
x = 3 // false
x = 45.6 // false
x = undefiend // false
x = 'undefiend' // false
x = null // false
x = function(){} // false
x = [1, 2] // false
x = new Date() // false
x = {} // true
true
জন্যnew Date()
new Date()
আমি যেটি ব্যবহার করতে পছন্দ করি তা এটি
function isObject (obj) {
return typeof(obj) == "object"
&& !Array.isArray(obj)
&& obj != null
&& obj != ""
&& !(obj instanceof String) }
আমি মনে করি বেশিরভাগ ক্ষেত্রে একটি তারিখ অবশ্যই অবজেক্ট হিসাবে চেকটি পাস করে, তাই আমি তারিখগুলি ফিল্টার করি না
আমি এই "এই প্রশ্নটি থেকে এই জাতীয় ধরণের চেক করার জন্য একটি নতুন উপায় খুঁজে পেয়েছি: উদাহরণস্বরূপ কিছু আক্ষরিকের জন্য কেন মিথ্যা প্রত্যাবর্তন হয়?
সেই থেকে, আমি নীচে টাইপ চেকিংয়ের জন্য একটি ফাংশন তৈরি করেছি:
function isVarTypeOf(_var, _type){
try {
return _var.constructor === _type;
} catch(ex) {
return false; //fallback for null or undefined
}
}
তাহলে আপনি ঠিক করতে পারেন:
console.log(isVarTypeOf('asdf', String)); // returns true
console.log(isVarTypeOf(new String('asdf'), String)); // returns true
console.log(isVarTypeOf(123, String)); // returns false
console.log(isVarTypeOf(123, Number)); // returns true
console.log(isVarTypeOf(new Date(), String)); // returns false
console.log(isVarTypeOf(new Date(), Number)); // returns false
console.log(isVarTypeOf(new Date(), Date)); // returns true
console.log(isVarTypeOf([], Object)); // returns false
console.log(isVarTypeOf([], Array)); // returns true
console.log(isVarTypeOf({}, Object)); // returns true
console.log(isVarTypeOf({}, Array)); // returns false
console.log(isVarTypeOf(null, Object)); // returns false
console.log(isVarTypeOf(undefined, Object)); // returns false
console.log(isVarTypeOf(false, Boolean)); // returns true
এটি ক্রোম 56, ফায়ারফক্স 52, মাইক্রোসফ্ট এজ 38, ইন্টারনেট এক্সপ্লোরার 11, অপেরা 43 এ পরীক্ষিত
সম্পাদনা:
আপনি যদি ভেরিয়েবলটি নাল বা অপরিজ্ঞাত কিনা তা পরীক্ষা করতে চান তবে আপনি এটির পরিবর্তে এটি ব্যবহার করতে পারেন:
function isVarTypeOf(_var, _type){
try {
return _var.constructor === _type;
} catch(ex) {
return _var == _type; //null and undefined are considered the same
// or you can use === if you want to differentiate them
}
}
var a = undefined, b = null;
console.log(isVarTypeOf(a, undefined)) // returns true
console.log(isVarTypeOf(b, undefined)) // returns true
console.log(isVarTypeOf(a, null)) // returns true
ইনঙ্কের মন্তব্য থেকে আপডেট: চ্যালেঞ্জ গৃহীত: ডি
আপনি যদি তুলনামূলক অবজেক্টগুলি আলগা করতে চান তবে আপনি এইভাবে চেষ্টা করতে পারেন:
function isVarTypeOf(_var, _type, looseCompare){
if (!looseCompare){
try {
return _var.constructor === _type;
} catch(ex){
return _var == _type;
}
} else {
try{
switch(_var.constructor){
case Number:
case Function:
case Boolean:
case Symbol:
case Date:
case String:
case RegExp:
// add all standard objects you want to differentiate here
return _var.constructor === _type;
case Error:
case EvalError:
case RangeError:
case ReferenceError:
case SyntaxError:
case TypeError:
case URIError:
// all errors are considered the same when compared to generic Error
return (_type === Error ? Error : _var.constructor) === _type;
case Array:
case Int8Array:
case Uint8Array:
case Uint8ClampedArray:
case Int16Array:
case Uint16Array:
case Int32Array:
case Uint32Array:
case Float32Array:
case Float64Array:
// all types of array are considered the same when compared to generic Array
return (_type === Array ? Array : _var.constructor) === _type;
case Object:
default:
// the remaining are considered as custom class/object, so treat it as object when compared to generic Object
return (_type === Object ? Object : _var.constructor) === _type;
}
} catch(ex){
return _var == _type; //null and undefined are considered the same
// or you can use === if you want to differentiate them
}
}
}
এইভাবে, আপনি ঠিক তেমন মন্তব্যের মত মন্তব্য করতে পারেন:
isVarTypeOf(new (function Foo(){}), Object); // returns false
isVarTypeOf(new (function Foo(){}), Object, true); // returns true
অথবা
Foo = function(){};
Bar = function(){};
isVarTypeOf(new Foo(), Object); // returns false
isVarTypeOf(new Foo(), Object, true); // returns true
isVarTypeOf(new Bar(), Foo, true); // returns false
isVarTypeOf(new Bar(), Bar, true); // returns true
isVarTypeOf(new Bar(), Bar); // returns true
instanceof
অবজেক্টগুলির জন্য পরীক্ষা করতে ব্যবহার করতে পারেন । তবুও, এটি কোনও সঠিক বিজ্ঞান নয়।
new Foo()
কোনও Foo
বস্তুকে রিটার্ন দেয় , যেমন new String()
কোনও String
বস্তুকে new Date()
রিটার্ন দেয় বা কোনও Date
বস্তুকে রিটার্ন দেয় আপনি Foo = function(){}; isVarTypeOf(new Foo(), Foo);
তাও করতে পারেন
null
কোনও বস্তু কিনা )।