如果使用参数数组调用date更改结果

我尝试了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) 

特别是,指定月份的第二个字段在第一种情况下从零开始计数。

我希望在这两种情况下,从零开始的月份,还是我误解了一些东西?

第二个调用new Date(1988, 11, 5)匹配Date构造函数的规范所要求的特定格式 :

新date(年,月[,date[,小时[,分钟[,秒[,毫秒]]]]])

第一次调用将传递给构造函数的另一种forms ,就像传入一个数组一样:

新date(值)

看看这里的步骤,它将调用数组中的内部实现细节ToPrimitive 。 在通过ToPrimitive[[Default Value]]的定义进行规范之后,我们看到在第一个实例中传递给new Datevalue参数是数组的string表示forms,即1988,11,5

回到new Date (value)的规格 ,我们看到,如果types是一个string,它现在是,它将被交给用于Date.Parse相同的代码,它说:

函数首先尝试根据date时间string格式(15.9.1.15)中调出的规则来parsingstring的格式。 如果string不符合该格式,该函数可能会回退到任何特定于实现的启发式或实现特定的date格式。 无法识别string或date包含格式string中的非法元素值应导致Date.parse返回NaN。

(强调我的)。

因此,V8,Chrome和Node.js的JavaScript引擎的实现者已经select使用基于1的月份来识别和parsing该string。 但是因为它不在规范中,它可能会改变,在不同的实现/浏览器中可能会有所不同,所以不要依赖它。

第一行不是有效的Date构造函数; 它不接受数组元素作为参数。 我认为它假定它是一个string值,并被解释为yyyy,mm (1 based),dd

参考: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

这些相当于一个错误的init:

 console.log(new Date([1988,11,5])) console.log(new Date([1988,11,5].toString())) console.log(new Date("1988,11,5")) 

演示: https : //jsfiddle.net/IrvinDominin/Lweww6et/