我在Node.js和Chrome控制台上尝试了以下脚本:
console.log(new Date([1988,11,5]))
console.log(new Date(1988,11,5))
我期待这两种方法能够给出相同的结果,但它们的表现不同:
Sat Nov 05 1988 00:00:00 GMT+0100 (W. Europe Standard Time)
Mon Dec 05 1988 00:00:00 GMT+0100 (W. Europe Standard Time)
特别是,指定月份的第二个字段在第一种情况下从零开始计数。
我希望这两个月的月份从零开始,或者我误解了什么?
答案 0 :(得分:2)
第一行不是有效的Date构造函数;它不接受数组元素作为参数。我认为它假设它是一个字符串值,并且被解释为yyyy,mm (1 based),dd
。
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
这些等同于错误的初始化:
console.log(new Date([1988,11,5]))
console.log(new Date([1988,11,5].toString()))
console.log(new Date("1988,11,5"))
答案 1 :(得分:1)
第二个调用new Date(1988, 11, 5)
与Date
构造函数的规范所需的specific format匹配:
新日期(年,月[,日期[,小时[,分钟[,秒[,ms]]]]])
第一次通话将传递到other form of the constructor,因为您正在传递一个阵列:
新日期(价值)
查看此处的步骤,它将在数组上调用内部实现细节ToPrimitive
。在通过ToPrimitive
和[[Default Value]]
的定义进行规范之后,我们看到在第一个实例中传递给value
的{{1}}参数是数组的字符串表示,即{ {1}}。
回到spec for new Date (value)
,我们看到如果类型是String,它现在是,它将被移交给用于Date.Parse
的相同代码,其中说:
该函数首先尝试根据日期时间字符串格式(15.9.1.15)中调出的规则解析字符串的格式。 如果字符串不符合该格式,则该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。无法识别字符串或包含格式为String的非法元素值的日期将导致日期。解析返回NaN。
(强调我的)。
因此,V8,Chrome和Node.js的实现者' JavaScript引擎已选择使用基于1的月份来识别和解析该字符串。但是因为它不在规范中,它可能会改变,并且在不同的实现/浏览器中可能会有所不同,所以不要依赖它。