this post was submitted on 17 May 2025
502 points (97.9% liked)

Programmer Humor

23522 readers
2204 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 2 years ago
MODERATORS
top 50 comments
sorted by: hot top controversial new old
[–] smlckz@programming.dev 1 points 3 hours ago* (last edited 2 hours ago) (1 children)

Option C. The value NaN compares unequal to every value, even itself. This breaks one of the rules of what equality even means (that every value must be equal to itself, the "reflexivity" axiom). It is for this reason (among others, ~~equality~~ "partial" equivalence between values of different types? 🤮) Rust needed to have PartialEq. See IEEE 754 for more details.

Why typeof null is "object"? Because it is defined so: https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-typeof-operator

5. If val is null, return "object".

As for the rationale behind the choice, it might have something to do with "Prototypal inherience" the language has. https://tc39.es/ecma262/multipage/overview.html#sec-objects

Every object created by a constructor has an implicit reference (called the object's prototype) to the value of its constructor's "prototype" property. Furthermore, a prototype may have a non-null implicit reference to its prototype, and so on; this is called the prototype chain.

We can understand this to mean that prototype chains are null terminated ;)

For example:

> Object.getPrototypeOf({}) === Object.prototype
true
> Object.getPrototypeOf(Object.getPrototypeOf({}))
null
> Object.getPrototypeOf(null)        TypeError: not an object

Uhh...

Now, let's go to some abstract algebra. All good (closed) binary operations we deal with have an identity or neutral value. For example: addition has 0, multiplication has 1, boolean and has true, boolean or or xor has false. Performing these operations with the neutral value does not change the other operand: for example, x + 0 == x, a * 1 == a, true && b == b and so on. If you admit min and max as operators, you can see why ∞ and -∞ are the neutral values, respectively: min(∞, x) == x and max(-∞, y) == y for every (real) value of x and y. Observe how Array.prototype.reduce works (with its second argument) for inspiration on why and how all this matters: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

For mathematicians: closed, because the operators are maps S × S →S, to exclude <, > etc. as they map to Bool. Oh, they are relations, bla bla .... real numbers, we don't want to deal with other total orders here, there should be some way to call orders that have both top and bottom values, complex numbers don't have orders (usual ones, are there unusual ones?), bla bla bla

As for the last one, sigh.. https://tc39.es/ecma262/multipage/abstract-operations.html#sec-islooselyequal

Oh, that !s in there aren't boolean not.. they are.. (looks it up) argh, read it yourself https://tc39.es/ecma262/multipage/notational-conventions.html#sec-returnifabrupt-shorthands

[–] smlckz@c.im 1 points 2 hours ago

Me, wasting my time explaining an ECMAScript meme.. I be like, I need to somehow justify the time spent learning about all of these.. it was the language I started my programming journey with.. sigh

[–] jaark@infosec.pub 83 points 1 week ago (6 children)

I'm no expert and I know that javascript is full of wtf moments, but please.. Let it be B

It's not gong to be B, it's it.

[–] ImplyingImplications@lemmy.ca 97 points 1 week ago (2 children)

It is true. Math.min() returns positive Infinity when called with no arguments and Math.max() returns Negative Infinity when called with no arguments. Positive Infinity > Negative Infinity.

Math.min() works something like this

def min(numbers):
  r = Infinity
  for n in numbers:
    if n < r:
      r = n
  return r

I'm guessing there's a reason they wanted min() to be able to be called without any arguments but I'm sure it isn't a good one.

[–] bss03@infosec.pub 35 points 1 week ago (1 children)

So, the language isn't compiled (or wasn't originally) so they couldn't make min() be an error that only a developer saw, it has to be something that the runtime on the end-user system dealt with. So, it had to be assigned some value. Under those restrictions, it is the most mathematically sound value. It makes miniumum-exactly-2(x, min(<...>)) be exactly the same as min(x, <...>), even when the "<...>" has no values.

