以下代码段的评估结果如何为0.25?我不明白对象文字是如何工作的。
({valueOf: function() { return 1}} / 4)
以下所有其他评估为NaN:
({prop1: function() { return 1}} / 4)
({valueOf: 1} / 4)
({valueOf: "1"} / 4)
还有一些特殊的属性名为'valueOf'吗?
答案 0 :(得分:1)
如果你打电话
21 + "21" // "2121"
Javascript通过在其上调用toString()
来隐式地将数字强制转换为字符串。
同样,在您的示例中,javascript通过调用valueOf()
隐式地将您的对象强制转换为数字。
答案 1 :(得分:1)
当您使用/
之类的multiplicative operator时,左侧和右侧的表达式将使用ToNumber转换为数字。
由于你有对象,ToNumber使用ToPrimitive,它调用[[DefaultValue]]内部方法。
当使用提示调用 O 的[[DefaultValue]]内部方法时 数字,采取以下步骤:
- 让 valueOf 成为使用参数
"valueOf"
调用对象 O 的[[Get]]内部方法的结果。- 如果IsCallable( valueOf )是 true 那么,
- 让 val 成为调用 valueOf 的[[Call]]内部方法的结果,其中 O 为此值,空参数列表。 2.如果 val 是原始值,则返回 val 。
- 让 toString 成为使用参数
"toString"
调用对象 O 的[[Get]]内部方法的结果。- 如果IsCallable( toString )为真,那么,
- 让 str 成为调用 toString 的[[Call]]内部方法的结果, O 作为此值并且空参数列表。
- 如果 str 是原始值,请返回 str 。
- 抛出 TypeError 例外。
醇>
在您的第一个示例中,valueOf
可以调用并返回1
。
但在其他方面没有valueOf
或者它不可调用。所以JS调用toString
(继承自Object.prototype
),返回"[object Object]"
。该字符串无法转换为数字,因此NaN
。
答案 2 :(得分:0)
valueOf
是一种特殊情况方法,当需要从对象到标量的隐式类型转换时,它会被调用。所以这是一个特殊的名字。它类似于toString(),只要您需要从对象到字符串的隐式类型转换,就会调用它。见valueOf on MDN
答案 3 :(得分:0)
以下情况:
({valueOf: function() { return 1}} / 4)
除法运算符将第一个参数转换为数字,javascript调用valueOf来执行此操作。
以下情况:
({prop1: function() { return 1}} / 4)
Javascript不知道如何将你的第一个参数转换为数字(并且它找不到valueOf函数来告诉它),因此结果不是数字(NaN)。
在以下情况下:
({valueOf: 1} / 4)
({valueOf: "1"} / 4)
虽然第一个参数确实有一个valueOf成员,但它不是一个函数,因此它没有被使用,结果再次是NaN