2017-10-16 2 views
0

Im Rahmen einer Bibliothek, die ich schreibe, ich mag den Benutzer lassen, passiert Funktionen wie Objektschlüssel:Wie sicher ist es, beim Erstellen eines Objekts anzunehmen, dass Nicht-String-Schlüssel mit toString() in Strings konvertiert werden?

https://github.com/welldone-software/redux-toolbelt/tree/master/packages/redux-toolbelt#makereducer

Zum Beispiel im Folgenden ist increaseBy eine Funktion mit einem benutzerdefinierten toString(), die einem zurückgibt Zeichenfolge und decreaseBy.TYPE ist eine Zeichenfolge.

const reducer = makeReducer({ 
    [increaseBy]: (state, {payload}) => state + payload, 
    [decreaseBy.TYPE]: (state, {payload}) => state - payload, 
}, { defaultState: 100 }) 

Wo increaseBy ist eine Funktion, die eine benutzerdefinierte hat toString(), die auf eine Zeichenfolge aufgelöst wird.

JS translates any key to string mit toString() so funktioniert es, aber meine Frage ist:

wie sicher ist es?

+1

Technisch ist es in einer ES2015-Umgebung sicher. Sie verlassen sich jetzt jedoch auf die implizite Typenkorrektur. Jeder, der Ihren Code betrachtet, kann nicht sofort erkennen, welche Eigenschaften das Objekt hat. Und betrachte Funktionen ohne eine benutzerdefinierte toString: const id = x => x; o = {[id]: "foo"} ' ergibt' {x => x: "foo"} '. – ftor

+0

Ja, das weiß ich. Wenn Sie sich unsere Bibliothek ansehen, ist das klar aus dem Fluss. Ich ordne nicht einfach eine zufällige Funktion mit benutzerdefiniertem 'toString()' darauf als Objektschlüssel zu :) –

Antwort

2

Nach der ES6 Spezifikation unter Abschnitt "12.2.6.8 Runtime Semantics: Evaluation" für "ComputedPropertyName" im vierten Schritt haben wir:

  1. Return ToPropertyKey (propName).

das unter "7.1.14 ToPropertyKey (argument)" im vierten Schritt:

  1. Return ToString (key).

So das Ergebnis [expression] wird toString werden. Auf der anderen Seite any string is a valid key für eine Eigenschaft, obwohl einige von ihnen nur über Klammern zugegriffen werden können.

+0

genau das, was ich gesucht habe. Vielen Dank. –

+0

Aber ich habe Ihren Kommentar nicht verstanden mit dem Zugriff über Klammern. Was hat es damit zu tun, was ich gefragt habe? –

+0

@VitalikZaidman Es hat nichts damit zu tun, was Sie gefragt haben. Ich wollte nur darauf hinweisen, dass nicht alle Eigenschaften per Punktnotation zugänglich sind, einige von ihnen sind nur mit eckigen Klammern zugänglich. –

Verwandte Themen