I was reviewing a bit of code the other day and came across a set of syntax I hadn't seen before. It looked like this:
!!{...obj, ...obj2}.item
...
For further actions, you may consider blocking this person and/or reporting abuse
3 lines of clear code > 1 line of cryptic code
😛
I wrote the code that Laurie reviewed, and I do agree with everyone criticising it. The spreads in particular are very inefficient. In my defense, perhaps I should explain what the code was actually doing. The real
obj1
andobj2
were actuallypackageJson.devDependencies
andpackageJson.dependencies
, and originally I had been creating a combined list of dependencies, which I was then using elsewhere. When I simplified it into a single check, I didn't then also refactor out the spread. But that's what code reviews are for! The version that I ended up committing was something like:...except it was actually TypeScript. The
!!
was because the return value was a boolean. I supposed I could've used aBoolean
cast there. 🤷♂️Thanks for the answer, nice to know the "behind the scenes" 😄
I think in another comment Sebastian mentioned that depending on the target audience of the code, it may or may not be relevant to use some code conventions.
Personally when I see "!!" I know what it means but the first time I encountered it I was really puzzled 🙂
But again, context is everything. In this case, I'd say that the fact that the function is named "isGatsbySite" is more than enough to clarify the code.
I’d argue that it was a reasonable way of doing it. Was there a way to simplify it? Sure. But it wasn’t egregious. Plus, I learned something :)
Oh, that's a keeper. :D
Now that you have explained it I might use it for personal code but I definitely wouldn't have easily recognized what was going on without this explanation. Soo depending on the team I am working with I might not use it if I think it would confuse others on my team.
I have really started to prefer functions to provide clarity:
What's powerful here is if this is common place, make a helper!
!!x is just a less readable version of x != false.
{...a, ...b }.c is just a less efficient version of b.c ll a.c.
hmmm
Fair point -- although to really answer this we need to understand what the original code is trying to achieve to see what the actual problem domain is.
b.c ?? a.c might be sufficient, depending on how you want to deal with nullish values.
('c' in b ? b.c : a.c) might also do.
But whatever you're trying to do, it's unlikely that merging two objects to look up a property is the most reasonable option. :)
This is what the code should describe (not just to you - but to your average programmer)
I don't think that's a reasonable expectation.
The code will describe the what and the how, but I have yet to see a programming language which encapsulates the why of it.
If your argument is that it should contain comments which explain why this is being done, then I agree.
In which case, I guess your point is that the snippet provided is defective because it lacks this. :)
It depends who you talk to! ;)
Somehow this 1 line of code is in fact 50 lines, because it requires explanatory article :-) Readable > Pretty cool.
I personally use it all the time now that I've been using typescript. This makes perfect sense.
I'll start using it for sure, it seems a good way to assert you are dealing with the right type in JS. Thanks for the article.
Boolean({...x,...y}.item) does the same thing, and I prefer it because the intent is more clear at a glance.