අගය ජාවාස්ක්‍රිප්ට් හි වස්තුවක් දැයි පරීක්ෂා කරන්න


1409

ජාවාස්ක්‍රිප්ට් හි වටිනාකමක් වස්තුවක් දැයි ඔබ පරීක්ෂා කරන්නේ කෙසේද?


4
විචල්යයක් යනු විචල්යයකි. එය වස්තුවකට යොමු විය හැකිය. එසේම, ඔබට "වස්තුව" යන්න අර්ථ දැක්වීමට අවශ්‍ය විය හැකිය - පිළිතුරු සහ අදහස් පෙන්වන පරිදි, විවිධාකාර ගැටුම් අර්ථ දැක්වීම් ඇත (උදා: nullවස්තුවක් ද යන්න).

8
OP, IMO ඔබ පිළිගත යුතුය an දාන්ගේ පිළිතුර එය හොඳම විසඳුම වන අතර එය වෙනත් පිළිතුරු වලට ඉහළින් ලැයිස්තු ගත කළ යුතුය. (හොඳ පිළිතුරු ඇති අනෙක් අයට වරදක් නැත.)
ටිෆොන්

2
IMHO එය සැබවින්ම රඳා පවතින්නේ ඔබ (මෙම ප්‍රශ්නයට පිළිතුරක් සොයන තැනැත්තා) වස්තුවක් සලකා බලන දේ සහ ඔබ එය පරික්ෂා කරන්නේ ඇයිද යන්න මතය. ඔබ වෙනත් වස්තූන්ගෙන් අරා ( ඒවා වස්තු) වෙන්කර හඳුනා ගැනීමට උත්සාහ කරන්නේ නම් හෝ පරිමාණ අගයන් "දෛශික" වලින් වෙන් කිරීමට උත්සාහ කරන්නේ නම් මෙම ප්‍රශ්නය වෙනස් පිළිතුරු සපයයි . හා ශූන්ය (එම යන්න වේ typeof අනුව, වස්තුවක) හෝ කාර්යයන් (එම වස්තූන්) ඉවත් කළ යුතුද, එය ඔබ එය පරික්ෂා කර ඇති ඇයි ද යන්න මත ඇත්තටම රඳා පවතී. බොහෝ පිළිතුරු ඇති අතර ඒවායින් බොහොමයක් සන්දර්භය තුළ නිවැරදි ය.
ෆ්‍රැන්චෙස්කෝඑම්එම්

1
“වස්තුවක්” යන්නෙන් ඔබ හරියටම අදහස් කරන දේ පැවසීමෙන් ආරම්භ කළ හැකි නම් එය ඉතා හොඳ වේ. .
දොන් හැච්

1
කොහොමද දී අවස්ථාවක පිළිතුර සඳහා පමණ @tiffon stackoverflow.com/a/52478680/1096194 . මම මෙය ලිව්වේ ඉහළම ඡන්දය දුන් බොහෝ පිළිතුරු වල විස්තරයේ දිග දැකීමෙන් මා යටපත් වූ විටය. එය තවත් දෘශ්‍යතාවයට සුදුසු යැයි මම විශ්වාස කරමි.
kushalvm

Answers:


529

යාවත්කාලීන කිරීම :

මෙම පිළිතුර අසම්පූර්ණ වන අතර නොමඟ යවන ප්‍රති .ල ලබා දෙයි . නිදසුනක් ලෙස, ජාවාස්ක්‍රිප්ට් nullවර්ගය objectගැන ද සැලකේ, වෙනත් අවස්ථා කිහිපයක් ගැන සඳහන් නොකරන්න. පහත නිර්දේශය අනුගමනය කර වෙනත් "වඩාත්ම ඉහළට (සහ නිවැරදි!) පිළිතුර වෙත යන්න .


මුල් පිළිතුර :

භාවිතා කිරීමට උත්සාහ කරන්න typeof(var)සහ / හෝ var instanceof something.

සංස්කරණය: මේ පිළිතුර විචල්ය ගුණ පරීක්ෂා කිරීමට ආකාරය පිළිබඳ අදහසක්, ලබා දෙන නමුත්, එය නොවේ එය වෙඩි නොවදින වට්ටෝරුව, එය වස්තුවක් වේවා පරීක්ෂා කිරීම සඳහා (හැමෝම කිසිදු වට්ටෝරුව තියෙනවා!) අඩෝ. කිසිදු පර්යේෂණයක් නොකර මිනිසුන් මෙහි සිට පිටපත් කිරීමට යමක් සෙවීමට නැඹුරු වන හෙයින්, ඔවුන් අනෙක් පැත්තට හැරී යන ලෙස මම තරයේ නිර්දේශ කරමි.


212
typeofක්‍රියාකරු, එබැවින් අවශ්‍ය නොවේ ().
යොෂි

67
ඔව්, අවශ්‍ය නැත. මම කැමතියි මේ විදියට.
මයිකල් ක්‍රෙලින් - හැකර්

151
@ මයිකල් ක්‍රෙලින්-හැකර්: එය මිනිසුන් ව්‍යාකූල කරන බැවින් එය අවාසනාවකි .
රයිට්සයිඩ්ෆ්‍රඩ්

11
IgRightSaidFred, මට ඒ ගැන පැහැදිලි කිරීමක් නැත, නමුත් මෙම ප්‍රකාශනවල අමතර වරහන් එක් කිරීමට මම කිසිසේත් නැඹුරු
නොවෙමි

118
මෙම පිළිතුර වැරදිය. typeofශුන්‍යය සඳහා 'වස්තුව' ලබා දෙයි, එය වස්තුවක් නොවන අතර instanceofභාවිතා කර නිර්මාණය කරන ලද වස්තු සඳහා ක්‍රියා නොකරයි Object.create(null).
නිකොලායි

1699

නම් typeof yourVariable === 'object', එය වස්තුවක් හෝ ශූන්‍යයකි. ඔබට ශුන්‍යය බැහැර කිරීමට අවශ්‍ය නම් එය සාදන්න typeof yourVariable === 'object' && yourVariable !== null.


35
කාර්යයන් ද වස්තු වන අතර ඒවා ඔබගේ චෙක්පතට ඇතුළත් කළ යුතුය.
JS_Riddler

4
මෙම අවස්ථාවේ දී yourVariable !== nullවඩා හොඳ පුහුණුවක් වනු ඇත?
හිපිට්‍රයිල්

9
6RightSaidFred ES6 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.
කොන්ස්ටන්ටින් ස්මොලියනින්

2
ඔරියන් සරල පිළිතුර නම් අරා වස්තු ලෙස සැලකේ. වඩාත් සවිස්තරාත්මක පිළිතුරක් සඳහා, ඔබට කියවීමට typeofසිදුවන්නේ එයට විශේෂ අවස්ථා කිහිපයක් ඇති හෙයින් එය අනිවාර්යයෙන්ම අර්ථවත් නොවේ. අරා නොවන අරා සහ වස්තු අතර වෙනස හඳුනා ගැනීමට ඔබ උත්සාහ කරන්නේ නම්, ඔබට අනිවාර්යයෙන්ම භාවිතා කිරීමට අවශ්‍ය නැත typeof.
මැට් ෆෙන්වික්

8
@Tresdin හොඳම ක්රමය ක්රියාත්මක කිරීමට ය Object.prototype.toString.call(yourVar)වීම, yourVar ඔබ පරීක්ෂා කිරීමට අවශ්ය දේ. අරා නම්, Object.prototype.toString.call([1,2])ආපසු[object Array]
ජෝස් රූයි සැන්ටොස්

545

ජාවාස්ක්‍රිප්ට් හි "වස්තුව" යන්න අර්ථ දක්වමු . එම්ඩීඑන් ලේඛනයට අනුව , සෑම අගයක්ම වස්තුවක් හෝ ප්‍රාථමික එකක් වේ:

ප්‍රාථමික, ප්‍රාථමික අගය

වස්තුවක් නොවන සහ කිසිදු ක්‍රමයක් නොමැති දත්ත. ජාවාස්ක්‍රිප්ට් සතුව ප්‍රාථමික දත්ත වර්ග 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({})

25
obj === Object(obj)trueඅරා සඳහා ප්‍රතිලාභ .
ඔනුර් යෙල්ඩ්‍රම්

5
var x = []; console.log(x === Object(x)); // return true
Illuminator

7
මගේ පිළිතුරේ සඳහන් කළ පරිදි ඉලුමිනේටර් අරා යනු ජාවාස්ක්‍රිප්ට් හි වස්තු වේ.
මැට් ෆෙන්වික්

1
getPrototypeOfඋදා: වස්තූන් නමුත් විසි කරන අවලංගු කරන ලද ප්‍රොක්සි සමඟ ක්‍රියා නොකරයි.
ඔරියෝල්

2
ඇයි නැත්තේ ({}).toString.apply(obj) === '[object Object]'පෙලගැස්මක් නොවන බව අරා සහ වස්තූන් අතර මෙම පැහැයක්
MauricioJuanes

299

යමක් සැබවින්ම වස්තුවක් දැයි සොයා ගැනීමට 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;
};

57
ජාවාස්ක්‍රිප්ට් හි අරාව ද වස්තුවකි, එබැවින් බොහෝ විට ඔබට අරාව බැහැර කිරීමට අවශ්‍යය:return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'
දාන්

23
ඇයි ඔබ අරාව බැහැර කරන්නේ? ඒවා අංගසම්පූර්ණ වස්තූන් ය.
නිකොලායි

