it just calls ToPrimitive on both sides and then :—
• if the result on either side is a string, calls ToString on both sides and concatenates them
• otherwise, it calls ToNumeric on both sides and attempts to add them
anyway + fails if :—
1. ToPrimitive throws an error, for example because it does not produce a primitive
2. one of the resulting primitive values is a string, and ToString throws an error, because the primitive value cannot be converted to a string (symbols are the only primitive value which can’t be converted to strings by ToString atm)
3. neither primitive value is a string, and ToNumeric throws an error, for example because it does not produce a numeric value
4. The numeric values produced by calling ToNumeric on both sides are different types (presently the available types are numbers and bigints)
it’s definitely a ⁜little⁜ funky because it calls ToString on ⁜the resulting primitive⁜ not on the original value so
"that is " + {
toString () { return "false" },
valueOf () { return true },
}
returns "that is true"