繁体   English   中英

Date.parse和Math.abs是否相等

[英]Is Date.parse and Math.abs are equal

在我的一种方法中,我曾经使用如下所示的公差值来检查数据源中的值

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] = PUT 1930 Apr 1 00:00:00Tue ...我只是问是否

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

是真的 ???

提前致谢

不,他们不一样。

Math.abs('Tue Apr 1 00:00:00 PST 1930')值为NaN 使用任何运算符将其与任何数字进行比较都会得出false ,但运算符!=!==会得出true

我将比较Math.abs(x)Math.abs(Date.parse(x)) ,假设xDate对象:

Math.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. 返回ToNumber(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”。 日期实例还具有[[PrimitiveValue]]内部属性。

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

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

Math.abs(Date.parse(X))

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

15.9.4.2 Date.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。

注意

对于毫秒数为零的任何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函数返回一个Number,它是该时间值

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

结论

如果毫秒数为零,则可以确保它们相等。

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

补充笔记

请注意, Date.parse需要一个字符串,因此,如果x已经是Date对象,则不需要使用Date.parse(x)

如果对规格有疑问,可以转到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM