tfw u forget how exactly the + operator works in Javascript

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

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"

compare

({ false: "good", true: "bad" }[{
toString () { return "false" },
valueOf () { return true },
}])

for the people who aren’t up on the ECMAScript standard, ToPrimitive, ToString, and ToNumeric are abstract operations defined in the standard, not functions callable from within Javascript code

Follow

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)

· · Web · 1 · 0 · 1

this is, to be clear, binary plus

unary plus just calls ToNumber

as far as i am aware, ToPrimitive does not throw an error for any builtin JavaScript object type

but you can make your own objects which throw errors by defining [Symbol.toPrimitive]() on them

Sign in to participate in the conversation
📟🐱 GlitchCat

A small, community‐oriented Mastodon‐compatible Fediverse (GlitchSoc) instance managed as a joint venture between the cat and KIBI families.