2013-12-19 68 views
0

加運算符('+')似乎在javascript中具有多個Date類型對象的函數。下面輸入給出+ T不同的輸出:+ JavaScript中日期的運算符

var t = new Date(); 
console.log('the date is '+t); 
console.log(+t); 

更加混亂對我來說,它並沒有轉化爲millseconds這裏:

console.log(t+5); 

,尤其是:

console.log(5+t); 

由於:

console.log(+t+5); 

我是s呃,它把五個字符當作字符串,而+ t + 5和t + 5之間的'+ t'在語義上是不同的。

是否有一個參考,我可以找到運營商對Date對象有什麼影響?通過這種方式,我可以確信,每個瀏覽器中+的行爲重複性都是相同的。

快速小提琴:http://jsfiddle.net/yqQv7/

回答

1

一元'+'運算符(+ x)​​只是將表達式轉換爲數字的一種方式。所有其他組合都是隱式數字或字符串轉換。日期的'+'運算符沒有特殊的重載。

的最接近關於JavaScript運營商的工作究竟是ECMAScript標準的完整參考:

http://www.ecma-international.org/publications/standards/Ecma-262.htm

對於不太複雜的概述,你可能想看看Mozilla的參考:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference#Operators

4

+new Date()是一樣的Number(new Date())。它只是使用類型轉換轉換爲數字。

+0

不,在這種情況下,它不會將字符串轉換爲數字。 – raina77ow

+0

@ raina77ow對,糾正:) – David

1

這裏是在standard關於+(加法運算符)的重要通知:

沒有暗示在調用提供給ToPrimitive [時類型強制轉換的對象。除Date對象之外的所有本機ECMAScript對象都會處理缺少提示,就像給出提示數字一樣; 日期對象處理沒有提示,就像提供了提示字符串一樣。

這就是當您嘗試評估new Date() + 5表達式時發生的情況。左邊的操作數應該變成字符串,而不是數字 - 調用toString,而不是valueOf

相反,這...

+new Date() + 5

...(通過調用valueOf方法,它在返回日期的情況下,可在幾毫秒的價值),明確規定了左操作數的類型爲數字。這是之前評估二元加操作,因爲一元加優先級更高。


一點題外話,操作數的+操作的順序,JS也無所謂:t + 55 + t是等價的。如果t是一個字符串(或強制轉換爲字符串),則+將被視爲連接運算符,而不是加法運算符。

+0

有趣。但爲什麼不把(5 + t)當作日期的提示來強制類型化爲數字? – Spork

+0

因爲否則'+'操作會變得不可交換 - 並且在處理弱類型時被認爲是更大的邪惡。 – raina77ow

+0

所以我猜5 +(+ t)!謝謝..它現在確實有道理。我將堅持Number()而不是一元+。 – Spork