use*_*390 11 javascript tostring
是否有任何表达式,其中一个对象的toString方法被隐式调用覆盖其valueOf方法?
在下面的示例中,valueOf始终是隐式调用的(重写toString).
"4" + {
toString: function () {
return "4";
},
valueOf: function () {
return 6;
}
}; // => "46", was expecting "44"
4 + {
toString: function () {
return "6";
},
valueOf: function () {
return 4;
}
}; // => 8
4 + {
toString: function () {
return 6;
},
valueOf: function() {
return "4";
}
}; // => "44"
Run Code Online (Sandbox Code Playgroud)
即:
我们可以写一个表达式,其中toString被隐式调用valueOf(即没有显式调用toString)?
是否有任何表达式,其中一个对象的toString方法被隐式调用覆盖其valueOf方法?
是的,每当抽象,它发生的ToString操作应用对象的不同,使用DefaultValue方法同.toString()前.valueOf().
但是,在您的示例中,您只使用了加法运算符,这类似于标准行为的异常.由于它不仅连接字符串,而且还对数字求和,因此valueOf在检查它们是否为字符串之前,它总是在两个操作数上使用.见注1:
在步骤5和6中对ToPrimitive的调用中没有提供提示.除Date对象之外的所有本机ECMAScript对象都处理没有提示,就像提供了提示号一样; 日期对象处理缺少提示,就像提供了提示字符串一样.主机对象可以以某种其他方式处理缺少提示.
那么哪些操作隐式使用ToString而不是提示ToPrimitive?这里有一些例子:
in操作,支架符号,Object.getOwnPropertyDescriptor,Object.defineProperty,hasOwnProperty,...parseInt,parseFloat,encodeURI[Component],decodeURI[Component],[un]escape,Array::join,String::[last]indexOf,RegExp::execFunction构造Array::sort算法的默认功能比较String时的构造函数和String方法thisRegExp构造Error构造alert,XMlHTTPRequest::open,querySelector,...Date 对象上的 + 运算符使用 toString 而不是 valueOf。此外,如果 valueOf 返回非原始值,则接下来调用 toString 方法。(JavaScript - 权威指南,第 3.14 节)使用您的示例:
var result = "4" + {
toString: function () {
return "4";
},
valueOf: function () {
return this; // returning an object, not a primitive
}
};
Run Code Online (Sandbox Code Playgroud)
现在结果是 44。
| 归档时间: |
|
| 查看次数: |
1346 次 |
| 最近记录: |