Suche…


Syntax

  • object = {}
  • object = neues Objekt ()
  • object = Object.create (Prototyp [, Eigenschaftenobjekt])
  • object.key = Wert
  • Objekt ["Schlüssel"] = Wert
  • Objekt [Symbol ()] = Wert
  • object = {key1: value1, "key2": value2, 'key3': value3}
  • object = {conciseMethod () {…}}
  • object = {[berechnet () + "Schlüssel"]: Wert}
  • Object.defineProperty (obj, propertyName, propertyDescriptor)
  • property_desc = Object.getOwnPropertyDescriptor (obj, propertyName)
  • Objekt.Frost (obj)
  • Object.seal (obj)

Parameter

Eigentum Beschreibung
value Der Wert, der der Eigenschaft zugewiesen werden soll.
writable Ob der Wert der Eigenschaft geändert werden kann oder nicht.
enumerable Gibt an, ob die Eigenschaft for in Schleifen aufgelistet wird oder nicht.
configurable Ob es möglich ist, den Eigenschaftsdeskriptor neu zu definieren oder nicht.
get Eine aufzurufende Funktion, die den Wert der Eigenschaft zurückgibt.
set Eine Funktion, die aufgerufen werden soll, wenn der Eigenschaft ein Wert zugewiesen wird.

Bemerkungen

Objekte sind Sammlungen von Schlüsselwertpaaren oder Eigenschaften. Die Schlüssel können String oder Symbol Werte sind entweder Grundelemente (Zahlen, Strings, Symbole) oder Verweise auf andere Objekte.

Bei JavaScript handelt es sich bei einer erheblichen Anzahl von Werten um Objekte (z. B. Funktionen, Arrays) oder Primitive, die sich als unveränderliche Objekte (Zahlen, Strings, Booleans) verhalten. Auf ihre Eigenschaften oder die Eigenschaften ihres prototype kann mit der Punktnotation ( obj.prop ) oder der Klammer ( obj['prop'] ) zugegriffen werden. Bemerkenswerte Ausnahmen sind die speziellen Werte undefined und null .

Objekte werden in JavaScript als Referenz gehalten, nicht als Wert. Dies bedeutet, dass "kopiert" und "original" Verweise auf dasselbe Objekt sind, wenn sie kopiert oder als Argumente an Funktionen übergeben werden, und eine Änderung der eigenen Eigenschaften die gleiche Eigenschaft des anderen Objekts ändert. Dies gilt nicht für Primitive, die unveränderlich sind und als Wert übergeben werden.

Objektschlüssel

5

Object.keys(obj) gibt ein Array der Schlüssel eines Objekts zurück.

var obj = {
    a: "hello",
    b: "this is",
    c: "javascript!"
};

var keys = Object.keys(obj);

console.log(keys); // ["a", "b", "c"]

Flaches Klonen

6

Die Object.assign() Funktion von ES6 kann verwendet werden, um alle aufzählbaren Eigenschaften von einer vorhandenen Object Instanz in eine neue zu kopieren.

const existing = { a: 1, b: 2, c: 3 };

const clone = Object.assign({}, existing);

Dies schließt Symbol zusätzlich zu String Eigenschaften ein.

Die Zerstörung von Objektrest / Spreizung, die derzeit ein Vorschlag der Stufe 3 ist, bietet eine noch einfachere Methode zum Erstellen flacher Klone von Objektinstanzen:

const existing = { a: 1, b: 2, c: 3 };

const { ...clone } = existing;

Wenn Sie ältere Versionen von JavaScript unterstützen müssen, besteht die .hasOwnProperty() Möglichkeit, ein Objekt zu klonen, indem Sie die Eigenschaften manuell .hasOwnProperty() und geerbte mit .hasOwnProperty() .

var existing = { a: 1, b: 2, c: 3 };

var clone = {};
for (var prop in existing) {
  if (existing.hasOwnProperty(prop)) {
    clone[prop] = existing[prop];
  }
}

Object.defineProperty

5

Damit können wir eine Eigenschaft in einem vorhandenen Objekt mithilfe eines Eigenschaftsdeskriptors definieren.

var obj = { };

Object.defineProperty(obj, 'foo', { value: 'foo' });

console.log(obj.foo);

Konsolenausgabe

foo

Object.defineProperty kann mit den folgenden Optionen aufgerufen werden:

