【问题标题】:Explain the behaviour of >= and <= operators in the following case在以下情况下解释 >= 和 <= 运算符的行为
【发布时间】:2016-05-10 16:47:29
【问题描述】:
function foo(){
console.log( function(){return 1} <= function(){return 1} );
}
foo();

上面的代码打印“true”。它对 = 都打印 true,对于所有其他运算符它是“false”。

这里发生了什么诡计?

【问题讨论】:

  • @Sterling 我认为没有调用该函数的 toString() 运算符,因为以下返回 false:function(){return 1} == function(){return 1}
  • @Dmitri 所以 javascript 在 >=,
  • 是的,== 和 === 的评估不同于 &lt;=、&gt;=、&gt;、&lt;,尤其是在实例比较方面。

标签: javascript comparison operators


【解决方案1】:

因为不是比较返回的1,而是比较functions。当您在函数上运行运算符时,它会隐式调用toString。

至于==,Dmitri 解释得很好,toString 没有被调用,但它运行对象比较,这将是错误的,因为 2 个不同的对象永远不会相同。

这里是ECMA spec On 关系运算符,它解释了它是如何使用比较操作进行操作的。对于对象,使用instanceOf。

【讨论】:

  • 这似乎是合理的,但对于 JS 来说似乎很奇怪。你能包括描述这个的规范部分吗?
【解决方案2】:

function(){return 1} &lt;= function(){return 1} 将函数转换为原语。转换为原语的函数会评估为字符串中的代码(调用 toString())。
然后"function (){return 1}" &lt;= "function (){return 1}"对字符串进行小于等于比较,即true。

在function(){return 1} == function(){return 1} JavaScript 中比较函数对象。但是因为这些是不同的实例,所以您将拥有false。

您可以在this article 中查看更多关于相等运算符的信息。

【讨论】:

  • Arg,我也发现了。在我的回答中参考你的。 +1
【解决方案3】:

因为它总是比较 1 = 1 总是相同的,那么它就是真的。但是如果你比较 1 > 1 那就错了。

【讨论】:

  • 对不起,@harsh 你的问题不清楚...但我读了下面的评论
  • 这仍然是错误的,这个问题与函数返回的内容(本身)无关,因为函数没有被执行。比较正在函数上运行
  • @Patty 如果你在这种情况下描述一下,它会起作用:(function(){return 1})() &lt;= (function(){return 1})()
猜你喜欢
  • 2016-09-29
  • 2022-06-24
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多