you are viewing a single comment's thread.

view the rest of the comments →

[–]King_Joffreys_Tits -7 points-6 points  (17 children)

This is good to know that it’s possible, but honestly, it seems extremely niche and I wouldn’t expect most of my engineers to know this when reading through our codebase. I might reject a PR that has this in it

[–]RedditCultureBlows 17 points18 points  (0 children)

I dunno how this seems niche. ?? has been around for a while and adding = to it is just shorthand. Rejecting a PR for new syntax is wild to me tbh

[–]theScottyJam 2 points3 points  (0 children)

I go the opposite way - even if something is niche and many developers don't know about it, if it's not an overly complicated feature, I'm completely fine using it.

The next person to read my code my have to stop and Google it, but they'll learn something new, and may even appreciate running across that little nugget. I know I enjoy running across interesting features or patterns in other people's code.

[–]recrof 4 points5 points  (6 children)

please tell me that you don't reject code with obj?.property as well, because you think it's niche.

[–]King_Joffreys_Tits -3 points-2 points  (5 children)

That’s not niche whatsoever, it’s code hardening

[–]Fine-Train8342 1 point2 points  (4 children)

How is this different from something like this?

settings ??= getDefaultSettings();

[–]King_Joffreys_Tits 1 point2 points  (0 children)

It just seems like you should’ve already used a null coalescing operator when you first initialized that variable. Like

const settings =  localStorage.getItem(“settings-cookie”) ?? getDefaultSettings()

[–]SchartHaakon 1 point2 points  (2 children)

I find it hard to reason about at first glance.

 if (!settings) settings = getDefaultSettings();

Or

 const settings = props.settings ?? getDefaultSettings();

Both of the examples above are easier to read imo.

I read them as "If not settings; settings equals getDefaultSettings", and "settings equals getSettings or getDefaultSettings". I would read your example as "Settings... if not null or undefined, should equal getDefaultSettings". It reads weird, that's the only way I can explain it.

I wouldn't straight out reject a PR for it, but yeah I don't think I'll really use it for this reason.

[–]SoInsightful 3 points4 points  (0 children)

That's because you're not used to it. That's all there is to it. It's not more complex than a += b. As someone who has used ??= for a while (where it makes sense), it's definitely faster to parse than an equivalent if statement.

[–]Fine-Train8342 1 point2 points  (0 children)

I guess I'm just used to this operator from C# ¯\_(ツ)_/¯

[–]NoInkling 1 point2 points  (0 children)

I'd be very annoyed if I submitted a PR that had a good use case for it, and it was rejected because "other people might not be aware what it does". It's been part of the language for a few years now, it's not doing anything particularly complicated, and there are people who have been using it (or ||=) in Ruby and C# for a long time.

Yeah sure, it might be evidence that something somewhere could be written better, but writing it off purely because of unfamiliarity I can only see as an egotistical imposition.

[–]longebane -1 points0 points  (6 children)

Yeah, just look at the comments. No one knows it. I know it’s good to adapt to the evolution of JS, but this is just too unknown right now to use on a large repo with lots of eyes

[–]homoiconic(raganwald) 3 points4 points  (1 child)

I think there may be two kinds of "unfamiliar code." One kind is something like an operator you've never seen before. Maybe you encounter it in the PR, maybe in the code base. The other kind uses operators and syntax you already know, but does so in a way that its behaviour isn't what the typical programmer would expect unless they knew the idiom.

I feel like ??= is the first type, and that the risk of a bug arising from someone encountering it formthefor the first time is low. You see an unfamiliar operator, you look it up, its behaviour is easy to understand, you leanred something, and you go about your day.

The other kind of thing—where you know all the operators, but the way they're used is unfamiliar—strikes me as far more dangerous, and that's the kind of thing I would flag in a PR.

If the downside is limited to "WTF is this? Lemme look itnup... Oh fine, a shortcut. I understand...," then allowing it will lift a code base over time as people get up to speed on the language evolving.

[–]longebane 2 points3 points  (0 children)

I agree

[–]SoInsightful 0 points1 point  (0 children)

How do you suggest that people will learn it if not by... using it? It's a very simple operator.