•
== runs the abstract-equality coercion steps; === compares type and value directly
•
null == undefined is true and null == 0 is not; the pair is equal only to each other
•
Object.is distinguishes +0 from -0 and reports NaN as equal to itself
•
==, ===, SameValue and SameValueZero, and which built-in reaches for which
•
+ concatenates if either operand becomes a string; every other arithmetic operator coerces to number
•
Symbol.toPrimitive first, then valueOf/toString in an order set by the hint
•
exactly false, 0, -0, 0n, "", null, undefined, NaN; "0" and [] are truthy
•
&& and || evaluate to one of their operands, not to a boolean
•
?? falls through only on null or undefined, so 0 and "" survive
•
&&=, ||= and ??= short-circuit the assignment itself, skipping the setter
•
?. abandons the rest of the chain and yields undefined rather than throwing
•
** groups right to left and rejects an unparenthesized unary minus on its left
•
a ?? b || c will not parse; the grammar demands parentheses
•
operands are truncated to int32, so >>> and >> disagree on negatives and | 0 floors
•
< and > coerce each operand to a primitive and then a number, so 3 > 2 > 1 evaluates true > 1 and is false
•
the comma operator evaluates every expression left to right and yields the LAST one, which is why (1, 2, 3) is 3