ජාවාස්ක්රිප්ට් හි වටිනාකමක් වස්තුවක් දැයි ඔබ පරීක්ෂා කරන්නේ කෙසේද?
ජාවාස්ක්රිප්ට් හි වටිනාකමක් වස්තුවක් දැයි ඔබ පරීක්ෂා කරන්නේ කෙසේද?
Answers:
යාවත්කාලීන කිරීම :
මෙම පිළිතුර අසම්පූර්ණ වන අතර නොමඟ යවන ප්රති .ල ලබා දෙයි . නිදසුනක් ලෙස, ජාවාස්ක්රිප්ට් 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'
හි ස්ථාවර නොවන බව පෙනේ . ඔවුන් පැවසුවේ: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]
ජාවාස්ක්රිප්ට් හි "වස්තුව" යන්න අර්ථ දක්වමු . එම්ඩීඑන් ලේඛනයට අනුව , සෑම අගයක්ම වස්තුවක් හෝ ප්රාථමික එකක් වේ:
ප්රාථමික, ප්රාථමික අගය
වස්තුවක් නොවන සහ කිසිදු ක්රමයක් නොමැති දත්ත. ජාවාස්ක්රිප්ට් සතුව ප්රාථමික දත්ත වර්ග 5 ක් ඇත: නූල්, අංකය, බූලියන්, ශුන්ය, නිර්වචනය නොකළ.
ප්රාථමික යනු කුමක්ද?
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') );
}
An දාන්ගේ පිළිතුර ද ක්රියාත්මක වන බව පෙනේ:
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]'
පෙලගැස්මක් නොවන බව අරා සහ වස්තූන් අතර මෙම පැහැයක්
යමක් සැබවින්ම වස්තුවක් දැයි සොයා ගැනීමට underscore.js පහත සඳහන් ක්රමය සපයයි:
_.isObject = function(obj) {
return obj === Object(obj);
};
යාවත්කාලීන කරන්න
V8 හි පෙර දෝෂයක් සහ සුළු ක්ෂුද්ර වේග ප්රශස්තිකරණයක් නිසා, මෙම ක්රමය පහත පරිදි පෙනේ underscore.js 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]"
myVar වස්තුවක් නම්"[object Array]"
myVar අරාව නම්මේ පිළිබඳ වැඩි විස්තර සහ එය යතුරු ලියනය සඳහා හොඳ විකල්පයක් වන්නේ ඇයි, මෙම ලිපිය බලන්න .
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 () - සටහන: නව දිනය හෝ නව YourCustomObject වැනි අභිරුචි වස්තු සඳහා එය ව්යාජ ලෙස ආපසු ලබා දෙන බැවින්, වස්තු වචන සඳහා පමණක් භාවිතා කරන්න.
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)
: ( මෙන්න හේතුව )!
{
චරිතයකින් ආරම්භ වන දෙයක් ලෙස ය . අරාව නඩුව සඳහා, ඔබට IE <9 සඳහා සහය දැක්වීමට අවශ්ය නොවන තාක් කල් Array.isArray()
, යමක් අරාවක් දැයි තීරණය කිරීමට ඔබට භාවිතා කළ හැකිය . එය ඔබ ලබා දුන් සියලුම පරීක්ෂණ අවස්ථා සමත් වේ.
මම සරලවම කැමතියි:
function isObject (item) {
return (typeof item === "object" && !Array.isArray(item) && item !== null);
}
අයිතමය JS වස්තුවක් නම්, එය JS අරාව නොවේ, එය එසේ නොවේ 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)
මේ ඇති වන අරා නොවන වස්තුවක සුළු පටු counterexample වේ. අරා විශේෂිත වන්නේ ඒවා අභිරුචි [[DefineOwnProperty]] අත්යවශ්ය අභ්යන්තර ක්රමයක් සහිත විදේශීය වස්තූන් වන නමුත් ඒවා තවමත් වස්තූන්ය.
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
:වැරදි පිළිතුරු සඳහා කොපමණ ඉහළ ප්රතිශතයක් ඇත්දැයි පුදුමයි
my මගේ පරීක්ෂණ සමත්
වූයේ පිළිතුරු 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
ප්රති result ලයක් වශයෙන්, ඔබට දැඩි හා ශක්තිමත් කේතයක් ලැබෙනු ඇත!
ඔබ isDate
, වැනි කාර්යයන් නිර්මාණය නොකරන්නේ නම් isError
, isRegExp
මෙම සාමාන්යකරණය කළ ශ්රිත භාවිතා කිරීමට ඔබට විකල්පයක් සලකා බැලිය හැකිය:
function isObject(o) {
return o instanceof Object && typeof o.constructor === 'function';
}
කලින් සඳහන් කළ සියලුම පරීක්ෂණ අවස්ථා සඳහා එය නිවැරදිව ක්රියා නොකරනු ඇත, නමුත් එය සියලු වස්තු සඳහා ප්රමාණවත් (සරල හෝ ඉදිකරන ලද).
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;
};
මෙම ක්රියාත්මක කිරීම මත පදනම්ව දැනටමත් npm v1 හි පැකේජයක් නිර්මාණය කර ඇත ! කලින් විස්තර කර ඇති සියලුම පරීක්ෂණ අවස්ථා සඳහා එය ක්රියා කරයි! 🙂
isDate
ශක්තිමත් කේත ලිවීමේ අරමුණින් ඔබේ ඩේට් ඕබෙක්ට් සඳහා භාවිතා කළ යුතුය isObject
.
Date
මගේ අදහස් දැක්වීමේදී වැරදි ලෙස තෝරාගෙන ඇත්තේ ඔව්, පිළිතුර සාකච්ඡා කරන Date
බැවිනි. නමුත් Date
හැකි අනන්ත පංති වලින් එකක් පමණක් වන අතර එය වෙනත් ඕනෑම පන්තියකට අදාළ වේ. උදාහරණය: class Foo() { }; var x = new Foo(); isObject(x)
ප්රතිලාභ false
. OP හි භාවිත නඩුව කුමක්දැයි මම හරියටම නොදනිමි, නමුත් හැකි සෑම පංතියක් ගැනම දැන ගැනීම සහ ඒ සෑම එකක් ගැනම විශේෂයෙන් පරීක්ෂා කිරීම කළ නොහැකි තත්වයන් ගැන සිතීම පහසුය .
අහෝ මගේ දෙවියනේ! මෙය වෙන කවරදාටත් වඩා කෙටි විය හැකි යැයි මම සිතමි.
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 වන විට, Function.name IE හි ක්රියා නොකරනු ඇත https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Browser_compatibility
Object.create(null)
සහ ඔබ එය කෙසේ හෝ කරන්නේ ඇයි ...?
හරි, ඔබේ ප්රශ්නයට පිළිතුරු දීමට පෙර පළමුව මෙම සංකල්පය ඔබට ලබා දෙමු, ජාවාස්ක්රිප්ට් කාර්යයන් තුළ වස්තුව, ශුන්ය, වස්තුව, අරා සහ දිනය පවා වේ, එබැවින් ඔබට පෙනෙන පරිදි typeof obj === 'object' වැනි සරල ක්රමයක් නොමැත , එබැවින් ඉහත සඳහන් කළ සියල්ල සත්ය වනු ඇත , නමුත් ශ්රිතයක් ලිවීමෙන් හෝ ජාවාස්ක්රිප්ට් රාමු භාවිතයෙන් එය පරීක්ෂා කිරීමට ක්රම තිබේ, හරි:
දැන්, ඔබට මෙම වස්තුව සැබෑ වස්තුවක් ඇතැයි සිතන්න (ශුන්ය හෝ ක්රියාකාරී හෝ අරාව නොවේ):
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);
මගේ දෙවියනේ, වෙනත් පිළිතුරු වල ඕනෑවට වඩා ව්යාකූලයි.
කෙටි පිළිතුර
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
.
එය "වස්තුවක්" යන්නෙන් ඔබ අදහස් කරන දේ මත රඳා පවතී. ඔබට ප්රාථමික නොවන සෑම දෙයක්ම අවශ්ය නම් , එනම් ඔබට නව ගුණාංග සැකසිය හැකි දේවල් නම්, මෙය කළ යුත්තේ උපක්රමය:
function isAnyObject(value) {
return value != null && (typeof value === 'object' || typeof value === 'function');
}
එය සැලකෙතත් (සරල අංක / බැහැර NaN
/ Infinity
, සරල නූල්, සංකේත, true
/ false
, undefined
සහ null
) නමුත් (ඇතුලූ අන් සියල්ල සඳහා සැබෑ යළි උදා කළ යුතුයි Number
, Boolean
සහ String
විරුද්ධ). JS "සත්කාරක" වැනි වස්තු අර්ථ දැක්වීමට නොවන බව සටහන 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
, සමාන ශ්රිතයන් දෙකක් තදින් සමාන නොවේ, ඒවා යොමු කිරීම මඟින් යවනු ලැබේ.
වටිනාකමක වර්ගය පරීක්ෂා කිරීමට වඩාත්ම සාධාරණ ක්රමය typeof
ක්රියාකරුට පෙනේ . එකම ගැටළුව එය දරුණු ලෙස බිඳී යාමයි:
"object"
සඳහා null
NULL වර්ගය අයත්."function"
වස්තු වර්ගයට අයත් කැඳවිය හැකි වස්තු සඳහා නැවත පැමිණේ ."unknown"
. තහනම් එකම ප්රති results "function"
ල සහ ප්රාථමික වර්ග වේ.typeof
විශ්වාසදායක වන්නේ null
ප්රාථමික නොවන අයට පමණි . එබැවින් වටිනාකමක් වස්තුවක් දැයි පරීක්ෂා කර බැලීමේ ක්රමයක් වනුයේ ආපසු typeof
ලබා දුන් නූල ප්රාථමිකයට අනුරූප නොවන බවත්, වස්තුව එසේ නොවන බවත් සහතික කිරීමයි.null
කිරීමයි. කෙසේ වෙතත්, ගැටළුව වන්නේ අනාගත ප්රමිතියකට නව ප්රාථමික වර්ගයක් හඳුන්වා දිය හැකි අතර අපගේ කේතය එය වස්තුවක් ලෙස සලකනු ඇත. නව වර්ග නිතර නොපෙන්වයි, නමුත් උදාහරණයක් ලෙස ECMAScript 6 සංකේත වර්ගය හඳුන්වා දුන්නේය.
එබැවින්, ඒ වෙනුවට typeof
, මම නිර්දේශ කරන්නේ වටිනාකම වස්තුවක් ද නැද්ද යන්න මත පදනම්ව ප්රති result වෙනස් වන ප්රවේශයන් පමණි. පහත දැක්වෙන්නේ a
Object
ඉදිකිරීම්කරු
මෙම Object
ඉදිකිරීමටත් වස්තුවක් සමත් තර්කය coerces. එය දැනටමත් වස්තුවක් නම්, එම වස්තුවම ආපසු ලබා දෙනු ලැබේ.
එමනිසා, ඔබට එය වස්තුවකට වටිනාකම බල කිරීම සඳහා භාවිතා කළ හැකි අතර, එම වස්තුව මුල් අගය සමඟ සසඳන්න.
පහත සඳහන් ශ්රිතයට ECMAScript 3 අවශ්ය වේ, එය හඳුන්වා දුන්නේ ===
:
function isObject(value) { /* Requires ECMAScript 3 or later */
return Object(value) === value;
}
මම මෙම ප්රවේශයට කැමතියි එය සරල හා ස්වයං විස්තරයක් වන නිසා, බූලියන්, අංක සහ නූල් සඳහා සමාන චෙක්පතක් ද ක්රියා කරයි. කෙසේ වෙතත්, එය රඳා පවතින්නේ ගෝලීය Object
සෙවනැලි හෝ වෙනස් නොකිරීම මත බව විශ්වාස කරන්න .
ඉදිකිරීම්කරුවන්
ඔබ ඉදිකිරීම්කරුවෙකු ක්ෂණිකව ස්ථාපනය කළ විට, එය හුදෙක් සාදන ලද අවස්ථාවට වඩා වෙනස් අගයක් ආපසු ලබා දිය හැකිය. නමුත් එය වස්තුවක් මිස එම අගය නොසලකා හරිනු ඇත.
පහත දැක්වෙන ශ්රිතයට 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 මගින් මෙම හැසිරීම ඉවත් කරන දැඩි මාදිලියක් හඳුන්වා දෙන ලදි, නමුත් අලස ප්රකාරයේදී අපට තවමත් එය මත විශ්වාසය තැබිය හැකිය (නමුත් තර්ක නොකළ යුතුය).
function isObject(value) { /* Requires ECMAScript 3 or later in sloppy mode */
return function() { return this === value; }.call(value);
}
[[මූලාකෘති]]
සෑම සාමාන්ය වස්තුවකටම [[මූලාකෘති]] නමින් අභ්යන්තර තව් ඇත, එහි වටිනාකම තීරණය වන්නේ එය වෙනත් වස්තුවකින් උරුම වන්නේද යන්නයි. වටිනාකම වස්තුවක් විය හැක්කේ හෝ 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 මඟින් වටිනාකමක් වස්තුවක් දැයි පරීක්ෂා කිරීමට නව වක්ර ක්රම කිහිපයක් හඳුන්වා දෙයි. 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
=> 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));
}
// 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
කරුණාකර Javascript දී 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
නැතහොත් a ද යන්න පරීක්ෂා කිරීමට හොඳ ක්රමයකි 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 like වැනි) මට මේ කුඩා ස්නිපටය තිබේ:
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
එය සෑම විටම මට වැඩ කරයි. "සත්ය" නැවත පැමිණෙන්නේ නම් "ඕ" වර්ගය "වස්තුව" නම් පමණි, නමුත් ශුන්ය හෝ අරාව හෝ ශ්රිතයක් නොමැත. :)
lodash සතුව isPlainObject ඇත , එය මෙම පිටුවට පැමිණෙන බොහෝ දෙනා සොයන දේ විය හැකිය. ශ්රිතයක් හෝ අරාවක් ලබා දෙන විට එය අසත්ය වේ.
_.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
කිරීමේදී අවසාන පරීක්ෂණය සඳහා ප්රති result ලයක් ලෙස මම ලබා ගත්තා false
. බලන්න මම කේතයට සංස්කරණ කළ යුත්තේ කවදාද?
මෙම Ramda ක්රියාකාරී පුස්තකාල JavaScript වර්ග සොයා ගැනීමට පුදුම ක්රියාව ඇත.
සම්පූර්ණ ශ්රිතය අර්ථ නිරූපණය කිරීම :
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"
මෙම ගැටළුව නිවැරදිව හසුරුවන්නේ කෙසේද යන්න පිළිබඳව විශාල ව්යාකූලතාවයක් ඇති බැවින්, මම මගේ ශත 2 තබමි (මෙම පිළිතුර පිරිවිතරයට අනුකූල වන අතර සියලු තත්වයන් යටතේ නිවැරදි ප්රති results ල ලබා දෙයි):
ප්රාථමිකයන් සඳහා පරීක්ෂණ:
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
?
කියවීම හා ක්රියාත්මක කිරිමේදි ගොඩක් අත්හදා පස්සේ, මම ඉතා ස්වල්ප වැනි වටිනාකම් සඳහා පරීක්ෂා කිරීමට උත්සාහ නිරීක්ෂණය කළෙමු JSON
, Math
, document
හෝ ඊට වැඩි කාලයක් 1 පියවර වඩා පරමාදර්ශයක් දම්වැල් සමග විරුද්ධ.
පරීක්ෂා කිරීම වෙනුවට typeof
අපගේ විචල්ය හා පසුව අද්දර-නඩු ඉවතට අනවසරයෙන් ඇතුළුවී, මම එහි නව සැලකෙතත් හෝ දේශීය වස්තූන් ලෙස බව ලේඛනය එකතු වෙනවා විට පරීක්ෂා refactor කිරීමට සිදු වළක්වා ගැනීමට හැකි සරල ලෙස තබා ඇත නම් එය වඩාත් හොඳ වේවි කියලා 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");
}
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 වෙතින් ආපසු ලබා දී ඇත්ද යන්න දැන ගැනීමයි. එවිට අපට පරීක්ෂා කළ හැක්කේ 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
fornew Date()
new Date()
මෙම SO ප්රශ්නයෙන් මෙවැනි ආකාරයේ පිරික්සීමක් කිරීමට මම "නව" ක්රමයක් සොයා ගතිමි: නිදසුනක් ලෙස සමහර සාක්ෂරයින්ට වැරදි ලෙස පෙනෙන්නේ ඇයි?
එයින්, මම පහත පරිදි වර්ග පරීක්ෂා කිරීම සඳහා ශ්රිතයක් නිර්මාණය කළෙමි:
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
inanc ගේ අදහස් දැක්වීමෙන් යාවත්කාලීන කිරීම: අභියෝගය භාර ගැනීම: D.
ඔබට සංසන්දනාත්මක වස්තු ලිහිල් කිරීමට අවශ්ය නම් ඔබට මේ ආකාරයෙන් උත්සාහ කළ හැකිය:
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);
ද
මෙන්න විකල්ප දම්වැල සහිත පිළිතුරක් වන අතර සමහර විට isObj
මෙම ප්රශ්නය සඳහා කුඩාම කාර්යය වේ.
const isObj = o => o?.constructor === Object;
// True for this
console.log(isObj({})); // object!
// False for these
console.log(isObj(0)); // number
console.log(isObj([])); // array
console.log(isObj('lol')); // string
console.log(isObj(null)); // null
console.log(isObj(undefined)); // undefined
console.log(isObj(() => {})); // function
console.log(isObj(Object)); // class
new Error()
ඔබගේ කාර්යයේදී අසත්ය වනු ඇත.
null
වස්තුවක් ද යන්න).