Javascript the Definitive Guide:将对象转换为字符串的步骤混淆

zhe*_*oli 7 javascript tostring

根据Javascript the Definitive Guide第6版中的3.8.3节:

要将对象转换为字符串,JavaScript将执行以下步骤:
•如果对象具有toString()方法,则JavaScript会调用它.如果它返回原始值,JavaScript会将该值转换为字符串(如果它不是字符串)并返回该转换的结果.请注意,表3-2中的原始到字符串转换都已明确定义.

•如果对象没有toString()方法,或者该方法没有返回原始值,则JavaScript会查找valueOf()方法.如果方法存在,JavaScript会调用它.如果返回值是基元,则JavaScript会将该值转换为字符串(如果尚未存在)并返回转换后的值.

•否则,JavaScript不能获得,无论是从原始值toString()valueOf(),所以它抛出一个TypeError.

例如:

var obj = {
    toString: function() {
        console.log('toStirng...');
        return 90;
    },
    valueOf: function() {
        console.log('valueOf...');
        return 80;
    }
}

console.log(obj + '');
Run Code Online (Sandbox Code Playgroud)

因此,上面的代码片段会obj因为而转换为字符串obj + '',所以它应该打印:

toString...
90
Run Code Online (Sandbox Code Playgroud)

但实际上,它打印:

valueOf...
80
Run Code Online (Sandbox Code Playgroud)

那有什么不对?不obj + ''转换obj为字符串?

小智 6

作为插图精美,文章:

这是因为+''使用ToPrimitive(Number)内部方法.如果运行String(obj),您将收到toString方法结果.