整数和对象之间的比较结果是什么?

时间:2017-12-17 09:22:53

标签: javascript operators

将对象与整数进行比较时,JavaScript的行为是什么? 例如:

var result = { test: 'blah' };
if (result < 0) {
    // when is this portion processed?
}

我目前正在使用result变量,该变量可以是整数(错误代码),也可以是包含更多详细信息的对象。

我想我可以使用parseInt()parseFloat(),但我很想知道处理这些情况的最短路径......

6 个答案:

答案 0 :(得分:6)

$mysql_datetime = "2011-01-06 09:39:114525";
list($date, $time) = explode(' ', $mysql_datetime);
list($year, $month, $day) = explode('-', $date);
list($hr, $min, $sec) = explode(':', $time);
$sec = (int)substr($sec, 0, 2);

答案 1 :(得分:4)

  

我想知道[...]是否定义了一般规则

是。这些规则在JavaScript specification中描述。以你的例子:

{ test: "blah" } < 0

我突出了所涉及的章节和规则:

  

11.8.5抽象关系比较算法
  [...]
  1.a让px成为调用ToPrimitive(x,提示数字)的结果。

表达式{ test: "blah" }最终为"[object Object]"

  

3.a设nx为调用ToNumber(px)的结果。

表达式"[object Object]"最终为NaN

  

3.c如果nx是NaN,则返回undefined。

算法的结果是undefined

  

11.8.1小于运营商(&lt;)
  [...]
  6.如果r未定义,则返回false。否则,请返回r。

最终结果为false

答案 2 :(得分:3)

如果要将对象与整数进行比较,Javascript将自动调用对象上的valueOf()方法。类似地,当与字符串比较时,使用toString()方法。

如果您不是该对象的创建者,则可能有也可能没有valueOf函数,因此如果您尚未创建对象或完成一些其他测试逻辑,则使用比较运算符的行为可能是意外的只是比较对象和整数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

以下代码段显示了一些正在进行的比较。

var five = { 
  value: 5, 
  valueOf: function() { 
    return this.value 
  } 
};

var billion = { 
  value: 1000000000
};

console.log ( five.valueOf() );
console.log ( billion.valueOf() );
console.log ( billion > five );
console.log ( NaN > five );
console.log ( 6 > five );
console.log ( 4 > five );

答案 3 :(得分:1)

developer.mozilla.org上的文档说当操作数A是Object而操作数B是数字时,JS比较逻辑是这样定义的:

ToPrimitive(A) == B

其中

  

ToPrimitive(A)尝试将其对象参数转换为基元   通过尝试调用A.toString和的不同序列来获取值   A.valueOf上的​​方法。

此外,Mozilla JavaScript Reference声明:

  

如果未在自定义对象中覆盖该方法,则toString()将返回   &#34; [对象类型]&#34;。

  

从JavaScript 1.8.5开始toString()调用null返回[object   Null]和undefined返回[object Undefined],如第5节中所定义   ECMAScript版本和随后的勘误表。

因此可以合理地说,如果与Number进行比较,Object将始终转换为String。

然后以这种方式处理:

ToNumber(A) === B
  

ToNumber(A)尝试将其参数转换为之前的数字   比较。它的行为相当于+ A(一元+运算符)。

最后,Unary Plus doc声明:

  

如果它无法解析特定值,它将评估为NaN。

developer.mozilla.org上的相同文档提供了一个汇总表,显示将数字与NaN进行比较时始终返回false。

因此,除非在@JasonB引发的方案中,否则给定的代码应该有效。

但是,为了避免因数据结构而导致的任何错误,@ John Kennedy给出的答案是首选

答案 4 :(得分:0)

您可以先检查结果是否为result.isInteger()的整数,然后执行所需的任何操作,否则将其视为对象。

答案 5 :(得分:0)

我建议你测试result变量的类型,以确定它是一个数字还是一个对象。

测试对象:

typeof result === 'object'

测试一个数字:

Number.isInteger(result)