为什么date.valueOf()== date会导致false?

时间:2018-10-31 03:23:28

标签: javascript

Date

Object

为什么date.valueOf() == date会导致false,而a = {}; a.valueOf() = () => 3; a.valueOf() == a会导致true

3 个答案:

答案 0 :(得分:1)

执行number == object时,Abstract Equality Comparison spec algorithm使用称为ToPrimitive的操作将对象转换为原语,然后将该原语转换为数字。对于大多数情况,这意味着valueOf()是首选。专门针对日期,定义了ES6中的Symbol.toPrimitive新方法,该方法将覆盖默认的ToPrimitive以返回字符串。您最终将比较d.valueOf() == d.toString()而不是d.valueOf() == d.valueOf()

请勿使用==

  

在没有提示的情况下调用ToPrimitive时,通常它的行为就像提示是Number。但是,对象可以通过定义@@ toPrimitive方法来替代此行为。在本规范中定义的对象中,只有日期对象(请参见20.3.4.45)和符号对象(请参见19.4.3.4)会覆盖默认的ToPrimitive行为。 日期对象不将提示视为字符串。

const d = new Date();
console.log(d.valueOf() == d);
delete Date.prototype[Symbol.toPrimitive];
console.log(d.valueOf() == d);

In ES5

  

如果在不带提示的情况下调用O的[[DefaultValue]]内部方法,则其行为就像提示是Number一样,除非O是Date对象(请参见15.9.6),在这种情况下,它是行为就像提示是字符串一样。

答案 1 :(得分:0)

AFAIK,日期的valueOf将以字符串格式返回UTC。因此,当您将字符串UTC与datetime对象进行比较时。当然,即使使用。也将返回false。

var d= new Date();

var result = d.valueOf() == d;
console.log(d.valueOf())
alert(result);

在这里拨弄:http://jsfiddle.net/keysl183/nhj34wde/2/

第二个条件对我来说是错误的。

==将仅尝试明确转换比较器和比较器,但在这种情况下,JS将无法准确地完成它。另一方面,即使严格===。对于这两种情况,这也都将引发错误。

答案 2 :(得分:0)

如果检查d.toString()和“ d”的输出,则会发现其相同的输出。这意味着当您键入“ d”时,它将在内部调用d.toString()

但是根据javascript对象的属性,它应该调用valueOf()。我认为这是一个例外情况。

d.valuOf()返回毫秒,即数字。

因此d.valueOf() == d为假,因为d.valueOf()返回Millisecods,而d返回toString()值,它是当前日期的字符串值。