Object.defineProperty(obj, 'nameOfTheProperty', {
  value: valueOfTheProperty, 
  writable: true, // if false, the property is read-only
  configurable : true, // true means the property can be changed later
  enumerable : true // true means property can be enumerated such as in a for..in loop
});

Object.defineProperties können Sie mehrere Eigenschaften gleichzeitig definieren.

var obj = {};
Object.defineProperties(obj, {
  property1: {
    value: true,
    writable: true
  },
  property2: {
    value: 'Hello',
    writable: false
  }      
});

Schreibgeschützte Eigenschaft

5

Mithilfe von Eigenschaftsdeskriptoren können Sie eine Eigenschaft schreibgeschützt machen, und jeder Versuch, den Wert zu ändern, schlägt fehl, der Wert wird nicht geändert und es wird kein Fehler ausgegeben.

Die writable Eigenschaft in einem Eigenschaftsdeskriptor gibt an, ob diese Eigenschaft geändert werden kann oder nicht.

var a  = { };

Object.defineProperty(a, 'foo', { value: 'original', writable: false });

a.foo = 'new';

console.log(a.foo);

Konsolenausgabe

Original

Nicht aufzuzählende Eigenschaft

5

Wir können vermeiden, dass eine Eigenschaft in for (... in ...) Schleifen auftaucht

Die enumerable Eigenschaft des Eigenschaftsdeskriptors gibt an, ob diese Eigenschaft beim Durchlaufen der Eigenschaften des Objekts aufgelistet wird.

var obj = { };

Object.defineProperty(obj, "foo", { value: 'show', enumerable: true });
Object.defineProperty(obj, "bar", { value: 'hide', enumerable: false });

for (var prop in obj) {
    console.log(obj[prop]);
}

Konsolenausgabe

Show

Eigenschaftsbeschreibung sperren

5

Der Deskriptor einer Eigenschaft kann gesperrt werden, so dass keine Änderungen daran vorgenommen werden können. Es ist immer noch möglich, die Eigenschaft normal zu verwenden, den Wert zuzuweisen und abzurufen, aber jeder Versuch, ihn neu zu definieren, löst eine Ausnahme aus.

Die configurable Eigenschaft des Eigenschaftendeskriptors wird verwendet, um weitere Änderungen am Deskriptor zu unterbinden.

var obj = {};

// Define 'foo' as read only and lock it
Object.defineProperty(obj, "foo", { 
    value: "original value", 
    writable: false, 
    configurable: false
});
 
Object.defineProperty(obj, "foo", {writable: true});

Dieser Fehler wird ausgegeben:

TypeError: Eigenschaft kann nicht neu definiert werden: foo

Und die Eigenschaft wird weiterhin nur gelesen.

obj.foo = "new value";
console.log(foo);

Konsolenausgabe

Originalwert

Accesor Eigenschaften (get und set)

5

Behandeln Sie eine Eigenschaft als eine Kombination aus zwei Funktionen, eine, um den Wert daraus zu erhalten, und eine andere, um den Wert darin festzulegen.

Die get Eigenschaft des Eigenschaftsdeskriptors ist eine Funktion, die aufgerufen wird, um den Wert aus der Eigenschaft abzurufen.

Die set Eigenschaft ist auch eine Funktion. Sie wird aufgerufen, wenn der Eigenschaft ein Wert zugewiesen wurde, und der neue Wert wird als Argument übergeben.

Sie können einem Deskriptor, der get oder set , keinen value oder writable zuweisen

var person = { name: "John", surname: "Doe"};
Object.defineProperty(person, 'fullName', { 
    get: function () { 
        return this.name + " " + this.surname;
    },
    set: function (value) {
        [this.name, this.surname] = value.split(" ");
    }
});

console.log(person.fullName); // -> "John Doe"

person.surname = "Hill";
console.log(person.fullName); // -> "John Hill"

person.fullName = "Mary Jones";
console.log(person.name) // -> "Mary"

Eigenschaften mit Sonderzeichen oder reservierten Wörtern

Während die Objektmerkmalsnotation normalerweise als myObject.property geschrieben myObject.property , werden nur Zeichen erlaubt, die normalerweise in JavaScript-Variablennamen vorkommen , hauptsächlich Buchstaben, Zahlen und Unterstrich ( _ ).

Wenn Sie Sonderzeichen wie Leerzeichen, ☺ oder vom Benutzer zur Verfügung gestellte Inhalte benötigen, ist dies mit der [] -Klammernotation möglich.

myObject['special property ☺'] = 'it works!'
console.log(myObject['special property ☺'])

