2017-03-02 91 views
1

我知道了一個月,因爲索引零一個月,對於日期當處於日期對象零索引

Thu Mar 02 2017 

我必須寫

new Date(2017, 2, 2); 

同樣的,如果我使用一個變量

var thismonth = 2; new Date(2017, thismonth, 2); 

但是,如果我說

var thisday = [2017, 2, 2]; new Date(thisday); 

我得到一個結果的一個索引一個月

Thu Feb 02 2017 

這意味着,我可以使用數組瓦爾像日期瓦爾在現實生活中

var thisday = [2017, 3, 2]; new Date(thisday); 

,並得到(聯合國)預期結果

Thu Mar 02 2017 

這很好,但令人困惑!爲什麼會這樣?有規則嗎?

回答

0

我不認爲代碼做什麼,你認爲它。 Date構造函數不接受數組。引用spec

讓v是? ToPrimitive(值)。

如果Type(v)爲字符串,然後

設電視是解析V作爲一個日期,以完全相同的方式作爲用於解析方法(20.3.3.2)的結果。如果解析導致突然完成,則電視是完成記錄。

這意味着你實際上將2017,3,2作爲字符串傳遞。現在該字符串發生了什麼?那麼再次檢查spec

否則,parse會將結果字符串解釋爲日期和時間;它會返回一個數字,即與日期和時間對應的UTC時間值。根據字符串的內容,字符串可能被解釋爲本地時間,UTC時間或某個其他時區的時間。函數首先嚐試根據日期時間字符串格式(20.3.1.16)中規定的規則(包括擴展年份)來解析字符串的格式。

有趣的是,另一個鏈接到spec

您的格式不符合YYYY-MM-DDTHH:mm:ss.sssZ格式或日期僅YYYY-MM-DD這意味着我們又回到了以前的規範部分它說

如果字符串不符合該格式的功能可能回落到任何具體的實施啓發式或實現特定的日期格式。

所以基本上你不應該依賴於它。根據JS引擎/瀏覽器的不同,日期可能不會被解析。它看起來像V8接受不僅冒號/破折號作爲分隔符,也逗號,這就是爲什麼它的工作原理。

編輯:發現

https://github.com/v8/v8/blob/68960eeb763f93dcedb37d5b663b1019192b7f36/src/builtins/builtins-date.cc#L115

這就要求

https://github.com/v8/v8/blob/68960eeb763f93dcedb37d5b663b1019192b7f36/src/dateparser-inl.h#L16

其中有大量的意見和怪異的東西,以保持如果你想搜索。