typeofঅপারেটর সত্যিই একটি বস্তুর বাস্তব টাইপ এটি আমাদেরকে সাহায্য করে না।
আমি ইতিমধ্যে নিম্নলিখিত কোডটি দেখেছি:
Object.prototype.toString.apply(t)
প্রশ্ন:
এটি কি বস্তুর প্রকারের পরীক্ষা করার সবচেয়ে সঠিক উপায়?
typeofঅপারেটর সত্যিই একটি বস্তুর বাস্তব টাইপ এটি আমাদেরকে সাহায্য করে না।
আমি ইতিমধ্যে নিম্নলিখিত কোডটি দেখেছি:
Object.prototype.toString.apply(t)
প্রশ্ন:
এটি কি বস্তুর প্রকারের পরীক্ষা করার সবচেয়ে সঠিক উপায়?
উত্তর:
জাভাস্ক্রিপ্ট স্পেসিফিকেশন কোনও বস্তুর শ্রেণি নির্ধারণ করার জন্য ঠিক একটি সঠিক উপায় দেয়:
Object.prototype.toString.call(t);
Object.prototype.toString.call(new FormData()) === "[object FormData]"যা সত্য হবে। আপনি পরিবর্তে slice(8, -1)ফিরে আসতে ব্যবহার করতে পারেনFormData[object FormData]
Object.prototypeএবং এর মধ্যে কোন পার্থক্য আছে {}?
Object.prototype.toString.call(new MyCustomObject())আয় [object Object]যেহেতু new MyCustomObject() instanceOf MyCustomObject returns trueযা কি আমি (যেমন, Chrome 54.0.2840.99 মিটার) চেয়েছিলাম
new MyCustomObject().constructor === MyCustomObject।
এটি Object.prototype.toStringএকটি ভাল উপায়, তবে এর অভিনয়টি সবচেয়ে খারাপ।
http://jsperf.com/check-js-type