All-stellige Eigenschaften:

All-Ziffern-Eigenschaftsnamen erfordern zusätzlich zu Sonderzeichen eine Klammernotation. In diesem Fall muss die Eigenschaft jedoch nicht als Zeichenfolge geschrieben werden.

myObject[123] = 'hi!' // number 123 is automatically converted to a string
console.log(myObject['123']) // notice how using string 123 produced the same result
console.log(myObject['12' + '3']) // string concatenation
console.log(myObject[120 + 3]) // arithmetic, still resulting in 123 and producing the same result
console.log(myObject[123.0]) // this works too because 123.0 evaluates to 123
console.log(myObject['123.0']) // this does NOT work, because '123' != '123.0'

Führende Nullen werden jedoch nicht empfohlen, da dies als Oktal-Notation interpretiert wird. (TODO, wir sollten ein Beispiel erstellen, das die Oktal-, Hexadezimal- und Exponenten-Notation beschreibt.)

Siehe auch: [Arrays are Objects] Beispiel.

Dynamische / variable Eigenschaftsnamen

Manchmal muss der Name der Eigenschaft in einer Variablen gespeichert werden. In diesem Beispiel fragen wir den Benutzer, welches Wort nachgeschlagen werden muss, und liefern dann das Ergebnis eines Objekts, das ich dictionary .

var dictionary = {
    lettuce: 'a veggie',
    banana: 'a fruit',
    tomato: 'it depends on who you ask',
    apple: 'a fruit',
    Apple: 'Steve Jobs rocks!' // properties are case-sensitive
}

var word = prompt('What word would you like to look up today?')
var definition = dictionary[word]
alert(word + '\n\n' + definition)

Beachten Sie, wie wir die Klammer-Notation [] verwenden, um die Variable namens word . wenn wir das traditionelle verwenden würden . Notation, dann würde es den Wert wörtlich nehmen, daher:

console.log(dictionary.word)  // doesn't work because word is taken literally and dictionary has no field named `word`
console.log(dictionary.apple) // it works! because apple is taken literally

console.log(dictionary[word]) // it works! because word is a variable, and the user perfectly typed in one of the words from our dictionary when prompted
console.log(dictionary[apple]) // error! apple is not defined (as a variable)

Sie könnten auch Literalwerte mit schreiben [] Notation durch die Variable ersetzt word mit einem String 'apple' . Siehe Beispiel [Eigenschaften mit Sonderzeichen oder reservierten Wörtern].


Sie können dynamische Eigenschaften auch mit der Klammer-Syntax festlegen:

var property="test";
var obj={
 [property]=1;
};

console.log(obj.test);//1

Es macht das gleiche wie:

var property="test";
var obj={};
obj[property]=1;

Arrays sind Objekte

Haftungsausschluss: Das Erstellen von Array-ähnlichen Objekten wird nicht empfohlen. Es ist jedoch hilfreich zu verstehen, wie sie funktionieren, insbesondere wenn Sie mit DOM arbeiten. Dies erklärt, warum reguläre Array-Operationen nicht für DOM-Objekte funktionieren, die von vielen DOM- document werden. (dh querySelectorAll , form.elements )

Angenommen, wir haben das folgende Objekt erstellt, das einige Eigenschaften aufweist, die Sie in einem Array erwarten würden.

var anObject = {
    foo: 'bar',
    length: 'interesting',
    '0': 'zero!',
    '1': 'one!'
};

Dann erstellen wir ein Array.

var anArray = ['zero.', 'one.'];

Beachten Sie nun, wie wir sowohl das Objekt als auch das Array auf dieselbe Weise untersuchen können.

console.log(anArray[0], anObject[0]); // outputs: zero.  zero!
console.log(anArray[1], anObject[1]); // outputs: one.  one!
console.log(anArray.length, anObject.length); // outputs: 2 interesting
console.log(anArray.foo, anObject.foo); // outputs: undefined bar

Da ein anArray genau wie anObject ein Objekt ist, können wir einem anObject sogar benutzerdefinierte Eigenschaften anArray

Haftungsausschluss: Arrays mit benutzerdefinierten Eigenschaften werden normalerweise nicht empfohlen, da sie verwirrend sein können. In fortgeschrittenen Fällen, in denen Sie die optimierten Funktionen eines Arrays benötigen, kann dies jedoch nützlich sein. (dh jQuery-Objekte)

anArray.foo = 'it works!';
console.log(anArray.foo);