As a developer, I see a lot of value in static analysis, including refusing to generate output for sufficiently erroneous results of static analysis, so I don't like using JS, and the language that I tinker with will definitely have a separate compilation step and reject the equivalent of min(). But, if I HAD to assign something like that a value, it probably would be a representation of infinity, if we had one (probably will due to IEEE floats).

HTH

[–] hades@lemm.ee 9 points 1 week ago (6 children)

The language not being compiled has nothing to do with error handling. You could have a min function that operates on dynamic arrays (e.g. std::min_element in C++ or min() in Python).

load more comments (6 replies)
load more comments (1 replies)
[–] CameronDev@programming.dev 38 points 1 week ago* (last edited 1 week ago) (2 children)
Math.min() == Infinity
Math.max() == -Infinity

Wtf is going on JS...

edit: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min

Its the min value of the input params, or Infinity.

[–] wise_pancake@lemmy.ca 13 points 1 week ago* (last edited 1 week ago) (2 children)

Math.min.length is 2, which weakly signals that it's designed to handle at least two parameters

Why would they even define this value?

Note: I’m not a js dev, do most functions have length?

[–] CameronDev@programming.dev 14 points 1 week ago (2 children)

I am also not a JS dev, we possibly aren't brain damaged enough to understand the perfection.

[–] peoplebeproblems@midwest.social 9 points 1 week ago (1 children)

I develop with JS? All I can say is I need more brain damage to understand where is out

[–] sp3ctr4l@lemmy.dbzer0.com 7 points 1 week ago

Just keep developing with it, you'll get CTE soon.

[–] Venator@lemmy.nz 7 points 1 week ago (5 children)

Most people don't use JS because they think it's perfect... they use it because it's the language that works on web browsers... or because thier coworkers made something in it... or because the library that does what they want uses it...

load more comments (5 replies)
load more comments (1 replies)
load more comments (1 replies)
[–] moomoomoo309@programming.dev 30 points 1 week ago* (last edited 1 week ago) (1 children)

It's C, NaN is never equal to itself in floating point, that's not just a JS thing.

[–] entropicdrift@lemmy.sdf.org 11 points 1 week ago (1 children)
[–] 0x0@lemmy.dbzer0.com 21 points 1 week ago

No, it's JS

Narrator: "It wasn't B."

[–] KindaABigDyl@programming.dev 11 points 1 week ago (2 children)

Fun fact, even tho B is False, Math.min > Math.max is true

[–] CameronDev@programming.dev 20 points 1 week ago

That is not a fun fact. How do I unsubscribe :D

[–] lunarul@lemmy.world 6 points 1 week ago

But B is true

[–] sp3ctr4l@lemmy.dbzer0.com 10 points 1 week ago* (last edited 1 week ago) (7 children)

I also am not familiar with javascript anymore....precisely because of this, exact, insane bullshit.

B... and/or C... evaluating as FALSE are the only things that... should even kind of make sense, according to my brain.

Though at this point in my life, I have unironically had a good number of concussions and contusions, so ... well you'd think that would help with JS development.

Javascript is insanity, and I am still convinced it is at least 40% responsible for Notch losing his goddamned mind.

'null' is somehow an object. because fuck you, thats why!

Is... 0 == '' ... is that two single quotes ' ' ?

Or one double quote " ?

If... it is one double quote... that wouldn't even evaluate, as it would just be an empty string without a defined end...

But if it was two single quotes... that would just be a proper empty string... and because of forced type coercion, both 0 and '' are FALSE when compared with ==, but not when compared with ===, because that ignores forced type coercion...

https://www.w3docs.com/snippets/javascript/when-to-use-double-or-single-quotes-in-javascript.html

Oh my fucking god WHY?!

Just fucking use one special character to delimit strings!

Don't have two that don't work together and also behave differently even when you pick just one of them... GraaaghhH!

