2014-12-04 143 views
4

所以我注意到的+运营商

(new Date()) 

结果为Date对象;在这种情况下

Date {Thu Dec 04 2014 22:43:07 GMT+0200 (SAST)} 

,但如果我键入

+(new Date()) 

我得到一个int值;

1417725787989 

这是如何完成的?

我有一个叫做“时间”函数,这样使用时:

new Duration(352510921) 

返回一个实例看起来像这样:

{ days:5, hours:3, mins:55, secs:10, ms:921 }  

那么,如何可以使用+运算符来获得Duration实例的int值?

var dur = new Duration(352510921); 
console.log(+dur) // prints int value 352510921 
+2

你可以使用'valueOf'。 – 2014-12-04 20:51:37

+0

http://stackoverflow.com/questions/221539/what-does-the-plus-sign-do-in-return-new-date – j08691 2014-12-04 20:53:58

+0

@RobG其操作数 – danronmoon 2014-12-04 20:55:09

回答

5

一元+操作注塑实例的Number以同样的方式在调用​​功能将投下变量为Number

如果您想重写您的具体情况是怎么投,你需要重写该实例的valueOf属性:

var a = { 
    valueOf: function() { 
     return 5; 
    } 
}; 
console.log(a); //Object { valueOf: function() {...} } 
console.log(+a); //5 

ES5 standard

11.4.6一元+运算符#

一元+运算符将其操作数转换为数字类型。

生产UnaryExpression:

  1. 让EXPR是评估UnaryExpression的结果:+ UnaryExpression如下评价。
  2. 退货ToNumberGetValue(expr))。然后

ToNumber上的对象将导致与提示数量ToPrimitive。然后ToPrimitive将调用其中规定的[[DefaultValue]]内部方法:

如果O的[[默认值]]内部方法调用与提示数量,采取以下步骤:

  1. 设的valueOf是使用参数“valueOf”调用对象O的[[Get]]内部方法的结果。
  2. 如果IsCallable(的valueOf)为真,那么,
    1. 设VAL是调用的结果[[调用]的valueOf的内部的方法,与O为这个值和一个空的参数列表。
    2. 如果val是原始值,则返回val。
  3. 让toString是使用参数“toString”调用对象O的[[Get]]内部方法的结果。
  4. 如果IsCallable(的toString)为真,那么,
    1. 让STR是调用toString的[[调用]]内部方法,其中O为这个值和空参数列表的结果。
    2. 如果str是原始值,则返回str。
  5. 抛出TypeError异常。
+0

非常感谢,这意味着我可以添加'toString'函数属性到我的'持续时间'的定义,并通过使用: '''+新的持续时间(352510921);' 我可以打印出来 '5天, 3小时55分10秒921毫秒# 感谢您的解释! – 2014-12-04 21:20:22

3

您可以覆盖valueOf

> var foo = { days:5, hours:3, mins:55, secs:10, ms:921, valueOf: function() { return 1; } } 
undefined 
> -foo 
-1