Wir können sogar anObject ein Array-ähnliches Objekt machen, anObject wir eine length hinzufügen.

anObject.length = 2;

Dann können Sie die for Schleife im C-Stil verwenden, um über ein anObject wie bei einem Array zu iterieren. Siehe Array-Iteration

Beachten Sie, dass anObject nur ein Array-ähnliches Objekt ist. (auch als Liste bezeichnet) Es ist kein echtes Array. Dies ist wichtig, da Funktionen wie push und forEach (oder eine in Array.prototype gefundene Array.prototype ) standardmäßig nicht für Array-ähnliche Objekte verwendet werden.

Viele der DOM- document geben eine Liste zurück (z. B. querySelectorAll , form.elements ), die dem oben genannten array-like anObject ähnelt. Siehe Konvertieren von Array-ähnlichen Objekten in Arrays

console.log(typeof anArray == 'object', typeof anObject == 'object'); // outputs: true  true
console.log(anArray instanceof Object, anObject instanceof Object); // outputs: true  true
console.log(anArray instanceof Array, anObject instanceof Array); // outputs: true  false
console.log(Array.isArray(anArray), Array.isArray(anObject)); // outputs: true  false

Objekt.Frost

5

Object.freeze macht ein Objekt unveränderlich, indem das Hinzufügen neuer Eigenschaften, das Entfernen vorhandener Eigenschaften und das Ändern der Aufzählbarkeit, Konfigurierbarkeit und Beschreibbarkeit vorhandener Eigenschaften verhindert werden. Es verhindert auch, dass der Wert vorhandener Eigenschaften geändert wird. Es funktioniert jedoch nicht rekursiv, was bedeutet, dass untergeordnete Objekte nicht automatisch eingefroren werden und Änderungen unterliegen.

Die auf das Einfrieren folgenden Vorgänge schlagen automatisch fehl, wenn der Code nicht im strikten Modus ausgeführt wird. Wenn sich der Code im strikten Modus befindet, wird ein TypeError ausgelöst.

var obj = {
  foo: 'foo',
  bar: [1, 2, 3],
  baz: {
    foo: 'nested-foo'
  }
};

Object.freeze(obj);

// Cannot add new properties
obj.newProperty = true;

// Cannot modify existing values or their descriptors
obj.foo = 'not foo';
Object.defineProperty(obj, 'foo', {
    writable: true
});

// Cannot delete existing properties
delete obj.foo;

// Nested objects are not frozen
obj.bar.push(4);
obj.baz.foo = 'new foo';

Objekt.Siegel

5

Object.seal verhindert das Hinzufügen oder Entfernen von Eigenschaften eines Objekts. Nachdem ein Objekt versiegelt wurde, können seine Eigenschaftsbeschreibungen nicht in einen anderen Typ konvertiert werden. Im Gegensatz zu Object.freeze können Eigenschaften jedoch bearbeitet werden.

Versuche, diese Vorgänge an einem versiegelten Objekt auszuführen, schlagen automatisch fehl

var obj = { foo: 'foo', bar: function () { return 'bar'; } };

Object.seal(obj)

obj.newFoo = 'newFoo';
obj.bar = function () { return 'foo' };

obj.newFoo; // undefined
obj.bar(); // 'foo'

// Can't make foo an accessor property
Object.defineProperty(obj, 'foo', { 
    get: function () { return 'newFoo'; }
}); // TypeError

// But you can make it read only
Object.defineProperty(obj, 'foo', { 
    writable: false
}); // TypeError

obj.foo = 'newFoo';
obj.foo; // 'foo';

Im strikten Modus geben diese Operationen einen TypeError

(function () {
    'use strict';

    var obj = { foo: 'foo' };

    Object.seal(obj);

    obj.newFoo = 'newFoo'; // TypeError
}());

Iterable-Objekt erstellen

6
var myIterableObject = {};
// An Iterable object must define a method located at the Symbol.iterator key:
myIterableObject[Symbol.iterator] = function () {
  // The iterator should return an Iterator object
  return {
    // The Iterator object must implement a method, next()
    next: function () {
      // next must itself return an IteratorResult object 
      if (!this.iterated) {
        this.iterated = true;
        // The IteratorResult object has two properties
        return {
          // whether the iteration is complete, and
          done: false,
          // the value of the current iteration
          value: 'One'
        };
      }
      return {
        // When iteration is complete, just the done property is needed
        done: true
      };
    },
    iterated: false
  };
};

