Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Arno Welzel Newsgroups: comp.lang.javascript Subject: Re: Understanding && Date: Sun, 18 Apr 2021 00:40:57 +0200 Lines: 80 Message-ID: References: <87wnt2e06e.fsf@bsb.me.uk> <87mttydm95.fsf@bsb.me.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Trace: individual.net U9Zs3vO3cJD06Da62Ryb3ws3iwdwPxfQAekVVa6Der5eS+c0XN Cancel-Lock: sha1:Iye7RXaCwUU1ZdlGjy9LeAjzAZg= In-Reply-To: <87mttydm95.fsf@bsb.me.uk> Xref: csiph.com comp.lang.javascript:39968 Ben Bacarisse: > Jon Ribbens writes: > >> On 2021-04-16, Ben Bacarisse wrote: >>> Jon Ribbens writes: >>>> You most often see this sort of thing in JavaScript that was >>>> automatically generated by a compiler (either because the original >>>> source was in something else like TypeScript or a more modern version >>>> of JavaScript or because the author wanted to compress/minify the >>>> script), but human beings are also quite capable of writing hard-to-read >>>> code like this. >>> >>> Is that specifically when the right-hand operand is an assignment >>> expression? I don't find that hard to read but then I'm used to >>> assignment being and expression so it seems like a natural extension of >>> the more frequently seen uses of &&. >> >> I mean where it's an expression being abused as a control flow >> mechanism. > > If readability is not the problem I'm not sure what constitutes abuse. Abuse is to use things for something which they are not meant to be used. An *expression* is called so because you *express* something like x = a && b; Nobody would expect that this *expression* will cause parts of the code to get executed or not like in this example: x = a && (b=5); It's not just a "readability problem". It's relying on side effects like that in a && b the "b" part will not get exectued if "a" is false. But this is just a convention and nothing obvious. > Is it just a rule of yours to keep these two things entirely separate? > Maybe some uses are acceptable and don't constitute abuse? Is any I see this as "abuse" as well. > reliance on short-circuit evaluation in an expression an abuse? If so, > does that extend to '??' and '?.'? (That's not easy to make clear in > typing but I hope you know what I mean.) The ??= operator was *intentionally* designed to work this way. x ??= y; will assign y to x only if x is not null or undefined. There is no surprise here what to expect from this expression. However: x = a && (b=5); Will assing something to x and *maybe* to b as well if a is not false. To understand this you need not only to know what the operator && does but also that it is evaluated from left to right and that if the left part is false the right part won't be used at all. > I only suggested that assignment might be where it crosses the line for > you because I think that's where the line is for a lot of people, but it > sounds like go further than that. > > I go the other way. Statements (most of them at least) are just wasted > expression opportunities. It's less noticeable in ECMAScript, than in > many other languages, but it still bugs me every now and then. Well - if you feel comfortable with this, you can but a whole program into a a few expressions without barely any statement at all. But this has nothing to do with good code style or anything which should be recommended as good practice. -- Arno Welzel https://arnowelzel.de