67
බොහෝ විට ඔබට [] වෙතින් {a වෙන්කර හඳුනා ගැනීමට අවශ්‍ය වන්නේ උදාහරණයක් ලෙස ශ්‍රිතයක ආදානය ලෙසයි
Daan

5
Ick නිකොලායි .. සහ කැදැලි වස්තූන් හරහා නැවත ගමන් කිරීම සඳහා.
රිකී බෝයිස්

7
නියම පිළිතුර. හසුරුවයි null. පිළිගත් පිළිතුර විය යුතුය.
ටිෆොන්

181

Object.prototype.toString.call(myVar) නැවත පැමිණේ:

  • "[object Object]" myVar වස්තුවක් නම්
  • "[object Array]" myVar අරාව නම්
  • ආදිය.

මේ පිළිබඳ වැඩි විස්තර සහ එය යතුරු ලියනය සඳහා හොඳ විකල්පයක් වන්නේ ඇයි, මෙම ලිපිය බලන්න .


12
මම මෑතකදී එය ඉගෙන ගත්තා typeof [] === 'object'-> true. ඔබට මෙම ක්‍රමය අවශ්‍ය වන්නේ එයයි.
ජොන්ඩ්ල්ම්

3
H ක්‍රිස්ටෝෆ් ප්‍රාථමික හා වස්තූන් අතර වෙනස හඳුනා නොගනී . Object.prototype.toString.call(3)-> "[object Number]". Object.prototype.toString.call(new Number(3))-> "[object Number]"
මැට් ෆෙන්වික්

3
Att මැට්ෆෙන්වික් මෙය OP විසින් හඳුනා ගැනීමට උත්සාහ කරන ආකාරයේ "වස්තුවක්" යැයි මම නොසිතමි
ක්‍රිස්ටෝෆ්

3
H ක්‍රිස්ටෝෆ් ඔබ එසේ සිතන්නේ ඇයි? IMHO, “වස්තුව” සඳහා OP විසින් ලබා දී ඇති වෙනත් අර්ථ දැක්වීමක් නොමැති විට, ECS පිරිවිතර පුරා නිරන්තරයෙන් භාවිතා වන එක සමඟ යෑම මට වඩාත් සාධාරණ බව පෙනේ.
මැට් ෆෙන්වික්

getType=function(obj){return Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1];};
පොලිවර්ල් මහතා

120

අතිරේක ක්‍රියාකාරී ඇමතුමක් (වේගය) නොමැතිව වස්තුව හෝ අරාව පරීක්ෂා කිරීම සඳහා. මෙහි ද පළ කර ඇති පරිදි .

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
කළහොත්

3
up සුපා: මොකක්ද !!

4
@ 3000 හොඳයි, අපි (!! අ) කොටස අතහැර දැමුවහොත් එය බිඳ වැටේ, මන්ද ශුන්‍ය හා නිර්වචනය නොකළ ඉදිකිරීම්කරුවන් නොමැති බැවිනි. (!! අ) ඒවා පෙරහන් කරයි. එය ඔබේ ප්‍රශ්නයට පිළිතුරු දෙයිද?
zupa

2
up සුපා @ 3000 Boolean(a)දිගු, නමුත් වඩා බුද්ධිමත් ය. භාවිතා නොකරන්න new Boolean(a): ( මෙන්න හේතුව )!
ජේවී