for (var c of myIterableObject) {
  console.log(c); 
}

Konsolenausgabe

Ein

Objektruhe / Ausbreitung (...)

7

Objektverbreitung ist nur syntaktischer Zucker für Object.assign({}, obj1, ..., objn);

Es ist mit dem Operator ... fertig:

let obj = { a: 1 };

let obj2 = { ...obj, b: 2, c: 3 };

console.log(obj2); // { a: 1, b: 2, c: 3 };

Als Object.assign es eine flache Verschmelzung und keine tiefe Verschmelzung durch.

let obj3 = { ...obj, b: { c: 2 } };

console.log(obj3); // { a: 1, b: { c: 2 } };

HINWEIS : Diese Spezifikation befindet sich derzeit in Stufe 3

Deskriptoren und benannte Eigenschaften

Eigenschaften sind Mitglieder eines Objekts. Jede benannte Eigenschaft ist ein Paar von (Name, Deskriptor). Der Name ist eine Zeichenfolge, die den Zugriff ermöglicht (mithilfe der Punktnotation object.propertyName oder des Notationsobjekts in eckigen Klammern object['propertyName'] ). Der Deskriptor ist ein Datensatz von Feldern, die den Abvahiour der Eigenschaft definieren, wenn auf sie zugegriffen wird (was mit der Eigenschaft geschieht und welcher Wert beim Zugriff zurückgegeben wird). Im Großen und Ganzen ordnet eine Eigenschaft einem Verhalten einen Namen zu (wir können das Verhalten als Blackbox betrachten).

Es gibt zwei Arten benannter Eigenschaften:

  1. Dateneigenschaft : Der Name der Eigenschaft ist einem Wert zugeordnet.
  2. Accessor-Eigenschaft : Der Name der Eigenschaft ist mit einer oder zwei Accessor-Funktionen verknüpft.

Demonstration:

obj.propertyName1 = 5; //translates behind the scenes into
                       //either assigning 5 to the value field* if it is a data property
                //or calling the set function with the parameter 5 if accessor property


//*actually whether an assignment would take place in the case of a data property
//also depends on the presence and value of the writable field - on that later on

Der Typ der Eigenschaft wird von den Feldern des Deskriptors bestimmt, und eine Eigenschaft kann nicht von beiden Typen sein.

Datenbeschreibungen -

  • Erforderliche Felder: value oder writable oder beides
  • Optionale Felder: configurable , enumerable

Probe:

{
   value: 10,
   writable: true;
}

Accessor-Deskriptoren -

  • Erforderliche Felder: get oder set oder beides
  • Optionale Felder: configurable , enumerable

Probe:

{
    get: function () {
        return 10;
    },
    enumerable: true
}

Bedeutung der Felder und ihrer Standardwerte

configurable , enumerable und writable :

  • Diese Schlüssel sind standardmäßig auf " false .
  • configurable ist nur dann true wenn der Typ dieses Eigenschaftsdeskriptors geändert werden kann und wenn die Eigenschaft aus dem entsprechenden Objekt gelöscht werden kann.
  • enumerable ist true wenn und nur dann, wenn diese Eigenschaft während der Aufzählung der Eigenschaften des entsprechenden Objekts angezeigt wird.
  • writable ist true dann true wenn der mit der Eigenschaft verknüpfte Wert mit einem Zuweisungsoperator geändert werden kann.

get und set :

  • Diese Schlüssel sind standardmäßig undefined .
  • get ist eine Funktion, die als Getter für die Eigenschaft dient, oder undefined wenn kein Getter vorhanden ist. Die Funktion return wird als Wert der Eigenschaft verwendet.
  • set ist eine Funktion, die als Setter für die Eigenschaft dient, oder undefined wenn es keinen Setter gibt. Die Funktion erhält als einziges Argument den neuen Wert, der der Eigenschaft zugewiesen wird.

value :

  • Dieser Schlüssel ist standardmäßig undefined .
  • Der mit der Eigenschaft verknüpfte Wert. Kann ein beliebiger gültiger JavaScript-Wert sein (Anzahl, Objekt, Funktion usw.).

Beispiel:

    var obj = {propertyName1: 1}; //the pair is actually ('propertyName1', {value:1,
                                                                    // writable:true,
                                                                    // enumerable:true,
                                                                    // configurable:true})
    Object.defineProperty(obj, 'propertyName2', {get: function() {
                                                    console.log('this will be logged ' + 
                                 'every time propertyName2 is accessed to get its value');
                                                },
                                            set: function() {
                                                    console.log('and this will be logged ' + 
                                'every time propertyName2\'s value is tried to be set')
                      //will be treated like it has enumerable:false, configurable:false
                                                }});
