如果使用参数数组调用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 Date
的value
参数是数组的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/