11
පුදුමයට කරුණක් නම් හොඳම පිළිතුර මෙතෙක් පිටුවේ පහළින් තිබීමයි. මෙය මූලික වශයෙන් ප්‍රශ්නයට පිළිතුරු සපයයි- මෙය JSON හි නිරූපණය වන්නේ {චරිතයකින් ආරම්භ වන දෙයක් ලෙස ය . අරාව නඩුව සඳහා, ඔබට IE <9 සඳහා සහය දැක්වීමට අවශ්‍ය නොවන තාක් කල් Array.isArray(), යමක් අරාවක් දැයි තීරණය කිරීමට ඔබට භාවිතා කළ හැකිය . එය ඔබ ලබා දුන් සියලුම පරීක්ෂණ අවස්ථා සමත් වේ.
කිප්

82

මම සරලවම කැමතියි:

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

http://devdocs.io/javascript/global_objects/array/isarray

http://devdocs.io/javascript/global_objects/null


3
Console.log (isObject (නව දිනය ()) ගැන කුමක් කිව හැකිද? දිනයක් වස්තුවක් විය යුතු නමුත් අරාවක් නොවන්නේ ඇයි?
schirrmacher

5
achmacher new Date()වස්තුවක් ආපසු ලබා දෙන නිසා . අරාව යනු තාර්කික දෘෂ්ටි කෝණයකින් වස්තුවක් නොවේ - ජාවාස්ක්‍රිප්ට් ඒවා හසුරුවමින් වාර්තා කළද. කෙසේ වෙතත්, ප්‍රායෝගිකව, ඒවා සමාන නොවන බව දැකීම ප්‍රයෝජනවත් නොවේ. වස්තුවකට lengthනිදසුනක් ලෙස ලක්ෂණයක් නොමැති අතර එයට තල්ලු කිරීම () වැනි ක්‍රම නොමැත. සමහර විට ඔබට ශ්‍රිතයක් අධික ලෙස පටවන ලද පරාමිතීන් ලබා දීමට අවශ්‍ය විය හැකිය, එහිදී ඔබට අරාව හෝ වස්තුවක් අතර වෙනසක් සිදු කළ යුතුය.
ස්ටැන්

1
An ස්ටැන් අරා අනිවාර්යයෙන්ම වස්තු වේ. වග බලා ගන්න ඔබට වස්තු නො හැකි හිතන්නේ ඇයි නැත්තේ lengthවැනි දේපල හෝ ක්රම push, Object.create(Array.prototype)මේ ඇති වන අරා නොවන වස්තුවක සුළු පටු counterexample වේ. අරා විශේෂිත වන්නේ ඒවා අභිරුචි [[DefineOwnProperty]] අත්‍යවශ්‍ය අභ්‍යන්තර ක්‍රමයක් සහිත විදේශීය වස්තූන් වන නමුත් ඒවා තවමත් වස්තූන්ය.
ඔරියෝල්

4
Ri ඔරියෝල් අරා යනු වස්තූන් නොවන බව හෝ වස්තූන්ට lengthදේපලක් තිබිය නොහැකි බව මා ලියා නැත (මා අදහස් කළේ වස්තු සාක්ෂරතාවන්ට lengthපෙරනිමියෙන් කිසිදු ගුණාංගයක් නොමැති බවයි ). අරා යනු තාර්කික දෘෂ්ටි කෝණයකින් වස්තු නොවන බව මම ලිවීය . මම කතා කරන්නේ වැඩසටහන් තර්කනය ගැන ය. අරාව යනු “තාත්වික” අරාවක් මිස අනිවාර්යයෙන්ම “සැබෑ” වස්තුවක් නොවේදැයි පරීක්ෂා කිරීම අවශ්‍ය වේ. ඒ Array.isArray()සඳහා ය. ඔබට වස්තුවක් හෝ වස්තු සමූහයක් පිළිගන්නා ශ්‍රිතයක් ඇතැයි සිතන්න. විශේෂ ලක්ෂණයක් හෝ ක්‍රමයක් පරීක්ෂා කිරීම අපිරිසිදු විසඳුමකි. ස්වදේශීය ක්‍රමය සෑම විටම වඩා හොඳය.
ස්ටැන්

2
typeof nullවේ "object", නැත "undefined".
2540625

82

ශ්‍රිතය සමඟ 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.createisObject

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 හි පැකේජයක් නිර්මාණය කර ඇත ! කලින් විස්තර කර ඇති සියලුම පරීක්ෂණ අවස්ථා සඳහා එය ක්‍රියා කරයි! 🙂


හොඳම පිළිතුර! මෙහි
පූජක

IsObject (myDateObject) සඳහා මෙය වැරදි ලෙස ලැබෙන බැවින් මෙය ප්‍රශ්නයට පිළිතුරක් නොවේ. විචල්‍යයක් යනු වස්තුවක් දැයි එය නොකියයි, එය නිශ්චිත පන්තියක වස්තුවක් නම් පමණි. මෙහි ඇති ප්‍රශ්නය වන්නේ ඕනෑම වස්තුවක් සඳහා සත්‍ය වන සාමාන්‍ය ශ්‍රිතයක් සඳහා ය.
යේතානෝතර්ජොෂ්

Et යෙතනෝතර්ජොෂ් එය සැබවින්ම පිළිතුරකි answer ඔබ සඳහන් කර ඇති නඩුව, සහ කාරණය - isDateශක්තිමත් කේත ලිවීමේ අරමුණින් ඔබේ ඩේට් ඕබෙක්ට් සඳහා භාවිතා කළ යුතුය isObject.
වී. කොව්පක්

@VladimirKovpak Dateමගේ අදහස් දැක්වීමේදී වැරදි ලෙස තෝරාගෙන ඇත්තේ ඔව්, පිළිතුර සාකච්ඡා කරන Dateබැවිනි. නමුත් Dateහැකි අනන්ත පංති වලින් එකක් පමණක් වන අතර එය වෙනත් ඕනෑම පන්තියකට අදාළ වේ. උදාහරණය: class Foo() { }; var x = new Foo(); isObject(x)ප්‍රතිලාභ false. OP හි භාවිත නඩුව කුමක්දැයි මම හරියටම නොදනිමි, නමුත් හැකි සෑම පංතියක් ගැනම දැන ගැනීම සහ ඒ සෑම එකක් ගැනම විශේෂයෙන් පරීක්ෂා කිරීම කළ නොහැකි තත්වයන් ගැන සිතීම පහසුය .
යේතානෝතර්ජොෂ්

Et යෙතනෝතර්ජොෂ් මම මගේ පිළිතුර යාවත්කාලීන කර ඇත. තවත් 1 ක් එකතු කරන ලදි.
වී. කොව්පක්

40

අහෝ මගේ දෙවියනේ! මෙය වෙන කවරදාටත් වඩා කෙටි විය හැකි යැයි මම සිතමි.

කෙටි හා අවසාන කේතය

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 හඳුන්වා දීම

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


3
මම මේකට කැමතියි, කෙටියෙන් සහ කාරණයට. එය අසමත් වන්නේ මට පෙනෙන පරිදි 1 දේ මත පමණි. obj = Object.create(null)සහ ඔබ එය කෙසේ හෝ කරන්නේ ඇයි ...?
ජූලියන් නයිට්

29

හරි, ඔබේ ප්‍රශ්නයට පිළිතුරු දීමට පෙර පළමුව මෙම සංකල්පය ඔබට ලබා දෙමු, ජාවාස්ක්‍රිප්ට් කාර්යයන් තුළ වස්තුව, ශුන්‍ය, වස්තුව, අරා සහ දිනය පවා වේ, එබැවින් ඔබට පෙනෙන පරිදි 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);

එය අරාවක් නොවේදැයි පරීක්ෂා කිරීමටද ඔබට අවශ්‍යය. එබැවින් ශ්‍රිතය වන්නේ Object (obj) {return obj! == null && typeof obj === 'object' &&! Array.isArray (obj); }
මැට් ගූ

මම ඔබ සමඟ එකඟ වෙමි, නමුත් ඔබ අදහස් දැක්වීමේදී එය කෝණික ජේ වලින් සිදු කරන ආකාරය වන අතර එය ශ්‍රිතය ඉදිරිපිට ඇති අදහස් දැක්වීමේදී මම සඳහන් කරමි, ඔවුන් අරාව වස්තුවක් ලෙස ගණන් ගනී ... වැඩි විස්තර සඳහා මෙහි බලන්න: ලියකියවිලි .angularjs.org / api / ng / function / angular.isObject
Alireza

24

මගේ දෙවියනේ, වෙනත් පිළිතුරු වල ඕනෑවට වඩා ව්‍යාකූලයි.

කෙටි පිළිතුර

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) පටු වන්නේ එකකට පමණි - {}

