The Less-than-or-equal Operator: With NaN

老子叫甜甜 提交于 2019-12-11 17:08:31

问题


When we use The Less-than-or-equal Operator this is work under the hood with The Abstract Relational Comparison Algorithm. For example.

a <= b;

Convert to JavaScript like this

!(b < a)

And EcmaScript Spesification says (http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5) which indicates that at least one operand is NaN less than return undefined And this is meaning

var a = 1;
var b = "asd"
a < b // b.toNumber() => NaN and this is operation return undefined (false)

If we use like this

var a = 1;
var b = "asd"
a <= b // this convert to  !(b < a) and (b<a) return undefined
// and !(undefined) must be true

But EcmaScript spesification says this is return false. This is interesting for me what is reason this?


回答1:


While <= does use the Abstract Relational Comparison Algorithm, a <= b isn't equivalent to !(b < a). It is equivalent to b < a !== false ? false : true (where < represents the Abstract Relational Comparison Algorithm, not the JavaScript < operator which can never evaluate to undefined), which behaves the same as !(b < a) when b < a is truthy or exactly false, but does not behave the same when b < a is falsey in general. If b < a evaluates to undefined, the whole expression will evaluate to false.

This is defined in the spec at step 6 here: https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.3

  1. Let r be the result of performing abstract relational comparison rval < lval with LeftFirst equal to false.
  2. If r is true or undefined, return false. Otherwise, return true.

The Abstract Relational Comparison Algorithm can only evaluate to true, false, or undefined; so the "Otherwise" in step 6 can only apply when r is false, making a <= b equivalent to b < a !== false ? false : true (again, where < represents the Abstract Relational Comparison Algorithm).



来源:https://stackoverflow.com/questions/57260084/the-less-than-or-equal-operator-with-nan

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!