@monorail one fear
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
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)
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
compare
({ false: "good", true: "bad" }[{
toString () { return "false" },
valueOf () { return true },
}])
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"
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
@noelle (strictly speaking javascript operators can throw errors if .valueOf() or .toString() also throw errors or ultimately fail to produce primitives, but that’s not the case for any builtin thing i don’t think. maybe some of the newer ones? i’d have to check)
@noelle “every operator should return a result without throwing an error” is definitely A Choice and they sure made it
@noelle anyway i think the reason why javascript gets a weird reputation isn’t because it lets you do weird typecasting things but because it lets you do weird typecasting things in very very few characters 😝
@noelle which is why personally i don’t like Python (because i find the “everything is an object” approach to be much simpler to reason about than whatever it is Python does) but i understand how for other people, the incredibly ambiguous mess which is JavaScript would be bothersome lol
@noelle i mean i get it but it is indicative of a fundamentally different understanding of []
in JS, [] is just a special kind of object, and all objects are truthy
Python doesn’t take the same “everything is an object™” approach so you wind up with more exceptional cases like that
@noelle what makes this especially scary is that this is equivalent to "[]True"[2]
like, what??
Administrator / Public Relations for GlitchCat. Not actually glitchy, nor a cat. I wrote the rules for this instance.
“Constitutionally incapable of not going hard” — @aescling
“Fedi Cassandra” – @Satsuma
I HAVE EXPERIENCE IN THINGS. YOU CAN JUST @ ME.
I work for a library but I post about Zelda fanfiction.
For the time being, this is mostly a mirror of <https://status.ladys.computer/>. Want to get in touch? E·mail me!