JavaScript对象文字求值和valueOf
以下代码段如何计算为0.25?我不明白对象文字是如何工作的JavaScript对象文字求值和valueOf,javascript,Javascript,以下代码段如何计算为0.25?我不明白对象文字是如何工作的 ({valueOf: function() { return 1}} / 4) 以下所有其他评估均为NaN: ({prop1: function() { return 1}} / 4) ({valueOf: 1} / 4) ({valueOf: "1"} / 4) 还有一些特殊的属性名为“valueOf”? 如果你打电话 21 + "21" // "2121" Javascript通过调用toString将数字隐式强制为字符串
({valueOf: function() { return 1}} / 4)
以下所有其他评估均为NaN:
({prop1: function() { return 1}} / 4)
({valueOf: 1} / 4)
({valueOf: "1"} / 4)
还有一些特殊的属性名为“valueOf”?
如果你打电话
21 + "21" // "2121"
Javascript通过调用toString将数字隐式强制为字符串
类似地,在您的示例中,javascript通过调用隐式地将您的对象强制为一个数字。valueOf是一个特例方法,当需要从对象到标量的隐式类型转换时,会调用它。所以这是一个特殊的名字。它类似于toString,每当需要从对象到字符串的隐式类型转换时,就会调用它。请参见使用like/时,其左右两侧的表达式将使用转换为数字
因为您有对象,所以ToNumber使用调用内部方法的
使用提示调用O的[[DefaultValue]]内部方法时
编号时,将采取以下步骤:
让valueOf作为调用对象O的[[Get]]内部方法(参数为valueOf)的结果。
如果valueOf为真,
让val作为调用valueOf的[[Call]]内部方法的结果,其中O作为this值和一个空参数列表。
2.如果val是原语值,则返回val。
让toString是使用参数toString调用对象O的[[Get]]内部方法的结果。
如果toString是真的,
让str作为调用toString的[[Call]]内部方法的结果,O作为this值和一个空参数列表。
如果str是原语值,则返回str。
抛出TypeError异常。
在第一个示例中,valueOf是可调用的,并返回1
但是,在其他的例子中,没有valueOf,或者它是不可调用的。因此JS调用从Object.prototype继承的toString,后者返回[Object Object]。该字符串无法转换为数字,因此NaN。在以下情况下:
({valueOf: function() { return 1}} / 4)
({prop1: function() { return 1}} / 4)
divide操作符将第一个参数转换为一个数字,javascript调用valueOf来实现这一点
在下列情况下:
({valueOf: function() { return 1}} / 4)
({prop1: function() { return 1}} / 4)
Javascript不知道如何将第一个参数转换为数字,也找不到valueOf函数来告诉它,因此结果不是数字NaN
在下列情况下:
({valueOf: 1} / 4)
({valueOf: "1"} / 4)
尽管第一个参数确实有valueOf member,但它不是函数,因此不使用,结果还是NaNvalueOf必须是函数。某些运算符可以调用valueOf,如/。