No, JavaScript Isn’t Broken (Again)
I’ll admit it — sometimes I like publishing a post on the weekend, when both the internet and real l...
For further actions, you may consider blocking this person and/or reporting abuse
Awesome! Your WTF JS format is really refreshing. And yes, I wondered (a long time ago) why
NaN === NaNreturns false. You explain it, and I think to myself: "Yes, that's it!" as if there were no other possible explanation, as if it were obvious (for me, it wasn't).Thanks! 😄 And yes - it’s actually not a big secret at all, once you see it explained. It just feels mysterious until that “click” moment happens.
If you enjoy this kind of JS WTFs, I can highly recommend You Don’t Know JS Yet — it’s available for free on GitHub and makes for perfect long winter-evening reading!
I just checked out You Don’t Know JS Yet — it does look interesting, but it doesn’t have that storytelling touch that makes your content stand out. And honestly, JavaScript isn’t enough of a passion for me to dive into something that heavy. I’d much rather follow your series; it’s much more refreshing!
Haha, thanks Pascal 😄 that’s a huge compliment!
You’re totally right - You Don’t Know JS Yet is more of a deep-dive reference than a storytelling ride, and it’s definitely not for everyone.
Maybe I should team up with Kyle and do a light editorial pass: same knowledge, more emojis, fewer mental breakdowns 😂
That's why I'm always drawn to your posts… and those of @aaron_rose_0787cc8b4775a0. Yours are truly refreshing, and his read like a captivating novel. With the two of you, I'm not really reading "technical articles"—I'm reading engaging articles.
Most of the time, I only delve into an article when it truly captivates me… the rest I skim. Yours always do.
What a lovely thing to say, Pascal. I’m just glad to be here contributing to Sylwia’s excellent post. She sets a high bar for all of us! I always look forward to seeing your name in posts and comments. Cheers! 🙏✨❤
Awwww @pascal_cescato_692b7a8a20 @aaron_rose_0787cc8b4775a0 you are too nice!!! 🥹🥰💖
It takes nothing from this post but I think You Don't Know JS is actually fairly entertaining and a considerably "light read" for something that technical
You're right, and that's Sylwia's DNA… her writer's DNA, at least 🙃
Totally agree with you 👍
Loved this explanation, Sylwia! 😄 NaN !== NaN always felt like one of those “JavaScript is broken” moments, but your breakdown makes it click—seeing NaN as “unknown” really clears things up. I also didn’t realize Object.is() could treat NaN as equal—super useful tip for numeric-heavy code! 👏
Fun and educational, and another reason to use either TypeScript or strict eslint recommendations.
Exactly! 😄
I honestly can’t even remember the last time I wrote something in pure JS… okay, I can - but I choose to repress that memory 😅
I remember a project using very strict and opinionated eslint rules, probably based on airbnb recommendations, but still EcmaScript, not TypeScript. That included a long list of idioms to avoid, like using the plus sign to concatenate strings (for the risk of mixing it with numbers) and even using
i++was discouraged for allegedly facilitating off-by-one errors.Oh yes 😄 I remember those Airbnb recommendations very well… and how many juniors cried over them 😅
What does Typescript bring to floating-point arithmetics?
Great point bringing up IEEE-754. It’s easy to dunk on JavaScript for these quirks, but when you see the same behavior in Rust or C++, it shifts the conversation from 'weird language behavior' to 'foundational computer science.' It’s a reminder that as much as we abstract things away with high-level code, we’re still ultimately operating within the constraints of how silicon handles math.
Exactly! 😄 That’s precisely the point.
Once you see the same behavior in Rust or C++, it stops being “JavaScript being weird” and starts being “this is how floating-point math works, period.”
And honestly… I don’t know why JavaScript ended up as the main scapegoat here either 😂 It just happens to expose these rules more openly than some other languages.
This is funny, but it makes sense in a technical standpoint.
The way I think "NaN" in my view is "There are many different categories that falls under NaN, in where NaN is not a universal things". Like your example where an emoji is NaN and a string "123" is a NaN.
Sure, both are NaN, but it is about what causes the NaN for
NaN !== NaNto be true since they are different. Great job!Exactly - that’s a really good way to think about it 😄
Different “reasons” for NaN, same result, but not something you can meaningfully compare. Thanks a lot! 🙌
I like your Rust example, where the same variable is unequal to the same variable. LMAO
Exactly! 😄 It’s not a JS-only thing at all. NaN is just… consistently weird in many languages 😂
This was a really fun read — the “unknown result” framing makes NaN finally click instead of just feeling like a weird JS prank.
I especially liked how you tied it back to IEEE-754 and showed it’s not a JavaScript-only thing. That context alone clears up so many “JS is broken” takes.
The JS WTF weekend format works great too — light, nerdy, and still genuinely educational. Looking forward to the next one.
Thank you so much! 😄 I’m really glad the “unknown result” framing helped it click — that’s exactly the moment I was hoping for.
And yes, the IEEE-754 context is such a quiet plot twist here — once you see it’s not just JavaScript, a lot of those “JS is broken” takes suddenly fall apart 😅
Happy to hear the JS WTF weekend format works for you — more nerdy WTFs coming soon! 🚀
This was a really good read Sylwia. The “NaN as unknown, not a value” framing is one of those explanations that makes everything suddenly feel obvious in hindsight. It turns something that feels like a JS prank into a really clean mental model.
I also really liked learning about IEEE-754 and other languages, it quietly reframes this from “JavaScript weirdness” into “floating-point reality,” which is way more useful for how people actually think about bugs.
For future JS WTFs, are there any other “looks broken but is actually logical” behaviors you’re especially excited to cover?
Thank you so much! 😄 I’m really glad that mental model landed - that “oh, of course” moment is the best kind of JS WTF outcome.
As for what’s next: I’m definitely thinking about some “weird” array and object behaviors 👀
And honestly… JavaScript itself is an endless source of inspiration for this series 😂
Nice! I knew that JS do this, but i didn't know why. I thought that it has to do something with value representation (object reference comparing etc...). Now i know that it's directly from IEEE 754. thanks
Exactly — that’s a very common intuition 😊
Glad the IEEE-754 connection cleared it up. Thanks for reading! 🙌
This was a really enjoyable read — clear, light, and surprisingly satisfying 😄
The “NaN means unknown, not a value” framing makes everything click. I especially liked the point about languages choosing honesty over convenience. Great example of a JS “WTF” that actually makes sense once you zoom out.
Thank you! 😄 I’m really happy that framing resonated with you — “unknown, not a value” is one of those ideas that suddenly makes everything fall into place.
And yes, that trade-off between honesty and convenience is such a great example of how many so-called JS “WTFs” actually make a lot of sense once you zoom out a bit. Glad you enjoyed it! 🚀
"unknown result" === "unknown result" should be "false" because "unknown result" itself is "unknown". So "unknown" === "unknown" is "false"
Haha, exactly 😄
That’s the whole idea - if the result is truly “unknown,” even comparing it to itself can’t be trusted.
To summarize: all JS-WTF's make perfect sense 😉
To be complete: 15 years ago (time flies when you're having fun) I asked on stackoverflow why
typeof NaNreturnsNumber. Got some excellent answers over there.Aaach, what a beautiful piece of archaeology! 😄
Time really does fly - thanks for sharing that!
Makes perfect sense... I always had the this thought, like "this must have some logical explanation...".
Thanks for the article
Exactly 😄 - there is a logical explanation hiding underneath.
Thanks a lot for reading! 🙌
Nice! I love that you make your articles so personal with the emoji and ease to read :). C++ is the hard language to learn but it gets easier afterward. I love C++ and Python.
Thank you! 😊 I’m really happy you like the personal tone and emojis - that means a lot to me.
And yes, C++ is definitely a tough one 😅 but once it “clicks,” a lot of things in other languages start to make much more sense. Great combo with Python too!
Lol! it is so true :). Thank you!
I just love all the little niche wtf cases you make into ah, yes, that is indeed the fuck. Great article as always!
Thanks, Amanda! 😄
And yeah… JavaScript is way too generous when it comes to WTF material, so there will definitely be more of this coming 😂
So it's 'like' the strict assignment? See what I did there 😂
😂 I see it - strict everything, except equality apparently!
You could also add SQL to the list of languages: NULL <> NULL.
Interesting insights!
Waah! interesting way to explain the JS deep point.
Informative 👏