Javascript 如果使用参数数组调用,则日期会更改结果

Javascript 如果使用参数数组调用,则日期会更改结果,javascript,node.js,Javascript,Node.js,我在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) 特别

我在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)
特别是,第二个字段指定月份,在第一种情况下从零开始计数


在这两种情况下,我都希望月份从零开始,或者我误解了什么吗?

第一行不是有效的日期构造函数;它不接受数组元素作为参数。我认为它假设它是一个字符串值,并被解释为
yyyy,mm(基于1),dd

参考:

这相当于一个错误的初始化:

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

演示:

第二次调用,
新日期(1988年11月5日)
,与
日期
构造函数的规范要求相匹配:

新日期(年、月[、日期[、小时[、分钟[、秒[、毫秒]]])

当您在单个数组中传递时,第一个调用将传递给:

新日期(值)

看看这里的步骤,它将在阵列上调用一个内部实现细节,
ToPrimitive
。按照规范,通过and的定义,我们看到在第一个实例中传递给
new Date
value
参数是数组的字符串表示形式,即
1988,11,5

返回到,我们看到,如果类型是字符串(现在是),它将被传递到用于的相同代码,该代码表示:

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

(我的重点)


因此,V8、Chrome和Node.js的JavaScript引擎的实现者选择使用1个月的时间来识别和解析该字符串。但是因为它不在规范中,它可能会改变,并且在不同的实现/浏览器中可能会有所不同,所以不要依赖它。

第一个是对
Date
构造函数的非标准调用,JavaScript实现可以自由地以任何方式解释非标准参数。感谢您的回答,所以我决定不使用数组1,尽管我很受诱惑:p