是什么使new Date()/1000成为有效的javascript?

是什么使new Date()/1000成为有效的javascript?,javascript,Javascript,我怎么能把一个物体除以一个数字呢 因为当您使用除法运算符时,new Date()将被正确地转换为一个数字(表示从1970年1月1日开始的该日期的总毫秒数)。+运算符将不起作用,因为字符串中的+表示串联,而不是求和,当您尝试对日期求和时,它不会返回毫秒,但该日期的toString()将起作用,但*将起作用,因为字符串没有*运算符。例如,尝试newdate()*2 有关日期全局对象的更多详细信息,请查看以下内容: 编辑:我说过,当日期在带有/的表达式中时,它将转换为字符串,当然我错了。我已经更正了答

我怎么能把一个物体除以一个数字呢

因为当您使用除法运算符时,
new Date()
将被正确地转换为一个数字(表示从1970年1月1日开始的该日期的总毫秒数)。
+
运算符将不起作用,因为字符串中的
+
表示串联,而不是求和,当您尝试对日期求和时,它不会返回毫秒,但该日期的toString()将起作用,但
*
将起作用,因为字符串没有
*
运算符。例如,尝试
newdate()*2

有关日期全局对象的更多详细信息,请查看以下内容:

编辑:我说过,当日期在带有/的表达式中时,它将转换为字符串,当然我错了。我已经更正了答案。下面有一些评论可以进一步澄清我的答案。字符串到数字的行为仍然有效,即表示有效数字的字符串可以相乘、相除和相减,但不能相加,因为sum运算符用于连接字符串。看一看:

console.log( "10" + "1" );
console.log( "10" - "1" );
console.log( "10" * "2" );
console.log( "10" / "3" );

console.log( 10 + "1" );
console.log( 10 - "1" );
console.log( 10 * "2" );
console.log( 10 / "3" );

console.log( "10" + 1 );
console.log( "10" - 1 );
console.log( "10" * 2 );
console.log( "10" / 3 );

大多数语言实际上在其内部语言中将日期表示为一个数字。Javascript使用的约定是自1970年1月1日起的毫秒数,许多其他语言也有类似的约定。这与您可以简单地从彼此中减去日期的原因相同,就像计时方法的工作方式一样

除法日期前对象将转换为数字,该数字将给出1970年1月1日起的毫秒数

new Date()/1000=>Number(new Date())/1000=一些数字

最新更新
考虑到我的回答中包含一些不完整的信息,有时甚至是完全错误的信息,我认为最好是纠正我的错误。尽管已经很晚了,但这里有:

几乎所有的JS对象都有2个相同的方法:
valueOf()
对于date对象,它映射回返回数字的
getTime()
方法。这个数字是什么,是自1970年1月1日以来的毫秒数,许多编程语言使用这个日期作为日期的基础。它被称为Unix时间戳,这个日期被称为Unix纪元。如果你想知道的话。
另一种方法是
toString
,它返回一个字符串(显然)。
第三种方法是
hasOwnProperty
,它可以在原型链中追溯到
Object.prototype
,但这对于这个问题并不重要

无论何时比较两个值(对象与否),JS都会强制两个操作数的类型,以使两个值可以安全地进行比较(
1='1'
强制字符串
'1'
数字

当一个对象或原语值被连接到一个stirng中,或者当一个表达式被计算为一个单数值时(例如在控制台中,键入
newdate;
,您就会明白我的意思),这种类型强制也适用。
Date
对象的默认行为是强制为字符串,调用
toString
方法

因此,
Date
实例也不例外。它们是对象,这意味着变量的值将是对对象的引用。但是,在表达式/语句中,对对象使用了算术运算符(
/
)。在这种情况下,字符串没有多大意义,因此JS返回到
valueOf
方法(可以通过多种方式将
Date
强制为数字)。这确实会产生一个
数字
,可以轻松地进行分割。

使用比较运算符
对对象执行算术运算时,隐式调用其
valueOf
函数,可以预期(并且确实可以观察到)相同的行为

尝试以下操作以获得一个可以实际分割的对象:

function Foo() {

    this.valueOf = function() {
        return 500;
        };

    }

var bar = new Foo();
console.log(bar/1000); // -> 0.5

这取决于它是什么样的物体!你为什么要这样做?请提供一些例子。为什么?你打算用它做什么?您可以以毫秒为单位获取日期,将其除以,然后从那里开始,可能..
date()/1000
会为我生成
NaN
。@LonelyWebCrawler您缺少
新的
操作。或者说,它们可能很糟糕,但它们有不错的性能documentation@SlaterTyranus,由于没有像样的文档,它们非常糟糕。隐式地将new Date()转换为字符串不会在毫秒内返回总数。它返回
“Fri Aug 17 2012 16:13:14 GMT+0200(W.Europe夏令时)”
否,使用除法运算符时不会对日期对象调用toString(),至少在Chrome中不会。它直接转换成一个数字,就像你做
+newdate()
@Sjoerd:是的,你是对的!我已经更正了我的答案。我尝试这样做是为了查看类型:console.log(typeof+newdate())@Sjoerd:
.valueOf
就是被调用的
Date.prototype.valueOf=function(){return 123}
然后
new Date()/2==123/2
@pimvdb:当然,你是对的。对于OP:正如我所说的,几乎所有对象都有valueOf属性,因为原型已经为您设置了该方法,但是对于字符串和日期,当您使用
+
操作符时,它不是真的。@davidbuzatto:
bar+1000
1500
bar+“1000”
5001000
。这不合理吗?我试着说字符串和日期中的
+
是content,而不是add。按照您所说的方式,似乎对每个对象都会对任何运算符进行算术计算,但对于字符串和日期,当我们使用
+
运算符时,这是不正确的。我希望我现在更清楚了;)@戴维布扎托:是的,我现在明白你的意思了:)
Date.prototype.valueOf = Date.prototype.getTime; //<-- this isn't how its done, but think of the valueOf method as doing something similar

if (d1.getTime() > d2.getTime()) //OR:
if (d1.valueOf() > d2.valueOf())
var d3 = new Date(d1 - 1000); //new date, 1 second before d1
var a = new Date();
var b = new Date(a.valueOf());
console.log(a.toString() === b.toString());//true
console.log(a.valueOf() === b.valueOf());//true, to the milisecond
console.log(a == b);//false!
console.log(a === b);//false!!
console.log(a.valueOf() == b.valueOf());//true
//or shorter, still:
console.log(+(a) == +(b));
//coerce to strings, either call toString, or:
console.log((''+a) == (''+b));
if (a !== b && +(a) === +(b))
{//their values are the same, but different instances
    b = a;//now b references the same object as a
}
console.log(a === b);//true
console.log(+(a) === +(b));// true again
a.setTime(a.getTime() + 1000);//add 1 second
console.log(a == (b + 1000));
console.log(a === (b + 1000));
console.log((a-1000) == b);
console.log((a-1000) === +b);
console.log(+a == (+b + 1000));
console.log(+a === (+b + 1000));
console.log((a-1000) == +b);
console.log((a-1000) === +b);
function Foo() {

    this.valueOf = function() {
        return 500;
        };

    }

var bar = new Foo();
console.log(bar/1000); // -> 0.5