javascript - 什么时候方法 valueOf 可能不存在?
问题描述
我有这个代码。而且我不明白它是如何工作的。
let obj = {
valueOf: function () {
return {};
},
toString: function () {
return 222;
}
};
console.log(Number(obj)); //222
根据这个来源,转换算法是:
obj[Symbol.toPrimitive](hint)
如果方法存在则调用,- 否则,如果提示是“字符串”,则尝试
obj.toString()
和obj.valueOf()
,无论是否存在。- 否则,如果提示是“数字”或“默认”尝试
obj.valueOf()
和obj.toString()
,无论存在。
提示是这里的数字。那为什么obj.toString()
叫呢?没有obj.valueOf()
吗?为什么?什么样的对象有这个方法?我找不到任何有用的信息。
这是另一个例子:
var room = {
number: 777,
valueOf: function() { return this.number; },
toString: function() { return 255; }
};
console.log( +room ); // 777
为什么obj.valueOf()
在这种情况下调用?为什么这里存在这种方法,而在第一个示例中却没有?它是如何工作的?
解决方案
从您引用的文章中:
返回类型
…<br /> 唯一的强制性要求:这些方法必须返回一个原语,而不是一个对象。
历史注释
由于历史原因,如果toString
或valueOf
返回一个对象,则没有错误,但该值被忽略(就像该方法不存在时一样)。
在您的第一个片段中,两种方法都存在并被尝试:首先obj.valueOf()
,但由于它返回一个空对象而不是原始值,obj.toString()
因此也被调用。
在您的第二个代码段中,obj.valueOf()
已经返回 number 777
,这将成为结果。
推荐阅读
- python-3.x - 记住上次展示作业的3个学生
- github - 使用“关闭”关键字关闭来自另一个 PR 的拉取请求
- java - 春季 JPA。仅调用 @ManyToMany 而不是整个对象
- c++ - cpp中引用绑定和类型转换的区别
- gitlab-ci - 无法使用 Gitlab CI 运行 Cypress 测试
- javascript - JavaScript find(),传递{}和不带{}有什么区别?
- python - 根据子字符串打印条件索引值
- java - 将图像放在 JLabel 上
- android - 房间数据库:当我更新列表时,它工作得很好!但是当我重新打开应用程序时,它会显示旧数据
- python - 如何使用 sympy 代数求解两侧方程