[英]Coercion in JavaScript - Abstract Methods
我最近开始学习更多关于 Js 中的强制转换的知识,并且我一直在阅读 ECMAScript 文档以了解更多关于它以及 Js 中如何处理不同情况的信息。 在做的时候我遇到了以下语句
10-{"a":10,valueOf(){return 8;}}
>2
这是我的浏览器控制台中的 output 的问题,你能帮我解码结果是如何一步一步地得出的吗?我确实尝试了相同问题的更简单版本,其中仅包含 {"a":10} 部分
10-{"a":10}
>NaN
了解如何获得 Nan 结果,但没有得到结果为 2 的第一个问题 此外,还有一件事 function valueOf() 将返回 8 但这将在对象的大括号内是不是就像 {"a ":10,8},还是发生了其他事情? 所以帮助我理解为什么是结果 2?
10-{"a":10,valueOf(){return 8;}}
做10
减去 object,其中 object 有一个名为a
的属性,其值为10
(无关紧要;未使用)和valueOf
返回8
的方法(非常相关:-))。
减法运算符要求其操作数是数字。 当它的操作数之一不是数字时,它使用抽象的ToNumber操作将其转换为数字。 对于 object (如您的示例), ToNumber 使用ToPrimitive表示其首选类型是“数字”。 对于普通的 object (例如您的),最终会执行OrdinaryToPrimitive 。 OrdinaryToPrimitive 查看 object 是否有某些方法可用于从 object 获取原语。 当首选类型是“数字”时,OrdinaryToPrimitive 尝试的第一个方法是valueOf
。 因此调用 object 的方法,返回8
,并执行10-8
(导致2
)。
这是写得更清楚的代码,没有任何隐式类型转换:
const obj = { // Left `a` off because it's never used for anything valueOf() { return 8; } }; const numberForObj = obj.valueOf(); console.log(`numberForObj = ${numberForObj}`); const result = 10 - numberForObj; console.log(`result = ${result}`);
a:10
部分无关紧要,可以省略。
强制转换为数字时,提供valueOf
的对象可以使用此 function 的返回值:
var p = { valueOf() { return 8; } } console.log( +p )
因此,表达式可以简化为
console.log( 10-{valueOf(){return 8;}} )
了解发生了什么的第一步是了解valueOf
做了什么。 你可以把它想象成类似于toString
。 当需要将 object 转换为字符串形式时使用toString
:
const identity = { firstName: "Martha", lastName: "Stewart", toString() { return this.firstName + " " + this.lastName; } }; console.log("Name: " + identity);
valueOf
是类似的,除了它在 object 需要转换为数字时使用:
const budget = { bank: 3, wallet: 5, valueOf() { return this.bank + this.wallet; } }; console.log(10 + budget);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.