//propertyName1 is the name of obj's data property 
//and propertyName2 is the name of its accessor property





obj.propertyName1 = 3;
console.log(obj.propertyName1); //3

obj.propertyName2 = 3; //and this will be logged every time propertyName2's value is tried to be set
console.log(obj.propertyName2); //this will be logged every time propertyName2 is accessed to get its value 

Object.getOwnPropertyDescriptor

Rufen Sie die Beschreibung einer bestimmten Eigenschaft in einem Objekt ab.

var sampleObject = {
    hello: 'world'
};

Object.getOwnPropertyDescriptor(sampleObject, 'hello');
// Object {value: "world", writable: true, enumerable: true, configurable: true}

Objektklonen

Wenn Sie eine vollständige Kopie eines Objekts wünschen (dh die Objekteigenschaften und die Werte innerhalb dieser Eigenschaften usw.), wird dies als tiefes Klonen bezeichnet .

5.1

Wenn ein Objekt in JSON serialisiert werden kann, können Sie mit einer Kombination aus JSON.parse und JSON.stringify einen tiefen Klon davon JSON.stringify :

var existing = { a: 1, b: { c: 2 } };
var copy = JSON.parse(JSON.stringify(existing));
existing.b.c = 3; // copy.b.c will not change

Beachten Sie, dass JSON.stringify Date Objekte in ISO- JSON.stringify konvertiert, JSON.parse die Zeichenfolge jedoch nicht in ein Date .

In JavaScript gibt es keine integrierte Funktion zum Erstellen von tiefen Klonen. Generell ist es aus vielen Gründen nicht möglich, tiefe Klone für jedes Objekt zu erstellen. Zum Beispiel,

  • Objekte können nicht aufzuzählende und verborgene Eigenschaften haben, die nicht erkannt werden können.
  • Objekt-Getter und -Setter können nicht kopiert werden.
  • Objekte können eine zyklische Struktur haben.
  • Funktionseigenschaften können in einem verborgenen Bereich vom Zustand abhängen.

Angenommen, Sie haben ein "schönes" Objekt, dessen Eigenschaften nur Grundwerte, Datumsangaben, Arrays oder andere "schöne" Objekte enthalten, dann kann die folgende Funktion zum Erstellen von tiefen Klonen verwendet werden. Es ist eine rekursive Funktion, die Objekte mit einer zyklischen Struktur erkennen kann und in solchen Fällen einen Fehler auslöst.

function deepClone(obj) {
    function clone(obj, traversedObjects) {
        var copy;
        // primitive types
        if(obj === null || typeof obj !== "object") {
            return obj;
        }

        // detect cycles
        for(var i = 0; i < traversedObjects.length; i++) {
            if(traversedObjects[i] === obj) {
                throw new Error("Cannot clone circular object.");
            }
        }

        // dates
        if(obj instanceof Date) {
            copy = new Date();
            copy.setTime(obj.getTime());
            return copy;
        }
        // arrays
        if(obj instanceof Array) {
            copy = [];
            for(var i = 0; i < obj.length; i++) {
                copy.push(clone(obj[i], traversedObjects.concat(obj)));
            }
            return copy;
        }
        // simple objects
        if(obj instanceof Object) {
            copy = {};
            for(var key in obj) {
                if(obj.hasOwnProperty(key)) {
                    copy[key] = clone(obj[key], traversedObjects.concat(obj));
                }
            }
            return copy;
        }
        throw new Error("Not a cloneable object.");
    }

    return clone(obj, []);
}

Objektzuweisung

Die Object.assign () -Methode wird verwendet, um die Werte aller aufzählbaren eigenen Eigenschaften von einem oder mehreren Quellobjekten in ein Zielobjekt zu kopieren. Das Zielobjekt wird zurückgegeben.

Verwenden Sie es, um einem vorhandenen Objekt Werte zuzuweisen:

var user = {
    firstName: "John"
};

Object.assign(user, {lastName: "Doe", age:39});
console.log(user); // Logs: {firstName: "John", lastName: "Doe", age: 39} 

Oder um eine flache Kopie eines Objekts zu erstellen:

var obj = Object.assign({}, user);

console.log(obj); // Logs: {firstName: "John", lastName: "Doe", age: 39} 