brb, figuring out where Larry Ellison lives...

load more comments (7 replies)
[–] jenesaisquoi@feddit.org 72 points 1 week ago (5 children)
[–] JCpac@lemmy.today 115 points 1 week ago (2 children)

No, it's Javascript, keep up

[–] ChickenLadyLovesLife@lemmy.world 9 points 1 week ago (4 children)

Javascript is basically just C with some syntactical sugar, right? RIGHT?!?

[–] kryptonianCodeMonkey@lemmy.world 7 points 1 week ago* (last edited 1 week ago)
load more comments (3 replies)
[–] MajesticElevator@lemmy.zip 11 points 1 week ago (1 children)
[–] pupbiru@aussie.zone 19 points 1 week ago* (last edited 1 week ago) (1 children)

Math.min isn’t the minimum integer; it’s the minimum of a list (and max visa versa)… the min/max of an undefined list is the same… IDK what it is, but this probably the most reasonable of the “WTFs” they could have put there i think… other languages would throw an exception or not compile (which JS definitely SHOULD do instead of this, buuuuut lots of JS has aversions to errors)

*edit: okay the curiosity was killing me: Math.min() is Infinity and Math.max() is -Infinity

load more comments (1 replies)
load more comments (3 replies)
[–] sorter_plainview@lemmy.today 63 points 1 week ago (1 children)
[–] skisnow@lemmy.ca 24 points 1 week ago (1 children)

That one wasn't the one I had issues with, since the concept is essentially the same across all languages. We say it's false because we can't conclusively say that it's true. Same as the reason why null != null in SQL.

[–] victorz@lemmy.world 5 points 1 week ago

It also makes a lot of conditional expressions less complicated because comparisons of all kind against NaN return false.

[–] mmddmm@lemm.ee 31 points 1 week ago (3 children)

The one option that is mandated by an ISO standard.

Besides, if max and min are going to have a value without any parameter, it has to be exactly those Javascript uses. Unless you have a type that define other bounds for your numbers. And null always have a pointer type (that is object in Javascript), for the same reason that NaN always have a number type.

The only one that is bad on that list is D.

[–] FooBarrington@lemmy.world 14 points 1 week ago (1 children)

typeof null === "object" was actually a bug in the early implementations, and they decided to keep it in the spec: https://2ality.com/2013/10/typeof-null.html

(see the comment from Brendan Eich)

[–] gnutrino@programming.dev 19 points 1 week ago* (last edited 1 week ago) (2 children)

Tony Hoare: "Introducing NULL was a billion-dollar mistake"

Brendan Eich: "Hold my undefined"

[–] FooBarrington@lemmy.world 22 points 1 week ago

We had one null, yes. But what about second null?

[–] owsei@programming.dev 8 points 1 week ago (1 children)

Maybe D is too single quotes 0 == ''

load more comments (1 replies)
[–] StopSpazzing@lemmy.world 5 points 1 week ago

D...Deez nutz!

[–] entropicdrift@lemmy.sdf.org 24 points 1 week ago (1 children)
[–] powermaker450@discuss.tchncs.de 16 points 1 week ago (2 children)
[–] Valmond@lemmy.world 8 points 1 week ago (8 children)

I'd say C too because that's the only one that would be True in a normal programming language and this is javascript so...

load more comments (8 replies)
load more comments (1 replies)
[–] bastion@feddit.nl 15 points 1 week ago (1 children)

I love the two lonely downvotes on this.

[–] Littux@lemmy.world 5 points 1 week ago (1 children)

Merging the upvotes and downvotes is the best option

[–] bastion@feddit.nl 8 points 1 week ago

nah, it's more fun this way.

[–] andioop@programming.dev 7 points 1 week ago

If you thought this was fun you might like https://jsisweird.com/ with similar questions

[–] LovableSidekick@lemmy.world 5 points 1 week ago
load more comments
view more: next ›