කරුණාකර ඩ්‍රම් රෝල්ස්!

මෙයින් ඔබ දැනටමත් ජාවාස්ක්‍රිප්ට් හි අරාව පරීක්ෂා කරන්නේ කෙසේදැයි ඉගෙන ගෙන ඇත.


2
සැලකිල්ලට ගත යුතු කරුණක් නම්, මෙය ශ්‍රිතයක් falseවූ විට ද (අපේක්ෂිත පරිදි) නැවත පැමිණේ anyVar.
ජේමි බර්ච්

24

එය "වස්තුවක්" යන්නෙන් ඔබ අදහස් කරන දේ මත රඳා පවතී. ඔබට ප්‍රාථමික නොවන සෑම දෙයක්ම අවශ්‍ය නම් , එනම් ඔබට නව ගුණාංග සැකසිය හැකි දේවල් නම්, මෙය කළ යුත්තේ උපක්‍රමය:

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සමහර අවස්ථාවල දී වස්තුව ප්රායෝගික ලෙස එහි ජීවිතය ආරම්භ කරන විට පවා. සම්මුතිය අනුව, අභිරුචි නූල් ටැගයක් සහිත වස්තුවක් හරියටම සරල වස්තුවක් නොවේ, නමුත් මෙය ජාවාස්ක්‍රිප්ට්හි ඇති සරල වස්තුවක් යනු කුමක්ද යන්න නිර්වචනය කරයි.


Typeof === 'ශ්‍රිතය' වස්තුවක් ලෙස සලකන්නේ ඇයි? ශ්‍රිතයක් යනු වස්තුවක් නොවේ ද? "new myFunc ()" වස්තුවක් බවට පත්වනු ඇත, ඔව්, නමුත් සරල කාර්යයක්ද?
ස්ටැන්

නැත, සෑම ශ්‍රිතයක්ම ජාවාස්ක්‍රිප්ට් හි ඇති වස්තුවකි. ඔබට ඒවා මත ගුණාංග සැකසිය හැකිය (ඒවා ශීත කළොත් මිස), ඒවා නම් instanceof Object, සමාන ශ්‍රිතයන් දෙකක් තදින් සමාන නොවේ, ඒවා යොමු කිරීම මඟින් යවනු ලැබේ.
අන්තිම දරුවා

18

