Frage Überprüfen Sie, ob ein Wert ein Objekt in JavaScript ist


Wie überprüfen Sie, ob ein Wert ein Objekt in JavaScript ist?


844
2017-12-14 20:35


Ursprung


Antworten:


Versuchen Sie es mit typeof(var) und / oder var instanceof something.

EDIT: Diese Antwort gibt eine Vorstellung davon, wie Eigenschaften von Variablen untersucht werden, aber es ist nicht ein kugelsicheres Rezept (schließlich gibt es überhaupt kein Rezept!), um zu überprüfen, ob es ein Objekt ist, weit entfernt davon. Da Leute dazu neigen, von hier aus etwas zu suchen, das sie kopieren können, ohne irgendwelche Nachforschungen anzustellen, würde ich sehr empfehlen, dass sie sich an die andere, am meisten überarbeitete (und korrekte!) Antwort wenden.


330
2017-12-14 20:39



Ob typeof yourVariable === 'object'Es ist ein Objekt oder null. Wenn Sie NULL ausschließen möchten, machen Sie es einfach yourVariable !== null && typeof yourVariable === 'object'.


1015
2017-12-14 20:40



Lassen Sie uns "Objekt" in Javascript definieren. Entsprechend der MDN-DokumenteJeder Wert ist entweder ein Objekt oder ein Primitiv:

primitiver, primitiver Wert

Daten, die kein Objekt sind und keine Methoden haben. JavaScript hat 5 primitive Datentypen: string, number, boolean, null, undefined.

Was ist ein Primitiv?

  • 3
  • 'abc'
  • true
  • null
  • undefined

Was ist ein Objekt (d. H. Kein Primitiv)?

  • Object.prototype
  • alles stammte ab Object.prototype
    • Function.prototype
      • Object
      • Function
      • function C(){} - benutzerdefinierte Funktionen
    • C.prototype - Die Prototypeigenschaft einer benutzerdefinierten Funktion: das ist nicht  Cs Prototyp
      • new C() - "neu" - eine benutzerdefinierte Funktion
    • Math
    • Array.prototype
      • Arrays
    • {"a": 1, "b": 2} - Objekte, die mit Literal Notation erstellt wurden
    • new Number(3) - Wrapper um Primitive
    • ... viele andere Dinge ...
  • Object.create(null)
  • Alles stammte von einem Object.create(null)

So überprüfen Sie, ob ein Wert ein Objekt ist

instanceof an sich wird nicht funktionieren, weil es zwei Fälle vermisst:

// oops:  isObject(Object.prototype) -> false
// oops:  isObject(Object.create(null)) -> false
function isObject(val) {
    return val instanceof Object; 
}

typeof x === 'object' funktioniert nicht, wegen falscher positivernull) und falsche Negative (Funktionen):

// oops: isObject(Object) -> false
function isObject(val) {
    return (typeof val === 'object');
}

Object.prototype.toString.call funktioniert nicht, weil alle primitiven Dateien falsch sind:

> Object.prototype.toString.call(3)
"[object Number]"

> Object.prototype.toString.call(new Number(3))
"[object Number]"

Also benutze ich:

function isObject(val) {
    if (val === null) { return false;}
    return ( (typeof val === 'function') || (typeof val === 'object') );
}

@ Daans Antwort scheint auch zu funktionieren:

function isObject(obj) {
  return obj === Object(obj);
}

weil, nach der MDN-Dokumente:

Der Object-Konstruktor erstellt einen Objektwrapper für den angegebenen Wert. Wenn der Wert null oder nicht definiert ist, wird ein leeres Objekt erstellt und zurückgegeben, andernfalls wird ein Objekt eines Typs zurückgegeben, der dem angegebenen Wert entspricht. Wenn der Wert bereits ein Objekt ist, wird der Wert zurückgegeben.


Ein dritter Weg scheint zu funktionieren (nicht sicher, ob es 100% ist) zu benutzen Object.getPrototypeOf welche löst eine Ausnahme aus wenn sein Argument kein Objekt ist:

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

429
2018-03-18 14:44



Das offizielle Unterstrich.js verwendet diese Überprüfung, um herauszufinden, ob etwas wirklich ein Objekt ist

// Is a given variable an object?
_.isObject = function(obj) {
  return obj === Object(obj);
};

173
2018-02-05 11:50



Object.prototype.toString.call(myVar) wird zurückkehren:

  • "[object Object]" Wenn myVar ein Objekt ist
  • "[object Array]" Wenn myVar ein Array ist
  • etc.

Für weitere Informationen und warum es eine gute Alternative zu typeof ist, Schaut euch diesen Artikel an.


148
2017-11-13 06:20



