= (Equals Sign) is ASCII code point 61 (0x3D), Unicode U+003D, and a printable punctuation character. It asserts that two things are the same — a claim of balance, with whatever sits on the left weighing exactly as much as whatever sits on the right. Programming immediately split this character's identity in two. Most languages use a single = for assignment (x = 5 stores a value) and == for comparison (x == 5 tests a condition), a distinction that trips up every beginner and occasionally every expert. C's decision to make assignment an expression means if (x = 5) is legal code — it assigns 5 to x, then evaluates as truthy — when the programmer almost certainly meant if (x == 5). JavaScript complicates matters further with ===, the strict equality operator that skips type coercion, which exists precisely because == behaves in ways that surprise even experienced developers ("0" == false is true, "0" === false is not). In URLs, = binds parameter names to values in query strings (?page=2&sort=date), and in Base64 encoding it appears as padding at the end of encoded strings — purely structural, carrying no data. Robert Recorde introduced the equals sign in 1557, choosing two parallel lines because "no two things can be more equal." It took over a century before the notation caught on widely. UTF-8 encodes it as a single byte 0x3D. Unicode classifies it as Sm (Symbol, Math) with the name EQUALS SIGN. The fullwidth % (U+FF05) appears in CJK contexts, and the easily confused identical-to symbol ≡ (U+2261) carries a stronger mathematical meaning — logical equivalence or congruence — that = does not imply.
int x = 10; // assignment with '='int is_ten = (x == 10); // comparison uses '=='if (is_ten) x = x + 1; // reassign value
= is assignment (x = 5). == is equality comparison. === is strict equality (no type coercion) in JavaScript and PHP. In Python, there's only = and == (no ===). In SQL, = is both assignment and comparison depending on context. This overloading is one of the most common sources of bugs.
== performs type coercion: '' == false is true, 0 == '0' is true, null == undefined is true. These implicit conversions create unintuitive behavior. === compares both value and type without coercion, which is almost always what you want. ESLint's eqeqeq rule enforces ===.
The = assigns values to attributes (class="main", id="header"). HTML5 allows unquoted attribute values if they contain no spaces or special characters, but quoting with double or single quotes is standard practice. Missing = between attribute and value silently creates a boolean attribute.
=> defines arrow functions: (x) => x * 2. They're shorter than function(x) { return x * 2 } and don't bind their own 'this' (they inherit it from the surrounding scope). This subtle 'this' behavior makes them ideal for callbacks but unsuitable for object methods.