වටිනාකමක වර්ගය පරීක්ෂා කිරීමට වඩාත්ම සාධාරණ ක්‍රමය typeofක්‍රියාකරුට පෙනේ . එකම ගැටළුව එය දරුණු ලෙස බිඳී යාමයි:

  • එය නැවත "object"සඳහා nullNULL වර්ගය අයත්.
  • එය "function"වස්තු වර්ගයට අයත් කැඳවිය හැකි වස්තු සඳහා නැවත පැමිණේ .
  • සම්මත නොවන කැඳවිය නොහැකි වස්තූන් සඳහා එයට අවශ්‍ය ඕනෑම දෙයක් (පාහේ) ආපසු ලබා දිය හැකිය. උදාහරණයක් ලෙස, IE කැමති බවක් පෙනෙන්නට තිබුණි "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.getPrototypeOfECMAScript 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වන්නේ කෙලින්ම ප්‍රවේශ නොවී පමණි .


2
"මගේ පිළිතුර සහ ඩෑන්ගේ පිළිතුරු පමණක් නිවැරදි ය." ඔබගේ පළමු වාක්‍ය දෙක සමඟ මම සම්පුර්ණයෙන්ම එකඟ නොවීම තරමක් හිතුවක්කාර ය .
zzzzBov

1
@zzzzBov හොඳයි, මම සියලු පිළිතුරු දෙස බැලූ අතර මගේ සහ ඩෑන්ගේ පිළිතුරු හැර සෑම විටම නිසි පිළිතුර ලබා දීමට ඔවුන් සහතික නොවේ. මට ඔවුන්ගෙන් බොහෝ දෙනෙකුට ප්‍රජනනය කළ හැකි ප්‍රති-සාම්පල ලබා දිය හැකිය. අනෙක් අය ටයිප් ඔෆ් "ශ්‍රිතය" හෝ "වස්තුව" ලබා දෙන්නේදැයි පරීක්ෂා කිරීමට නිර්දේශ කරයි, නමුත් මා පැහැදිලි කළ පරිදි පිරිවිතර සමහර වස්තු සඳහා වෙනත් ප්‍රති results ල ලබා දේ. මැට් ෆෙන්වික්ගේ පිළිතුර ඩෑන්ගේ නිවැරදි පිළිතුරම අඩංගු වන අතර වැරදි පිළිතුරු ද අඩංගු වේ.
ඔරියෝල්

1
ඔබේ පිළිතුර “මුළුමනින්ම නිවැරදි” යන මතයට මම එකඟ නොවෙමි, අනෙක් අය “සෑම විටම නිසි පිළිතුර ලබා දීමට වගබලා නොගනී” යන තර්කය මගේ ස්ථාවරය කිසිදු ආකාරයකින් ප්‍රතික්ෂේප නොකරයි. මීට අමතරව, කුමන ආදානය මඟින් කුමන ප්‍රතිදානය නිපදවිය යුතුද යන්න පිළිබඳව කිසිදු ප්‍රශ්නයක් ඉදිරිපත් නොකරයි.
zzzzBov

1
@zzzzBov යමක් වස්තුවක් දැයි පරීක්ෂා කරන්නේ කෙසේදැයි ප්‍රශ්නය අසයි. ECMAScript මඟින් වස්තුවක් යනු කුමක්ද යන්න නිර්වචනය කරයි, එබැවින් මම එම අර්ථ දැක්වීම භාවිතා කරමි. මට වෙනත් සාධාරණ අර්ථකථනයක් නොපෙනේ. වෙනත් දේ කරන පිළිතුරු (අරා හැර) සමහර අවස්ථාවල ප්‍රයෝජනවත් විය හැකි නමුත් යමක් වස්තුවක් දැයි ඔවුන් පරීක්ෂා නොකරයි.
ඔරියෝල්


15

මේක උත්සාහ කරන්න

if (objectName instanceof Object == false) {
  alert('Not an object');
}
else {
  alert('An object');
}

16
ඔබ චෙක් බූලියන් ඩොබල් කරන්නේ ඇයි?
jkutianski

5
මෙය අවස්ථා දෙකක් මග හැරේ: Object.prototype instanceof Object-> අසත්‍යය. Object.create(null) instanceof Object-> අසත්ය.
මැට් ෆෙන්වික්

දිනයන් ගැන කුමක් කිව හැකිද? new Date() instanceof Object => true
mauron85

13

පරීක්ෂා කිරීම සඳහා කාර්යයන් භාවිතා කිරීමට සූදානම්

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(){})
);


13

ඔබ නම්, පරීක්ෂා කිරීමට කැමති නම් 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]'

1
මෙය හොඳම ක්‍රමය නමුත් 2 වන පේළියෙන් මම එය වඩාත් පහසු කරමි:return Object.prototype.toString.call(n) === '[object Object]'
mesqueeb

1
ඔබට nullObject.prototype.toString.call(null) === '[object Null]'
ගස්ට් වැන් ඩි වෝල්

12
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
yckart

11