Oder führen Sie viele Eigenschaften aus mehreren Objekten zu einem zusammen:

var obj1 = {
    a: 1
};
var obj2 = {
    b: 2
};
var obj3 = {
    c: 3
};
var obj = Object.assign(obj1, obj2, obj3);

console.log(obj); // Logs: { a: 1, b: 2, c: 3 }
console.log(obj1); // Logs: { a: 1, b: 2, c: 3 }, target object itself is changed

Primitive werden umbrochen, null und undefined werden ignoriert:

var var_1 = 'abc';
var var_2 = true;
var var_3 = 10;
var var_4 = Symbol('foo');

var obj = Object.assign({}, var_1, null, var_2, undefined, var_3, var_4);
console.log(obj); // Logs: { "0": "a", "1": "b", "2": "c" }

Beachten Sie, dass nur String-Wrapper über eigene aufzählbare Eigenschaften verfügen können

Verwenden Sie es als Reduzierer: (führt ein Array mit einem Objekt zusammen)

return users.reduce((result, user) => Object.assign({}, {[user.id]: user})

Iteration der Objekteigenschaften

Mit dieser Schleife können Sie auf jede Eigenschaft zugreifen, die zu einem Objekt gehört

for (var property in object) {
    // always check if an object has a property
    if (object.hasOwnProperty(property)) {
        // do stuff
    }
}

Sie sollten die zusätzliche Prüfung auf hasOwnProperty da ein Objekt Eigenschaften haben kann, die von der Basisklasse des Objekts geerbt werden. Wenn Sie diese Prüfung nicht durchführen, kann dies zu Fehlern führen.

5

Sie können auch die Object.keys Funktion verwenden, die ein Array Object.keys das alle Eigenschaften eines Objekts enthält. Anschließend können Sie dieses Array mit der Funktion Array.map oder Array.forEach .

var obj = { 0: 'a', 1: 'b', 2: 'c' };

Object.keys(obj).map(function(key) {
    console.log(key);
}); 
// outputs: 0, 1, 2

Eigenschaften von einem Objekt abrufen

Eigenschaften der Eigenschaften:

Eigenschaften, die von einem Objekt abgerufen werden können, können die folgenden Eigenschaften aufweisen:

  • Zahlreich
  • Nicht auflistbar
  • besitzen

Beim Erstellen der Eigenschaften mit Object.defineProperty (s) konnten wir die Eigenschaften außer "own" festlegen. Eigenschaften, die in der direkten Ebene und nicht in der Prototypebene ( __proto__ ) eines Objekts verfügbar sind, werden als eigene Eigenschaften bezeichnet.

Die Eigenschaften, die einem Objekt ohne Object.defindProperty(ies) hinzugefügt werden, haben kein Object.defindProperty(ies) . Das heißt, es wird als wahr betrachtet.

Zweck der Zählung:

Das Festlegen von Aufzählungsmerkmalen für eine Eigenschaft besteht hauptsächlich darin, die Verfügbarkeit der jeweiligen Eigenschaft beim Abrufen der Eigenschaft aus ihrem Objekt durch Verwendung verschiedener programmatischer Methoden zu gewährleisten. Diese verschiedenen Methoden werden im Folgenden ausführlich beschrieben.

Methoden zum Abrufen von Eigenschaften:

Eigenschaften eines Objekts können mit den folgenden Methoden abgerufen werden:

  1. for..in Schleife

    Diese Schleife ist sehr nützlich, um aufzählbare Eigenschaften von einem Objekt abzurufen. Zusätzlich ruft diese Schleife zahllose eigene Eigenschaften ab und führt dieselbe Abfrage durch, indem sie die Prototypkette durchläuft, bis der Prototyp als null betrachtet wird.

    //Ex 1 : Simple data
    var x = { a : 10 , b : 3} , props = [];
    
    for(prop in x){
      props.push(prop);
    }
    
    console.log(props); //["a","b"]
    
    //Ex 2 : Data with enumerable properties in prototype chain
    var x = { a : 10 , __proto__ : { b : 10 }} , props = [];
    
    for(prop in x){
      props.push(prop);
    }
    
    console.log(props); //["a","b"]
    
    //Ex 3 : Data with non enumerable properties
    var x = { a : 10 } , props = [];
    Object.defineProperty(x, "b", {value : 5, enumerable : false});
    
    for(prop in x){
      props.push(prop);
    }
    
    console.log(props); //["a"]
    
  2. Funktion Object.keys()

    Diese Funktion wurde als Teil von EcmaScript 5 vorgestellt. Sie wird verwendet, um aufzählbare eigene Eigenschaften von einem Objekt abzurufen. Vor seiner Veröffentlichung holte man eigene Eigenschaften von einem Objekt ab, indem er for..in loop und Object.prototype.hasOwnProperty() Funktion kombinierte.

    //Ex 1 : Simple data
    var x = { a : 10 , b : 3} , props;
    
    props = Object.keys(x);
    
    console.log(props); //["a","b"]
    
    //Ex 2 : Data with enumerable properties in prototype chain
    var x = { a : 10 , __proto__ : { b : 10 }} , props;
    
    props = Object.keys(x);
    
    console.log(props); //["a"]
    
    //Ex 3 : Data with non enumerable properties
    var x = { a : 10 } , props;
    Object.defineProperty(x, "b", {value : 5, enumerable : false});
    
    props = Object.keys(x);
    
    console.log(props); //["a"]
    
  1. Object.getOwnProperties() Funktion

    Diese Funktion ruft sowohl aufzählbare als auch nicht aufzählbare eigene Eigenschaften von einem Objekt ab. Es wurde auch als Teil von EcmaScript 5 veröffentlicht.

    //Ex 1 : Simple data
    var x = { a : 10 , b : 3} , props;
    
    props = Object.getOwnPropertyNames(x);
    
    console.log(props); //["a","b"]
    
    //Ex 2 : Data with enumerable properties in prototype chain
    var x = { a : 10 , __proto__ : { b : 10 }} , props;
    
    props = Object.getOwnPropertyNames(x);
    
    console.log(props); //["a"]
    
    //Ex 3 : Data with non enumerable properties
    var x = { a : 10 } , props;
    Object.defineProperty(x, "b", {value : 5, enumerable : false});
    
    props = Object.getOwnPropertyNames(x);
    
    console.log(props); //["a", "b"]
    

Verschiedenes :

Eine Technik zum Abrufen aller Eigenschaften (eigene, aufzählbare, nicht aufzählbare Eigenschaften, alle Prototypebenen) von einem Objekt ist unten angegeben.

function getAllProperties(obj, props = []){
  return obj == null ? props :
           getAllProperties(Object.getPrototypeOf(obj),
               props.concat(Object.getOwnPropertyNames(obj)));
}

var x = {a:10, __proto__ : { b : 5, c : 15 }};

//adding a non enumerable property to first level prototype
Object.defineProperty(x.__proto__, "d", {value : 20, enumerable : false});

console.log(getAllProperties(x)); ["a", "b", "c", "d", "...other default core props..."]

Dies wird von den Browsern unterstützt, die EcmaScript 5 unterstützen.

Konvertieren Sie die Werte des Objekts in ein Array

Angesichts dieses Objekts:

var obj = {
    a: "hello",
    b: "this is",
    c: "javascript!",
};

Sie können seine Werte in ein Array konvertieren, indem Sie Folgendes tun:

var array = Object.keys(obj)
    .map(function(key) {
        return obj[key];
    });

console.log(array); // ["hello", "this is", "javascript!"]

Iteration über Objekteinträge - Object.entries ()

8

Die vorgeschlagene Object.entries() -Methode gibt ein Array von Schlüssel / Wert-Paaren für das angegebene Objekt zurück. Es gibt keinen Iterator wie Array.prototype.entries() , aber das von Object.entries() Array kann unabhängig davon wiederholt werden.

const obj = {
    one: 1,
    two: 2,
    three: 3
};

Object.entries(obj);

Ergebnisse in:

[
    ["one", 1],
    ["two", 2],
    ["three", 3]
]

Dies ist eine nützliche Methode, um die Schlüssel / Wert-Paare eines Objekts zu durchlaufen:

for(const [key, value] of Object.entries(obj)) {
    console.log(key); // "one", "two" and "three"
    console.log(value); // 1, 2 and 3
}

Object.values ​​()

8

Die Object.values() -Methode gibt ein Array der eigenen aufzuzählenden Eigenschaftswerte eines Objekts in derselben Reihenfolge zurück, die von einer for ... in-Schleife angegeben wird (mit dem Unterschied, dass eine for-in-Schleife Eigenschaften in der Prototypkette auflistet auch).

var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']

Hinweis:

Informationen zur Browserunterstützung finden Sie unter diesem Link



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow