按数字和字符串设置新的Date()会得到不同的结果

时间:2014-11-19 23:13:40

标签: javascript

我正在学习JavaScript,我发现了JavaScript的奇怪(?)行为。

我按

创建日期对象
var stack = new Date(1404187200000) // 07-01-2014
var overflow = new Date('07-01-2014')

当我比较那两个日期对象时

stack == overflow // returns false
stack.getTime() == overflow.getTime() // returns true

我相信它是因为它们不是同一个对象。但我知道' =='比较平等和' ==='是身份的比较 - 就像这个例子:

var stack = 1;
var overflow = '1';
stack == overflow // returns true
stack === overflow // returns false

那么,为什么比较新日期([NUMBER])新日期([STRING])会给出不同的结果,即使它们是相同的日期?< / p>

请赐教!

3 个答案:

答案 0 :(得分:1)

new Date返回一个对象。每次创建它都会创建一个不同的对象,因此它们并不相同。 getTime从对象返回一个值(属性) - 对于两个对象都是相同的。

答案 1 :(得分:1)

这有点复杂。 =====尝试转换为常见类型时检查类型。这就是为什么1 == '1'为真但1 === '1'为假的原因,因为在第一种情况下&#39; 1&#39;变换为数字(AFAIR)。

你可以在这里看到确切的说明如何处理:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 - 在这种情况下你的有趣部分是1. f。

  

如果x和y引用同一个对象,则返回true。否则,返回false。

答案 2 :(得分:1)

您误解了=====之间的区别。不是那个人进行了等式检查,而是进行了检查。

对于===,两个操作数必须具有相同的类型。但是对于==,在检查相等性之前允许输入强制类型。

在您的情况下,两个对象属于同一类型,因此=====之间没有区别;但他们正在检查参考平等,而不是价值。检查与日期的值相等的正确方法就像您正在做的那样:检查stack.getTime() == overflow.getTime()

您也可以执行+stack == +overflow,这将首先投射它们,然后您将获得值相等测试。