1

在我的一种方法中,我曾经检查数据源中的值,其容差值如下

var xTolerance=3.14

    for(var i=0;i<x.length;i++){
    if(Math.abs(x[i])>xTolerance){
    //code
    }
    }

其中 x 包含来自数据源的值。有时我从数据源获取日期(Tue Apr 1 00:00:00 PST 1930),因此在检查容差值之前,我已使用Date.parse将该日期转换为毫秒。数据源包含 1000 个点,因此执行时间会因为使用 Date.parse 方法而增加,所以我用容差检查了值(Tue Apr 1 00:00:00 PST 1930)而不转换为毫秒。它工作正常,我的问题是以下代码是否相同

x[i]=Tue Apr 1 00:00:00 PST 1930           x[i]=Tue Apr 1 00:00:00 PST 1930
                                    <=>      x[i]=Date.parse(x[i]);
if(Math.abs(x[i])>xTolerance){               if(Math.abs(x[i])>xTolerance){
}                                            }

在简单的

x[i]=Tue Apr 1 00:00:00 PST 1930... 我只是在问是否

Math.abs(x[i])== Math.abs(Date.parse(x[i]))

是真的 ???

提前致谢

4

2 回答 2

0

不,它们不一样。

Math.abs('Tue Apr 1 00:00:00 PST 1930')值为NaN。将其与使用任何运算符的任何数字进行比较false,除了运算符!=!==哪个给出true

于 2013-11-13T01:35:37.553 回答
0

我将比较Math.abs(x)and Math.abs(Date.parse(x)),假设x是一个Date对象:

数学.abs(x)

根据http://ecma262-5.com/ELS5_Section_15.htm#Section_15.8.2

15.8.2 数学对象的函数属性

以下每个 Math 对象函数都将ToNumber抽象运算符应用于其每个参数(如果有多个参数,则按从左到右的顺序),然​​后对生成的 Number 值执行计算。

根据http://ecma262-5.com/ELS5_Section_9.htm#Section_9.3,如果参数是对象,则ToNumber应用以下步骤:

  1. 设 primValue 为ToPrimitive(输入参数,提示编号)。
  2. 返回到数字(primValue)。

根据http://ecma262-5.com/ELS5_Section_15.htm#Section_15.9.6

(如果你想要完整的算法,请阅读http://ecma262-5.com/ELS5_Section_9.htm#Section_9.1http://ecma262-5.com/ELS5_Section_8.htm#Section_8.12.8 )

Date 实例从 Date 原型对象继承属性,并且它们的 [[Class]] 内部属性值为“Date”。Date 实例也有一个 [[PrimitiveValue]] 内部属性。

[[PrimitiveValue]] 内部属性是此 Date 对象表示的时间值

然后,Math.abs(x),其中x是一个Date对象,与 相同Math.abs(y),其中yy 是一个数字,其中包含由 表示的时间值x

数学.abs(日期。解析(x))

根据http://ecma262-5.com/ELS5_Section_15.htm#Section_15.9.4.2

15.9.4.2 日期解析(字符串)

parse 函数将ToString运算符应用于其参数,并将生成的 String 解释为日期和时间;它返回一个数字,对应于日期和时间的 UTC 时间值。根据字符串的内容,字符串可能被解释为本地时间、UTC 时间或其他时区的时间。

根据http://ecma262-5.com/ELS5_Section_15.htm#ELS5_Section_15.9.5.2

15.9.5.2 Date.prototype.toString()

此函数返回一个字符串值。String 的内容取决于实现,但旨在以方便、人类可读的形式表示当前时区中的日期。

笔记

对于任何毫秒数为零的Date 值 d , Date.parse(d.toString())的结果等于 d.valueOf()。见 15.9.4.2。

根据http://ecma262-5.com/ELS5_Section_15.htm#Section_15.9.5.8

15.9.5.8 Date.prototype.valueOf()

valueOf 函数返回一个数字,也就是这个时间值

然后,Math.abs(Date.parse(x)),其中x是一个Date对象,与 相同Math.abs(y),其中yy 是一个包含 的时间值的数字x

结论

如果毫秒数为零,您可以确定它们是相等的。

如果不是,结果可能取决于实现,但我猜在大多数实现中结果是相同的。

补充说明

请注意,它Date.parse需要一个字符串,因此您不需要使用Date.parse(x)ifx已经是一个Date对象。

当您对规范有疑问时,您可以前往

于 2013-11-13T02:50:59.223 回答