ব্যবহার করুন typeofকিছু মৌলিক সমস্যা (স্ট্রিং, সংখ্যা, বুলিয়ান ...) এবং ব্যবহারের সমাধানের জন্য Object.prototype.toStringকিছু জটিল (মত বিন্যাস, তারিখ, RegExp) সমাধানের জন্য।
এবং এটি আমার সমাধান:
var type = (function(global) {
var cache = {};
return function(obj) {
var key;
return obj === null ? 'null' // null
: obj === global ? 'global' // window in browser or global in nodejs
: (key = typeof obj) !== 'object' ? key // basic: string, boolean, number, undefined, function
: obj.nodeType ? 'object' // DOM element
: cache[key = ({}).toString.call(obj)] // cached. date, regexp, error, object, array, math
|| (cache[key] = key.slice(8, -1).toLowerCase()); // get XXXX from [object XXXX], and cache it
};
}(this));
হিসাবে ব্যবহত:
type(function(){}); // -> "function"
type([1, 2, 3]); // -> "array"
type(new Date()); // -> "date"
type({}); // -> "object"
typeফাংশনটি ভাল, তবে দেখুন অন্য কিছু typeফাংশনের সাথে এটি কীভাবে তুলনা করে। http://jsperf.com/code-type-test-a-test
গৃহীত উত্তরটি সঠিক, তবে আমি বেশিরভাগ প্রকল্পগুলিতে এই সামান্য উপযোগটি সংজ্ঞায়িত করতে চাই।
var types = {
'get': function(prop) {
return Object.prototype.toString.call(prop);
},
'null': '[object Null]',
'object': '[object Object]',
'array': '[object Array]',
'string': '[object String]',
'boolean': '[object Boolean]',
'number': '[object Number]',
'date': '[object Date]',
}
এর মতো ব্যবহৃত:
if(types.get(prop) == types.number) {
}
আপনি যদি কৌণিক ব্যবহার করছেন তবে আপনি এটি পরিষ্কারভাবে ইনজেকশনও দিতে পারেন:
angular.constant('types', types);
var o = ...
var proto = Object.getPrototypeOf(o);
proto === SomeThing;
আপনি যে প্রোটোটাইপটি প্রত্যাশা করেছেন সেই প্রোটোটাইপে একটি হ্যান্ডেল রাখুন, তারপরে তার তুলনা করুন।
উদাহরণ স্বরূপ
var o = "someString";
var proto = Object.getPrototypeOf(o);
proto === String.prototype; // true
o instanceof String; //true?
"foo" instanceof Stringবিরতি কারণ
typeof(x)==='string'পরিবর্তে ব্যবহার করুন।
Object.getPrototypeOf(true)যেখানে ব্যর্থ (true).constructorআয় Boolean।
আমি যুক্তি দিয়েছি যে এখানে প্রদর্শিত বেশিরভাগ সমাধান অতিরিক্ত প্রকৌশলী হওয়ার কারণে ভুগছে। সম্ভবত কোনও মান টাইপ রয়েছে [object Object]কিনা তা যাচাই করার সবচেয়ে সহজ উপায় হল এর .constructorসম্পত্তিটির বিরুদ্ধে যাচাই করা:
function isObject (a) { return a != null && a.constructor === Object; }
বা তীর-ফাংশন সহ আরও খাটো:
const isObject = a => a != null && a.constructor === Object;
a != nullকারণ এক মধ্যে পাস পারে অংশ প্রয়োজনীয় nullবা undefinedআপনি এই উভয় থেকে একটি কন্সট্রাকটর সম্পত্তি নিষ্কাশন করতে পারবে না।
এটি এর মাধ্যমে তৈরি যে কোনও বস্তুর সাথে কাজ করে:
Objectনির্মাতা{}এর আর একটি ঝরঝরে বৈশিষ্ট্য হ'ল এটি হ'ল কাস্টম ক্লাসগুলির জন্য সঠিক প্রতিবেদন দেওয়ার ক্ষমতা যা ব্যবহার করে Symbol.toStringTag। উদাহরণ স্বরূপ:
class MimicObject {
get [Symbol.toStringTag]() {
return 'Object';
}
}
এখানে সমস্যাটি হ'ল এর Object.prototype.toStringউদাহরণটি কল করার সময় , মিথ্যা প্রতিবেদনটি [object Object]ফিরে আসবে:
let fakeObj = new MimicObject();
Object.prototype.toString.call(fakeObj); // -> [object Object]
তবে কনস্ট্রাক্টরের বিরুদ্ধে চেক করা সঠিক ফলাফল দেয়:
let fakeObj = new MimicObject();
fakeObj.constructor === Object; // -> false
রিয়েল প্রকারের কোনও অবজেক্ট (দেশীয় অবজেক্ট বা ডাটা টাইপের নাম (যেমন স্ট্রিং, তারিখ, নম্বর, .. ইত্যাদি) সহ এবং রিয়েল প্রকারের (এমনকি কাস্টমগুলি সহ) সন্ধান করার সর্বোত্তম উপায়; প্রোটোটাইপ নির্মাণকারীর নাম সম্পত্তি:
নেটিভ টাইপ এক্স 1:
var string1 = "Test";
console.log(string1.__proto__.constructor.name);
প্রদর্শন:
String
Ex2:
var array1 = [];
console.log(array1.__proto__.constructor.name);
প্রদর্শন:
Array
কাস্টম ক্লাস:
function CustomClass(){
console.log("Custom Class Object Created!");
}
var custom1 = new CustomClass();
console.log(custom1.__proto__.constructor.name);
প্রদর্শন:
CustomClass
nullবা undefined।
পুরানো প্রশ্ন আমি জানি। আপনার এটি রূপান্তর করার দরকার নেই। এই ফাংশনটি দেখুন:
function getType( oObj )
{
if( typeof oObj === "object" )
{
return ( oObj === null )?'Null':
// Check if it is an alien object, for example created as {world:'hello'}
( typeof oObj.constructor !== "function" )?'Object':
// else return object name (string)
oObj.constructor.name;
}
// Test simple types (not constructed types)
return ( typeof oObj === "boolean")?'Boolean':
( typeof oObj === "number")?'Number':
( typeof oObj === "string")?'String':
( typeof oObj === "function")?'Function':false;
};
উদাহরণ:
function MyObject() {}; // Just for example
console.log( getType( new String( "hello ") )); // String
console.log( getType( new Function() ); // Function
console.log( getType( {} )); // Object
console.log( getType( [] )); // Array
console.log( getType( new MyObject() )); // MyObject
var bTest = false,
uAny, // Is undefined
fTest function() {};
// Non constructed standard types
console.log( getType( bTest )); // Boolean
console.log( getType( 1.00 )); // Number
console.log( getType( 2000 )); // Number
console.log( getType( 'hello' )); // String
console.log( getType( "hello" )); // String
console.log( getType( fTest )); // Function
console.log( getType( uAny )); // false, cannot produce
// a string
স্বল্প ব্যয় এবং সহজ।
falseপরীক্ষা বস্তুর হলে nullবাundefined
trueবাfalse
false। এটি কীভাবে প্রশ্নের উত্তর দেয়?
উপরের সঠিক উত্তরগুলি দ্বারা অনুপ্রাণিত হয়ে আমি একটি সামান্য ধরণের চেক ইউটিলিটি একসাথে রেখেছি:
thetypeof = function(name) {
let obj = {};
obj.object = 'object Object'
obj.array = 'object Array'
obj.string = 'object String'
obj.boolean = 'object Boolean'
obj.number = 'object Number'
obj.type = Object.prototype.toString.call(name).slice(1, -1)
obj.name = Object.prototype.toString.call(name).slice(8, -1)
obj.is = (ofType) => {
ofType = ofType.toLowerCase();
return (obj.type === obj[ofType])? true: false
}
obj.isnt = (ofType) => {
ofType = ofType.toLowerCase();
return (obj.type !== obj[ofType])? true: false
}
obj.error = (ofType) => {
throw new TypeError(`The type of ${name} is ${obj.name}: `
+`it should be of type ${ofType}`)
}
return obj;
};
উদাহরণ:
if (thetypeof(prop).isnt('String')) thetypeof(prop).error('String')
if (thetypeof(prop).is('Number')) // do something
nullবা undefinedবা trueবাfalse