为何Number对象重写的toString()在console.log与alert中不自动调用?
为什么重写Number的toString()后,"" + x不触发自定义方法?
你是不是也碰到过这种疑惑?明明重写了Number.prototype.toString(),但用"" + x或者alert()这类操作做隐式字符串转换时,自定义的toString方法压根没被调用,反而直接输出了数值本身?就像你做的这个测试:
Number.prototype.toString = function () { return "Hello!"; }; x = new Number(42); console.log("" + x); // 输出 42 而不是 Hello! console.log("" + x.toString()); // 输出 Hello!
这其实是JavaScript处理包装对象隐式转换的特殊逻辑在搞鬼:
- 当你用
"" + x这种隐式转换方式时,JS会优先调用对象的valueOf()方法,而不是直接走toString()。对于new Number()创建的包装对象来说,valueOf()会返回它对应的原始数值(这里就是42),之后再把这个原始值转成字符串,自然就不会触发你重写的toString()了。 - 但当你显式调用
x.toString()时,就会直接执行你重写的方法,所以能得到预期的"Hello!"。
顺带提一句,不止Number包装对象,Boolean和String的包装对象也有类似逻辑——隐式转换时优先通过valueOf()获取原始值,再进行后续的类型转换。
内容的提问来源于stack exchange,提问作者JenyaKh
相关产品推荐
相关产品推荐

