2014-12-04 188 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