Realistically, if you decide you are going to design a language where types are always coerced to perform operations instead of stopping execution when mismatched types are encountered, the choices JavaScript makes are pretty sensible.