使用Math.max()计算最大JavaScript日期对象文档

时间:2017-09-23 21:30:07

标签: javascript date max

我不是100%确定您为什么能够使用Date函数计算多个Math.max()对象的最大日期。我的IDE PhpStorm一直给我以下错误:

  

参数类型日期不能分配给参数类型编号

可以分配参数,如我的代码段所示:

/* Variable Defaults */
var dateOne = new Date();
var dateTwo = new Date('2017-01-21');
var dateThree = new Date('11/16/2016');
var dateMax = Math.max(dateOne, dateTwo, dateThree);

/* Console Data */
console.log('dateOne', dateOne);
console.log('dateTwo', dateTwo);
console.log('dateThree', dateThree);
console.log('dateMax', dateMax + ': ' + new Date(dateMax));

我决定查看规格,看看我的IDE是否使用了较旧的标准,但是我的研究没有实现我想要教育自己为什么这种方法应该首先起作用的愿望:

ECMAScript 1st Edition (ECMA-262)

  

15.8.2.11 max(x,y)

     
      
  • 返回两个参数中较大的一个。
  •   
  • 如果任一参数为NaN,则结果为NaN。
  •   
  • 如果x> y,则结果为x。
  •   
  • 如果y> x,则结果为y。
  •   
  • 如果x为+0且y为+0,则结果为+0。
  •   
  • 如果x为+ 0且y为-0,则结果为+0。
  •   
  • 如果x为-0且y为+0,则结果为+0。
  •   
  • 如果x为-0且y为-0,则结果为-0。
  •   

ECMAScript 5.1 (ECMA-262)

  

15.8.2.11 max([value1 [,value2 [,...]]])

     
      
  • 给定零个或多个参数,在每个参数上调用ToNumber并返回最大的结果值。
  •   
  • 如果没有给出参数,则结果为-∞。
  •   
  • 如果任何值为NaN,则结果为NaN。
  •   
  • 确定最大值的值的比较如11.8.5所述,但+0被认为大于-0。
  •   
  • max方法的length属性为2.
  •   

ECMAScript 2015 (6th Edition, ECMA-262)

  

20.2.2.24 Math.max(value1,value2,... values)

     
      
  • 给定零个或多个参数,在每个参数上调用ToNumber并返回最大的结果值。
  •   
  • 如果没有给出参数,则结果为-∞。
  •   
  • 如果任何值为NaN,则结果为NaN。
  •   
  • 使用抽象关系比较算法(7.2.11)进行比较以确定最大值   +0被认为大于-0。
  •   
  • max方法的length属性为2.
  •   

ECMAScript Latest Draft (ECMA-262)

  

20.2.2.24 Math.max(value1,value2,... values)

     
      
  • 给定零个或多个参数,在每个参数上调用ToNumber并返回最大的结果值。
  •   
  • 如果没有给出参数,则结果为-∞。
  •   
  • 如果任何值为NaN,则结果为NaN。
  •   
  • 使用抽象关系比较算法进行比较以确定最大值,但+0是   被认为大于-0。
  •   

我已经在所有现代浏览器中测试了这种方法,但它没有产生任何错误。虽然我想知道这是否与旧浏览器兼容。

为什么Math.max()通过传递Date个对象时,规范明确表明不应该这样做?

2 个答案:

答案 0 :(得分:2)

由于有效Date()不是NaN,因此可以使用Number()函数,+一元运算符或valueOf()将其转换为数字功能:

var date = new Date();
console.log(isNaN(date) + ',' + Number(date));
console.log(isNaN(date) + ',' + +date);
console.log(isNaN(date) + ',' + date.valueOf());
console.log(isNaN(2) + ',' + Number(2));
console.log(isNaN('2') + ',' + Number('2'));
console.log(isNaN('xx') + ',' + Number('xx'));
console.log(isNaN(['a']) + ',' + Number(['a']));
console.log(isNaN({}) + ',' + Number({}));

答案 1 :(得分:0)

NaN是类型编号的特殊值,而不是“不是数字的所有内容”。函数使用它时应该返回一个数字,例如,如果你调用Math.sqrt(-1)

此外,如果一个函数需要一个数字,那么JavaScript会尽力做出一些你给它的东西。由于Date有一个数字表示(可以使用Date.valueOf获得),因此它将使用它。

(有趣的是,您可以使用NaN函数测试值是否为isNaN,但直接将其与NaN进行比较将返回false。其中一个JavaScript的东西)