Javascript 为什么我可以解析无效的日期字符串?

Javascript 为什么我可以解析无效的日期字符串?,javascript,string,date,nan,Javascript,String,Date,Nan,我使用一个函数来检查输入的值是否是应用程序中特定用途的有效文本 有效值是一个字符串,其中无效的日期或数字既不是true也不是false checkText(str) { return isNaN(str) && isNaN(Date.parse(str)) && ['true', 'false'].indexOf(str) == -1; } 它工作正常,但我遇到了一个字符串问题:“New Item 3” Date.parse(“新项目3”)返回一个数字

我使用一个函数来检查输入的值是否是应用程序中特定用途的有效文本

有效值是一个字符串,其中无效的日期或数字既不是true也不是false

checkText(str) {
    return isNaN(str) && isNaN(Date.parse(str)) && ['true', 'false'].indexOf(str) == -1;
} 
它工作正常,但我遇到了一个字符串问题:“New Item 3”

Date.parse(“新项目3”)
返回一个数字,但为什么!!?此外,如果您将3更改为任何小于13的数字,它将返回数字


这里的任何人都可以向我解释发生了什么?

经验教训:
Date.parse
不是日期验证器

即使是MDN:

不建议使用
Date.parse
,因为在ES5之前,字符串的解析完全依赖于实现。在不同的主机解析日期字符串的方式上仍然存在许多差异,因此应该手动解析日期字符串(如果要容纳许多不同的格式,库可以提供帮助)

再往下

ECMAScript规范声明:如果字符串不符合标准格式,函数可能会退回到任何特定于实现的启发式或特定于实现的解析算法。ISO格式字符串中不可识别的字符串或包含非法元素值的日期将导致Date.parse()返回NaN

但是,日期字符串中未被ECMA-262定义为简化ISO格式的无效值可能会或可能不会导致NaN,具体取决于浏览器和提供的值


事实上,这里的问题来自于,如果您检查:

Date.parse("New Item 3");
它将返回:

983401200000

console.log(Date.parse(“新项目3”)
无论前面有多少个字符串,它都将返回一个数字。例如,
Date.parse(“newitem Blah Foo 3”)
Date.parse(“n3”)
也将被正确解析。我猜字符串中的最后一个数字被解释为一个月,这就是当它大于12时返回
NaN
的原因。我在最新版本的Brave、Chrome和Chrome(它们都使用V8)上测试了它。非标准日期字符串的处理依赖于平台。也许无论您在什么环境中尝试过这一点,都会发现这是一个非无效字符串,并使用一些奇怪的规则对其进行解析。例如,它在Firefox中不起作用。
Date.parse(“新项目3”)
在FF70中返回
NaN
<代码>NaN的类型是“数字”。有趣的是,在Firefox和IE11中
Date.parse(“新项目3”)
返回
NaN
,在Chrome/Chrome中它从MDN返回
98340200000
:“在ES5之前,不建议使用Date.parse,因为字符串解析完全依赖于实现。在不同主机解析日期字符串的方式上仍然存在许多差异,因此应该手动解析日期字符串(如果要容纳许多不同的格式,库可以提供帮助)。“经验教训:
date.parse
不是日期验证程序。“事实上,它是一个日期分析器。此外,它更像是
让MyCurrentEnvironment尝试使用一些额外的非标准和合法规则来解析此字符串,这些规则可能不会很好地记录在文档中。尽管我猜这个名称可能有点太长,即使是描述性的。