überprüfen Sie einfach, ob Ihre Neuzuordnung tatsächlich etwas tat:
var isConst = function(name, context) {
// does this thing even exist in context?
context = context || this;
if(typeof context[name] === "undefined") return false;
// if it does exist, a reassignment should fail, either
// because of a throw, or because reassignment does nothing.
try {
var _a = context[name];
context[name] = !context[name];
if (context[name] === _a) return true;
// make sure to restore after testing!
context[name] = _a;
} catch(e) { return true; }
return false;
}.bind(this);
Sie den Versuch benötigen/da fängt neu zuweisen kann eine Ausnahme auslösen (wie in Firefox), aber wenn es nicht (wie in Chrome), überprüfen Sie einfach, ob Ihre Neuzuordnung „dies immer den Wert ändert“ tatsächlich tat nichts.
Ein einfacher Test:
const a = 4;
var b = "lol";
isConst('a'); // -> true
isConst('b'); // -> false
Und wenn man die consts in anderen Kontext zu erklären, dass Zusammenhang passieren in der Auflösung auf das richtige Objekt zu erzwingen.
Nachteil: das funktioniert nicht auf Vars außerhalb des Objekts Tive erklärt. Upside: Es macht absolut keinen Sinn, sie irgendwo anders zu deklarieren.Zum Beispiel, sie in Funktionsumfang erklärt macht das const
Stichwort meist nutzlos:
function add(a) {
return ++a;
}
function test() {
const a = 4;
console.log(add(a));
}
test(); // -> 5
Obwohl a
konstanter Innen Test() ist, wenn Sie es noch etwas passieren, es als regulärer wandelbar Wert übergeben wird, weil es jetzt nur "eine Sache" in der arguments
Liste.
Darüber hinaus ist der einzige Grund für eine const
ist, weil es nicht ändert. Wenn Sie es also ständig neu erstellen, weil Sie eine Funktion aufrufen, die es mehr als einmal verwendet, bedeutet dies, dass Ihr const
stattdessen außerhalb der Funktion leben sollte, also sind wir gezwungen, die Variable in einen Objektbereich zu stellen.
Für mich 'const a = 2; a ++;' wirft einen 'SyntaxError' (" ungültige Zuweisung zu const a ") mit Firefox 37.0, auch ohne strict mode und ich habe' javascript.options.strict' nicht aktiviert. Eine andere ist ein 'TypeError':" redeclaration of const a ", wenn ich" const a = 2; delete a; "oder" const a = 2; const a = 2; ". – Xufox
Interessante Frage. Ich denke nicht, dass es für die meisten Browser möglich ist - zumindest [nach Mozillas Kompatibilitätsdiagramm] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const#Browser_compatibility)) - aber ich wäre sehr neugierig, ob es einen Weg gibt, es zu erkennen. – brianvaughn
Welchen Browser benutzen Sie? Da es sich bei Firefox 37.0 um einen 'try-catch' handelt, der versucht, eine Konstante neu zu definieren und Syntaxfehler zu fangen, könnte das funktionieren. – Xufox