ටිකක් පරක්කුයි ... "සරල වස්තූන්" සඳහා (මම අදහස් කළේ {'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

එය සෑම විටම මට වැඩ කරයි. "සත්‍ය" නැවත පැමිණෙන්නේ නම් "ඕ" වර්ගය "වස්තුව" නම් පමණි, නමුත් ශුන්‍ය හෝ අරාව හෝ ශ්‍රිතයක් නොමැත. :)


පෙර පිළිතුරු වල සඳහන් කර ඇති පරිදි දිනය වස්තුවකදී ඔබගේ ප්‍රවේශය අසාර්ථක වනු ඇත.
ග්‍රෙස්ගෝර්ස් පව්ලික්

9

lodash සතුව isPlainObject ඇත , එය මෙම පිටුවට පැමිණෙන බොහෝ දෙනා සොයන දේ විය හැකිය. ශ්‍රිතයක් හෝ අරාවක් ලබා දෙන විට එය අසත්‍ය වේ.


පරිපූර්ණ! _.isObjectජේඑස් වස්තුවක් ලෙස සලකන දේට ගැලපෙන දේ ගැන මම දැන සිටියෙමි . නමුත් මට සාමාන්‍යයෙන් අවශ්‍ය වන්නේ උදා: වස්තුවක් සහ අරාවක් අතර වෙනස හඳුනා ගැනීමයි _.isPlainObject.
දෙහි

9

මෙය ක්‍රියාත්මක වනු ඇත. එය සත්‍ය, අසත්‍ය හෝ සමහර විට ශුන්‍ය වන ශ්‍රිතයකි.

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


2
EeSeregPie අනාගතයේදී ඔබ පිළිතුරු කේතය සංස්කරණය කිරීමෙන් වැළකී සිටිය යුතුය. මෙම පිළිතුරට අනුව, පරීක්ෂා nullකිරීමේදී අවසාන පරීක්ෂණය සඳහා ප්‍රති result ලයක් ලෙස මම ලබා ගත්තා false. බලන්න මම කේතයට සංස්කරණ කළ යුත්තේ කවදාද?
නික්

9

මෙම 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"

9

මෙම ගැටළුව නිවැරදිව හසුරුවන්නේ කෙසේද යන්න පිළිබඳව විශාල ව්‍යාකූලතාවයක් ඇති බැවින්, මම මගේ ශත 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];
    }
}());

8

අනෙක් සියල්ල අසමත් වූ විට, මම මෙය භාවිතා කරමි:

var isObject = function(item) {
   return item.constructor.name === "Object";
}; 

1
නූල් සංසන්දනය කරන්නේ ඇයි item.constructor === Object?
K3 --- rnc

nullව්‍යතිරේකයක් විසි කරයිUncaught TypeError: Cannot read property 'constructor' of null(…)
Vitim.us

unrounce මම පරණ IE අනුවාදයන්ට සහය දැක්වීමට අදහස් කරමි, එය IE හි ක්‍රියා නොකරන්නේ ඇයි? මෙම නිසා indexOfනිසා හෝ constructor.name?
ජන්කපුන්ක්ට්

8

කියවීම හා ක්රියාත්මක කිරිමේදි ගොඩක් අත්හදා පස්සේ, මම ඉතා ස්වල්ප වැනි වටිනාකම් සඳහා පරීක්ෂා කිරීමට උත්සාහ නිරීක්ෂණය කළෙමු JSON, Math, documentහෝ ඊට වැඩි කාලයක් 1 පියවර වඩා පරමාදර්ශයක් දම්වැල් සමග විරුද්ධ.

පරීක්ෂා කිරීම වෙනුවට typeofඅපගේ විචල්ය හා පසුව අද්දර-නඩු ඉවතට අනවසරයෙන් ඇතුළුවී, මම එහි නව සැලකෙතත් හෝ දේශීය වස්තූන් ලෙස බව ලේඛනය එකතු වෙනවා විට පරීක්ෂා refactor කිරීමට සිදු වළක්වා ගැනීමට හැකි සරල ලෙස තබා ඇත නම් එය වඩාත් හොඳ වේවි කියලා typeof'වස්තුවක '.

සියල්ලට පසු, typeofයම් දෙයක් ජාවාස්ක්‍රිප්ට් සඳහා වස්තුවක් දැයි ක්‍රියාකරු ඔබට කියනු ඇත , නමුත් ජාවාස්ක්‍රිප්ට් විසින් වස්තුවක් පිළිබඳ අර්ථ දැක්වීම බොහෝ තාත්වික සිදුවීම් සඳහා (උදා typeof null === 'object') පුළුල් ය. පහත දැක්වෙන්නේ vචෙක්පත් දෙකක් පුනරාවර්තනය කිරීමෙන් විචල්‍යය වස්තුවක්ද යන්න තීරණය කරන ශ්‍රිතයකි :

  1. ලූපයක් ආරම්භ කර ඇති අතර එය දැඩි අනුවාදය පවතින තාක් කල් vපවතී '[object Object]'.
    ශ්‍රිතයේ ප්‍රති result ලය හරියටම පහත දැක්වෙන ල logs ු-සටහන් මෙන් වීමට මට අවශ්‍ය විය, එබැවින් මෙය මා විසින් අවසන් කරන ලද එකම “වස්තු” නිර්ණායකය වේ. එය අසමත් වුවහොත්, ශ්‍රිතය වහාම අසත්‍ය වේ.
  2. 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'}))))


