1. How is a user supposed to intuit the difference between Object.keys and Object.keysIn? For a non-expert, it sounds like the same thing. 2. With "keys", "entries", etc., we lead the user down the "safe" object-as-dict path. Does adding these methods undo some of that leading? What are the compelling use-cases for proto-chain-as-dict?
On Tue, Mar 8, 2016 at 3:23 PM Leo Balter <[email protected]> wrote: > I have a proposal I'm finally bringing to es-discuss. > > https://github.com/leobalter/object-keysin-valuesin-entries-in > (rationale, examples and steps included) > > I've already talked to some TC39 members about it and I believe it fits > right on this topic. > > On Mon, Mar 7, 2016 at 5:48 PM, Bergi <[email protected]> wrote: > >> Langdon wrote: >> >> Something that simply wraps this all-to-common code: >>> >>> var key; >>> >>> for (key in obj) { >>> if (obj.hasOwnProperty(key) === true) { >>> ... >>> } >>> } >>> >> >> Imo the problem is not that there is no wrapper method for this pattern, >> but that this code is all too common. It should rarely be needed, and is >> mostly wrong anyway. >> >> The cases to consider are >> >> * You use `obj` as a dictionary. If you want to safeguard against >> inherited properties, you use `obj = Object.create(null)`. Those objects >> don't even have a `.hasOwnProperty` method. >> And with ES6, a `Map` is a better solution anyway. >> >> * You are enumerating array keys. To safeguard against inherited >> properties from `Array.prototype`, you should not use `hasOwnProperty` but >> rather use the proper loop type that iterates indices instead. >> >> * You are processing JSON. `JSON.parse`'d objects inherit only from >> `Object.prototype` which does not have enumerable properties anyway. >> >> * You are processing (JSON/dictionary) objects and fear that someone >> added enumerable properties to `Object.prototype`. Well, that's their >> fault, not your loop's one. If the environment is broken, your code is as >> well; there's nothing you can - and need - to do against. >> >> * You are processing arbitrary objects with unknown prototype chains. To >> skip inherited properties in a `for in` loop, the only safe approach is to >> use `if (Object.prototype.hasOwnProperty.call(obj, key))` or avoid the >> drama altogether via `Object.keys`/`Object.getOwnProperty…`. >> >> The last case is the only one where you'd really need `hasOwnProperty`. >> The proliferation of `if (obj.hasOwnProperty(key))` needs to be stopped, >> it's cargo cult programming at best. >> >> Regards, >> Bergi >> >> _______________________________________________ >> es-discuss mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/es-discuss >> > > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

