JavaScript call()函数问题:非字符串this转字符串及toString触发原理
问题解答
等价写法勘误
你提到的等价写法是不成立的:
({ toString: function toString() { return 'abcdef'; }}).toUpperCase()
以上代码直接运行会抛出Uncaught TypeError: (...).toUpperCase is not a function错误,原因是普通对象的原型链上不存在toUpperCase方法。你示例中的效果是通过call方法,显式将String.prototype.toUpperCase的执行上下文this绑定到目标对象上才实现的,二者不能等价。
核心原理说明
String.prototype.toUpperCase是专门处理字符串的原型方法,执行时会遵循ECMAScript规范要求的固定流程:
- 第一步首先将内部
this指向的值强制转换为字符串原始值 - 当待转换的值为对象类型时,JS引擎会按照对象转原始值的规则,优先调用该对象的
toString方法,将返回值作为转换结果
你传入的自定义对象重写了toString方法返回'abcdef',因此转换得到的原始字符串就是'abcdef',后续toUpperCase对该字符串执行全大写处理,最终得到'ABCDEF'的结果。
内容的提问来源于stack exchange,提问作者Danko
相关产品推荐
相关产品推荐