6
if(typeof value === 'object' && value.constructor === Object)
{
    console.log("This is an object");
}

ඇත්ත වශයෙන්ම එය falseවස්තුව සඳහා වනු ඇත Object.assign({}, {constructor: null}).
user4642212

6

ලබා දී ඇති අගය පැහැදිලිව පරීක්ෂා කිරීමට අවශ්‍ය නම් {}.

function isObject (value) {
 return value && typeof value === 'object' && value.constructor === Object;
}

6
const isObject = function(obj) {
  const type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
};

!!objයනු objසත්‍යයක් දැයි පරීක්ෂා කිරීම සඳහා කෙටිමං වේ (පෙරීමට null)


6

එය පැරණි ප්‍රශ්නයක් නමුත් මෙය මෙහි තැබීමට සිතුවා. බොහෝ අය පරික්‍ෂා කරන්නේ විචල්‍යය යනු {}යතුරු අගයක් යුගලනය කර ඇත්ද යන්න සහ ජාවාස්ක්‍රිප්ට් යම් දෙයක් සඳහා භාවිතා කරන යටි ඉරි ඉරීම නොවේද, අවංකව කිවහොත් ජාවාස්ක්‍රිප්ට් හි ඇති සෑම දෙයක්ම වස්තුවකි. ඒ නිසා එය ඉවතට ගැනීම. ඔබ එසේ කරන්නේ නම් ...

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

pops truefornew Date()
toddmo

1
එය පෙන්වා දීම ගැන ස්තූතියි. දැන් උදාහරණ කේතය වැරදියිnew Date()
ගිල්බට්

5

මෙම 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

නව පන්තියක් වස්තුවක් දැයි මෙයින් හඳුනාගත නොහැක. isVarTypeOf (නව (ශ්‍රිතය Foo () {}), වස්තුව) // මෙය සත්‍යය වෙනුවට අසත්‍යය ලබා දෙයි. නිසි පරීක්ෂාව සඳහා මගේ පිළිතුර පහත බලන්න.
ඉනාන්ක් ගුමස්

කෙසේ වෙතත්, ඔබට instanceofවස්තු පරීක්ෂා කිරීමට භාවිතා කළ හැකිය. තවමත් මෙය නිශ්චිත විද්‍යාවක් නොවේ.
ඉනාන්ක් ගුමස්

නිසා බව @inanc, හොඳින් new Foo()ප්රතිලාභ ඉතා Fooවස්තුව ලෙස එම new String()ප්රතිලාභ සඳහා Stringවස්තුවක් හෝ new Date()යම් නැවත Dateවස්තුව, ඔබට සිදු කළ හැකි Foo = function(){}; isVarTypeOf(new Foo(), Foo);
am05mhz

ඔව්, ඒක තමයි මම ඇත්තටම කියන්නේ: ඔබ දැන් එය වස්තුවක් දැයි පරීක්ෂා කරන්නේ නැහැ.
ඉනාන්ක් ගුමස්

aninanc චියර්ස්, මම ටයිප් පරීක්‍ෂා කිරීමේ ක්‍රමයක් සොයමින් සිටියෙමි (වස්තුව පමණක් නොව), මෙම පිටුවට සහ අනෙක් පිටුවට ගියෙමි, එවිට මෙම ප්‍රශ්නයේ සන්දර්භය මට අමතක වීම ගැන මම අතිශයින් සතුටට පත්
වීමි

5

මෙන්න විකල්ප දම්වැල සහිත පිළිතුරක් වන අතර සමහර විට 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()ඔබගේ කාර්යයේදී අසත්‍ය වනු ඇත.
ටයිනි රෝයි

Iny ටයිනිරෝයි එය එසේ විය යුතු නොවේද? දෝෂ උදාහරණයක් වස්තුවක් නොවේ. මට යම්කිසි වැරැද්දක් සිදුවී ඇත්දැයි මට දන්වන්න. :)
ජයන්ත් භවාල්

ඔබේ අභිප්‍රාය වස්තුවෙන් උරුම වන අවස්ථා බැහැර කිරීම නම්, ඔබ හරි නමුත් මම ඒවා වස්තු ලෙස දකිමි. වස්තුවක සියලු ගුණාංග ඒවාට ඇත.
ටයිනි රෝයි

මම විශ්වාස කරන්නේ ප්‍රශ්නය එයයි. එසේ නොමැතිනම් මූලික වශයෙන් සෑම දෙයක්ම වස්තුවෙන් උරුම වේ.
ජයන්ත් භවාල්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.