不论是否附加了Chrome调试器,日期构造器的工作方式都不同

时间:2019-07-14 17:04:35

标签: javascript react-native google-chrome-devtools

我在这里遇到一个非常奇怪的问题。 JS根据是否安装了调试器,对new Date("6-1-2013")的评估方式有所不同。我正在Expo上运行React Native应用。

这些是从我的代码中运行以下代码的结果:

console.log('new Date("6-1-2013"),', new Date("6-1-2013"));

使用调试器:

new Date("6-1-2013"), 2013-06-01T04:00:00.000Z

没有调试器:

new Date("6-1-2013"), Date { NaN }

更新:无论是否带有调试器,都将“ 2013年6月1日”传递给构造函数。因此,目前我的特定问题已解决。

我仍然想知道为什么会这样发生。

1 个答案:

答案 0 :(得分:2)

这是由不同的JavaScript环境引起的。查看文档here

  

JavaScript运行时

     

使用React Native时,您将运行JavaScript   两种环境中编写代码:

     
      
  • 在大多数情况下,React Native将使用JavaScriptCore(为Safari提供支持的JavaScript引擎)。请注意,在iOS上,JavaScriptCore   由于不存在可写的可执行内存,因此不使用JIT   iOS应用。
  •   
  • 使用Chrome调试时,所有JavaScript代码都在Chrome本身中运行,并通过WebSockets与本机代码进行通信。铬   使用V8作为其JavaScript引擎。
  •   
     

虽然两种环境都非常相似,但是您最终可能会遇到一些   不一致之处。我们可能会尝试其他   未来的JavaScript引擎,因此最好避免依赖   任何运行时的细节。

问题在于日期构造函数确实很挑剔,因此您在创建日期时需要小心。

一个流行的解决方法是使用moment.js。 Moment.js将为您处理后台的所有日期转换,并且将在所有平台,JavaScript引擎等上运行。

使用以下命令安装moment.js:

npm --install moment 

然后您可以替换:

 new Date("6-1-2013")

具有:

import Moment from 'moment';

//second parameter is the specified format of your date string  

const date = Moment("6-1-2013", "M-D-YYYY");