Efficient Scientific Notation
ES6, 83 81 bytes

x=&gt;(e=s=&gt;s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y


Probably fails for some edge cases where toString insists on exponential format.

Edit: Saved 2 bytes thanks to @user81655.