Don't stuff things into objects. Use a dict instead.
You're probably used to stuffing things into objects:
var hash = {};
hash["foo"] = "bar";
console.log("foo" in hash ? hash["foo"] : "not there"); // "bar"
However this doesn't always work, because your naïve hashes inherit from
Object.prototype:
var hash = {};
console.log("hasOwnProperty" in hash); // true!
Even worse, the magic __proto__ property can really ruin your day:
var hash = {};
var anotherObject = { foo: "bar" };
hash["__proto__"] = anotherObject;
console.log("foo" in hash); // true!!
console.log("__proto__" in hash); // false!!!
Usually you're smart enough to avoid silly key names like "hasOwnProperty", "__proto__", and all the rest. But sometimes you want to
store user input in your hashes. Uh-oh…
Just do an npm install dict and you're good to go:
var dict = require("dict");
var d = dict();
d.set("foo", "bar");
console.log(d.get("foo", "not there")); // "bar"
console.log(d.has("hasOwnProperty")); // false :)
var anotherObject = { baz: "qux" };
d.set("__proto__", anotherObject);
console.log(d.has("baz")); // false :)
console.log(d.has("__proto__")); // true :)
get, set, has, delete.get accepts a second argument as a fallback for if the key isn't present (like Mozilla's WeakMap).TypeError.npm test awaits you.Map if you want more than just strings for your keys.