Mixing the semantics of a unary operator with a binary operator seems... not ideal.
On Tue, Jul 10, 2018 at 7:23 AM kai zhu <kaizhu...@gmail.com> wrote: > -1 > > this feature mostly cross-cuts "!obj.hasOwnProperty('foo')". the only > semantic-difference is "in" will check prototype-chain as jordan > pointed out (and widely regarded as a bad design-pattern), while > "hasOwnProperty" [correctly] will not. in every real-world use-case > i've encountered, hasOwnProperty is what you actually want instead of > in. and for looping, "Object.keys(obj).forEach(...)" is usually > faster than "for (key in obj) {...}" (partly because of again, the > bad-design prototype-chain lookup inherent with "in"). > > also, imagine the cognitive-load placed on yourself when debugging > integration-javascript with a mix of these cross-cutting > design-patterns: > > ```js > // can you easily spot where the subtle integration-bug is > // when dealing with code has a mashup of > // in and hasOwnProperty? > > if ('foo' !in obj) { > ... > } > ... > if (!obj.hasOwnProperty('bar') { > .... > } > ``` > > in summary for those who like to adhere to the python/jslint philosopy > of "there should be one and preferably only one way to do any given > task": > 1. for property-checks, "hasOwnProperty" is generally the one-and-only > correct-way to do it. > 2. for looping over properties, "Object.keys(obj).forEach(...)" is > generally the one-and-only correct-way to do it. > > following the above 2 guidelines will save you alot of needless > cognitive-load when doing integration-debugging of web-projects. > > -kai > > On 7/10/18, Naveen Chawla <naveen.c...@gmail.com> wrote: > > Good point. I've never needed falsey valid values in my obj/maps yet, so > > it'll continue to be very rare that I will need to use `in` (and I'll > > continue to prefer !obj.x when I don't). > > > > However, for this proposal I would prefer a new keyword like `notin` > > instead of `!in`, because the `!` followed by a word normally indicates > the > > inverse boolean of a value in other cases, whereas a clean break like > > `notin` I think seems clearer. Reserved keyword would probably be needed > > though? > > > > On Tue, 10 Jul 2018 at 09:44 Jordan Harband <ljh...@gmail.com> wrote: > > > >> `!obj.x` will return true for any falsy property - null, undefined, > >> positive or negative zero, NaN, and the empty string. `!(x in obj)` will > >> return true only if `x` is not an own property on `obj` nor anything in > >> its > >> prototype chain. They are decidedly different tests and they check for > >> decidedly different things. > >> > >> On Mon, Jul 9, 2018 at 9:08 PM, Naveen Chawla <naveen.c...@gmail.com> > >> wrote: > >> > >>> I don't use `in`. > >>> > >>> What do I get with `'x' !in obj` or `!(x in obj)` that I don't get with > >>> !obj['x'] ? > >>> > >>> Genuinely asking - I don't know what I am missing. > >>> > >>> I use obj[x] because I believe it's a more familiar syntax and I > believe > >>> I get the same outcome..(?).. > >>> > >>> On Mon, 9 Jul 2018 at 22:41 Steve Fink <sph...@gmail.com> wrote: > >>> > >>>> +1 from me for !in. It's a surprisingly common nuisance. > >>>> > >>>> And I don't care for the !obj.x workaround at all -- even if you can > >>>> survive the difference in semantics, from a code reading point of view > >>>> this > >>>> is saying something entirely different. > >>>> > >>>> And it is very different semantically. 'x' in obj does > [[HasProperty]]; > >>>> obj.x does [[GetProperty]]. With > >>>> > >>>> obj = { get x() { print("getter"); return 3; } }; > >>>> > >>>> then |"x" in obj| does not print "getter" while |obj.x| does. > >>>> > >>>> > >>>> On 06/29/2018 12:26 AM, Cyril Auburtin wrote: > >>>> > >>>> > >>>> ```js > >>>> if (!obj.x && !obj.y) { > >>>> doit() > >>>> } > >>>> ``` > >>>> The cases where they are equal to 0, '', null, undefined shouldn't > >>>> matter imo, if for example those x and y are numbers, they would be > >>>> defined, defaulted to 0, and you would test for `!== 0` rather if > >>>> needed > >>>> > >>>> Le jeu. 28 juin 2018 à 18:31, Guylian Cox <guylian...@gmail.com> a > >>>> écrit : > >>>> > >>>>> I agree, it's very annoying to have to write it !(x in y). I've been > >>>>> wanting this operator for a very, very long time. > >>>>> > >>>>> If there is interest for !in, I think !instanceof deserves to be > >>>>> included too. > >>>>> > >>>>> Le jeu. 28 juin 2018 à 18:19, T.J. Crowder < > >>>>> tj.crow...@farsightsoftware.com> a écrit : > >>>>> > >>>>>> On Thu, Jun 28, 2018 at 5:14 PM, Tobias Buschor < > >>>>>> tobias.busc...@shwups.ch> wrote: > >>>>>> > I dont like to write: > >>>>>> > if ( !('x' in obj) && !('y' in obj) ) { > >>>>>> > doit() > >>>>>> > } > >>>>>> > > >>>>>> > I was even tempted to write it that way: > >>>>>> > if ('x' in obj || 'y' in obj) { } else { > >>>>>> > doit() > >>>>>> > } > >>>>>> > >>>>>> There's > >>>>>> > >>>>>> ```js > >>>>>> if (!('x' in obj || 'y' in obj)) { > >>>>>> doit() > >>>>>> } > >>>>>> ``` > >>>>>> > >>>>>> That said, I've wanted !in many a time, in a minor sort of way... > >>>>>> > >>>>>> -- T.J. Crowder > >>>>>> _______________________________________________ > >>>>>> es-discuss mailing list > >>>>>> es-discuss@mozilla.org > >>>>>> https://mail.mozilla.org/listinfo/es-discuss > >>>>>> > >>>>> _______________________________________________ > >>>>> es-discuss mailing list > >>>>> es-discuss@mozilla.org > >>>>> https://mail.mozilla.org/listinfo/es-discuss > >>>>> > >>>> > >>>> > >>>> _______________________________________________ > >>>> es-discuss mailing > >>>> listes-discuss@mozilla.orghttps:// > mail.mozilla.org/listinfo/es-discuss > >>>> > >>>> > >>>> _______________________________________________ > >>>> es-discuss mailing list > >>>> es-discuss@mozilla.org > >>>> https://mail.mozilla.org/listinfo/es-discuss > >>>> > >>> > >>> _______________________________________________ > >>> es-discuss mailing list > >>> es-discuss@mozilla.org > >>> https://mail.mozilla.org/listinfo/es-discuss > >>> > >>> > >> > > > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss