2017-01-16 4 views
2

mit ECMAScript 6, kann ich schreiben:denaturiert, verschachteltes Objekt mit Standardeinstellung, einschließlich Knoten

const { 
    a = mandatory('a'), 
    b: { 
    c = mandatory('c'), 
    d = mandatory('d') 
    } = mandatory('b') 
} = { a: 'a', b: { c: 'c', d: 'd' } } 
console.log(a, b, c, d) 

function mandatory (field) { 
    throw new Error(`Not giving you a ReferenceError today, but you must set a non-falsy value to "${field}"!`) 
} 

mandatory ist eine Funktion, die „Standardwerte Syntax“ verwendet und soll einen „bekannten“ Fehler in Fall wirft eine Eigenschaft wird auf einen falschen Wert gesetzt.

Wenn ich den Code ausführen, bekomme ich eine ReferenceError: b is not defined. Wenn ich d: 'd' entferne, wirft es den Fehler plötzlich nicht mehr.

... = { a: 'a', b: { c: 'c' } } 

Es wirft einen gewünschten Fehler:

Error: Not giving you a ReferenceError today, but you must set a non-falsy value "d"! 
  1. Wie kann ich b definiert machen?
  2. Wie kann ich mandatory aufrufen und meinen eigenen Fehler werfen, wenn a.b auf einen nicht-falsy Wert gesetzt ist?
+2

* Wenn ich entfernen 'd:‚d' '* - von wo? Das ist nicht in dem Code, den du gepostet hast. – Pointy

+0

Und Ihr Code, wie er ist, funktioniert gut für mich in Node 6.2.2. – Pointy

+0

Sorry, repariere es. Ich habe '' 'd: 'd'' '' hinzugefügt. Der "ReferenceError" ist also nicht erwünscht, aber der "Error" ist erwünscht. – mitchkman

Antwort

0

Die Lösung gefunden. Eigentlich macht es für mich keinen Sinn, einen mandatory Funktionsaufruf zu haben, falls b einen Falsy-Wert hat. Wenn c oder d existieren, wird b nicht falsch sein.

Diese nicht mehr gibt den Referenzfehler
const { 
    a = mandatory('a'), 
    b, // Added this line 
    b: { 
    c = mandatory('c'), 
    d = mandatory('d') 
    } 
} = { a: 'a', b: { c: 'c', d: 'd'} } 
console.log(a, b, c, d) 

function mandatory (field) { 
    throw new Error(`Not giving you a ReferenceError today, but you must set "${field}"!`) 
} 

:

Aber b für weiteren proessing definiert zu machen, wird es kann wie folgt durchgeführt werden.

0

b ist nicht definiert, weil es keine solche Variable gibt. Die b: ist nur der Eigenschaftsname für den Wert, der dem Destrukturierungsobjektliteral zugewiesen wird, deklariert keine Variable b. Zum einen bekommen, müssen Sie zwei Destrukturierung Schritte verwenden:

const { 
    a = mandatory('a'), 
    b = mandatory('b'), 
} = { a: 'a', b: { c: 'c', d: 'd' } }, 
// or write `; const` here   ^
{ 
    c = mandatory('b.c'), 
    d = mandatory('b.d') 
} = b; 
console.log(a, b, c, d); 
+0

? Sein Code funktionierte gut für mich in der Firefox-Konsole – Pointy

+0

@ Pointy Ah, verpasste ich die Antwort, die einen doppelten Namen der Eigenschaft verwendet. – Bergi

Verwandte Themen