Giter VIP home page Giter VIP logo

js-equality-game's Introduction

JavaScript Equality Table Game

…or why you should prefer the === operator.


Build Status

Screenshot

Screenshot

About ==

The == or loose equality operator (and its counterpart !=) in JavaScript tries to save the user from having to explicitly convert (cast) values to a common type to make comparisons, so, for example, "5" == 5 implicitly converts (coerces) the string "5" to a number, so the comparison 'just works'. Without loose equality, the same comparison would need to be expressed as either Number("5") == 5 or "5" == String(5), or, at the shortest, +"5" == 5 to be true.

The general principle behind having implicit type conversion is called weak typing, and it's useful to the degree that it makes code more terse, but the flip side is that the implicit conversion rules are basically guesswork about what the user would expect, and, as such, can guess wrong and lead to unexpected results.

== doesn't check for truthiness or falsiness

Values that convert to either true or false are called truthy or falsy; for example, 0 is falsy because !!0 or Boolean(0) result in false. Other examples of falsy values are empty strings, null and undefined. Meanwhile, all objects (except document.all) are truthy, so !![] (array object converted to boolean) results in true.

One would reasonably expect that being truthy also implies == true and falsy implies == false, but that's not the case: [] is truthy, but [] == true is actually false.

== breaks transitivity

Transitivity means that if A equals B and B equals C, then A should equal C, but this is not always true with ==; for example, '' == 0, and 0 == '0', but '' != '0'.

=== isn't a panacea for typing issues

Tripple equals or strict equality checking rules are much simpler than ==; objects are compared by identity and primitives by value (roughly speaking), but it's still possible to create subtle type-related error conditions by forgetting to convert the compared values to the same type. For example, the user might compare "1" === 2, intending to compare numbers, and the resulting false would suggest that the comparison is working correctly, even though "2" === 2 would fail.

A language like TypeScript would catch these issues, because static typing follows the fail-fast design principle, while dynamic typing ultimately follows garbage in, garbage out – the responsibility is on the user to make sure that the comparison is sound.

Trivia

Brendan Eich was asked to add the loose equality checking rules by a coworker in Netscape and considers it a mistake.[citation needed]

Motivation

The initial reason to make this game was to try out state management with immer-wieder, but it's also to demonstrate that the == rules are easy to get wrong even if you feel like you're familiar with them. It's in response to claims like this one by the well-known author getify:

However, implicit coercion is a mechanism that can be learned, and moreover should be learned by anyone wishing to take JavaScript programming seriously. Not only is it not confusing once you learn the rules, it can actually make your programs better! The effort is well worth it.

If the implicit coercion rules were as non-confusing as claimed by getify, most experienced JavaScript users would be able to get close to perfect scores in this game, but there are many reports about giving it a serious attempt and being surprised by the poor results, including from seasoned users.

Emojis

The game uses emojis; your system and browser should preferably support color fonts and have an emoji font like EmojiOne or Noto Color Emoji installed for the emojis to display properly. If not, the game will provide fallback SVG images from emojitwo (using emoji-extractor).

Build

npm i
npm run build # or: npm run start

Adding a translation

The translation string template is translations/en-US.json, and new translations need to be registered in translationData.js.

Tools used

License

MIT

Author

slikts <[email protected]>

Other web-related games

js-equality-game's People

Contributors

artemveremienko avatar dependabot-preview[bot] avatar dependabot[bot] avatar exiam avatar fractalo avatar imba-tjd avatar nahueljose avatar shuunen avatar slikts avatar stenno avatar szycha76 avatar teb3716 avatar thependulum avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

js-equality-game's Issues

Visual logic is reversed

If you don't read the text fully, from the visuals only you get the impression to flag all false fields, not all true ones.

The strictly equal fields are marked with a checkmark (good) which should be the opposite of a mine (bad).
So when those are no mines, surely all true fields are no mines, right? And thus you have to mark all other fields (the false ones) with a flag, because there is a mine under them.

The visuals for the results were also very confusing to me, and I think there should be a legend.

Not clear how to play

The usual minesweeper UX is to right-click for a flag and left-click to "open" the square. That's what I tried to do initially. It was very confusing that clicking on any square would just put a flag and I had to figure out that I had to click "Show Results" in order to make anything happen. The minesweeper game has no "Show Results" button.

You could either put one sentence of instructions on how the game is supposed to be played, or make it like minesweeper. But even then - you should still put instructions because some people might have not played the original game.

It's a clever project, though! πŸ™Œ

Translations

Hi there πŸ˜„

Thanks for your projet, really cool to explains dangers of double equals to people that never use triple,

Would be great to translate it, I can contribute to add French translations πŸ‘

[] == 0, [[]] == 0

Not sure if this is specific to Chrome, or just a general deviance from what's been stated in the spec, or just something the game got wrong, but:

image

Yet,

image

(p.s., yeah, I kinda cheated on a few ;-)

p.p.s., You may also consider showing some other horrible truths, like,

image

Shuffle the table for unique replays

As the title says, I believe it might be a good idea to shuffle the table headers - as a result, it could be a real test as opposed for optimizing for visual memory.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.