将对象与整数进行比较时,JavaScript的行为是什么? 例如:
var result = { test: 'blah' };
if (result < 0) {
// when is this portion processed?
}
我目前正在使用result
变量,该变量可以是整数(错误代码),也可以是包含更多详细信息的对象。
我想我可以使用parseInt()
或parseFloat()
,但我很想知道处理这些情况的最短路径......
答案 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)