我刚刚在SpiderMonkey和V8 javascript引擎中发现了一个奇怪的行为。建议找到一个解释对每个人来说都是一个好学校
奇怪的工作代码:
var x = (new Date()).setHours(24, 0, 0, 0);
typeof x; // "number"
按预期工作的代码:
var x = new Date();
x.setHours(24, 0, 0, 0);
typeof x; // "object"
x instanceof Date; // true
如果我们找到原因,我们就能更好地理解JavaScript是如何工作的
From MDN setHours设置日期并返回从1970年1月1日00:00:00开始的毫秒数。
所以在第一个例子中,x被分配了结果时间戳,它是一个数字。
为了更好地说明,请执行
var y = new Date(),
x = y.setHours(24,0,0,0)
typeof x // number
Date.setHours
:
[…返回从UTC时间1970年1月1日00:00:00到更新后的Date实例所表示的时间的毫秒数。
在第一个代码片段中,x
的值是一个表示时间戳的数字,因此它的类型是number
。
var x = (new Date()).setHours(24, 0, 0, 0);
typeof x; // "number"
您实例化一个Date对象并调用setHours
,返回分配给x
的时间戳。
第二个代码片段:
var x = new Date();
x.setHours(24, 0, 0, 0);
typeof x; // "object"
x
是一个Date
对象,所以这也是预期的行为——看看typeof
操作符可能的返回值。
x
是Date
的一个实例,它继承了Date
构造函数的原型,因此x instanceof Date
是true
。