Ich mag einfach:

function isObject (item) {
  return (typeof item === "object" && !Array.isArray(item) && item !== null);
}

Wenn das Objekt ein JS-Objekt ist und es kein JS-Array ist, ist es das nicht null... wenn alle drei wahr sind, kehre zurück true. Wenn eine der drei Bedingungen nicht erfüllt wird, && Test wird kurzgeschlossen und false Wird zurückgegeben. Das null Test kann weggelassen werden, wenn gewünscht (abhängig davon, wie Sie verwenden null).

DOCS:

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


65
2017-09-07 22:49



Zum einfachen Überprüfen auf Objekt oder Array ohne zusätzlichen Funktionsaufruf (Geschwindigkeit). Wie auch gepostet Hier.

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 () - Hinweis: Wird nur für Objektliterale verwendet, da für benutzerdefinierte Objekte false zurückgegeben wird, z. B. neues Datum oder neues 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

61
2018-05-17 11:39



Mit Funktion Array.isArray:

function isObject(o) {
  return o !== null && typeof o === 'object' && Array.isArray(o) === false;
}

Ohne Funktion Array.isArray:

Nur überrascht, wie viele upvotes für falsche Antworten
 Nur 1 Antwort habe meine Tests bestanden !!! Hier habe ich meine vereinfachte Version erstellt:

function isObject(o) {
  return o instanceof Object && o.constructor === Object;
}

Für mich ist es klar und einfach und funktioniert einfach! Hier meine Tests:

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

ONE MORE TIME: Nicht alle Antworten bestehen diese Tests !!!


Falls Sie das Objekt überprüfen müssen Instanz einer bestimmten Klasse Sie müssen den Konstruktor mit Ihrer speziellen Klasse überprüfen, wie:

function isDate(o) {
  return o instanceof Object && o.constructor === Date;
}

einfacher Test:

var d = new Date();
console.log(isObject(d)); // Will return: false
console.log(isDate(d));   // Will return: true

Als Ergebnis haben Sie strengen und robusten Code!


Für den Fall, dass Sie keine Funktionen wie isDate, isError, isRegExpusw. können Sie eine Option zur Verwendung dieser verallgemeinerten Funktionen in Betracht ziehen:

function isObject(o) {
  return o instanceof Object && typeof o.constructor === 'function';
}

Es wird nicht für alle oben genannten Testfälle korrekt funktionieren, aber es ist gut genug für alle Objekte (einfach oder konstruiert).


isObject wird nicht funktionieren im Falle von Object.create(null) wegen der internen Implementierung von Object.create was erklärt wird Hier aber du kannst es benutzen isObject in anspruchsvolleren Implementierung:

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;
};

Es ist bereits erstellt Paket auf Npm v1 basiert auf dieser Implementierung! Und es funktioniert für alle früher beschriebenen Testfälle!


56
2017-10-10 09:21



OK, lassen Sie uns dieses Konzept zuerst geben, bevor Sie Ihre Frage beantworten, in JavaScript Funktionen sind Object, auch Null, Object, Arrays und sogar Datum, so wie Sie sehen, gibt es nicht eine einfache Art wie typeof obj === "object", also alles oben erwähnte wird zurück wahr, aber es gibt Möglichkeiten, dies zu überprüfen, indem Sie eine Funktion schreiben oder JavaScript-Frameworks verwenden, OK:

Stellen Sie sich vor, Sie haben dieses Objekt, das ein reales Objekt ist (nicht Null oder Funktion oder Array):

var obj = {obj1: 'obj1', obj2: 'obj2'};

Reine JavaScript:

//that's how it gets checked in angular framework
function isObject(obj) {
  return obj !== null && typeof obj === 'object';
}

oder

//make sure the second object is capitalised 
function isObject(obj) {
   return Object.prototype.toString.call(obj) === '[object Object]';
}

oder

function isObject(obj) {
    return obj.constructor.toString().indexOf("Object") > -1;
}

oder

function isObject(obj) {
    return obj instanceof Object;
}

Sie können einfach eine dieser Funktionen wie oben in Ihrem Code verwenden, indem Sie sie aufrufen, und es wird True zurückgegeben, wenn es ein Objekt ist:

isObject(obj);

Wenn Sie ein JavaScript-Framework verwenden, haben sie normalerweise diese Art von Funktionen für Sie vorbereitet, dies sind nur einige von ihnen:

jQuery:

 //It returns 'object' if real Object;
 jQuery.type(obj);

Eckig:

angular.isObject(obj);

Unterstrich und Lazash:

//(NOTE: in Underscore and Lodash, functions, arrays return true as well but not null)
_.isObject(obj);

26
2018-02-15 13:39