Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript对象文字求值和valueOf_Javascript - Fatal编程技术网

JavaScript对象文字求值和valueOf

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将数字隐式强制为字符串

以下代码段如何计算为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将数字隐式强制为字符串

类似地,在您的示例中,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,但它不是函数,因此不使用,结果还是NaN

valueOf必须是函数。某些运算符可以调用valueOf,如/。