According to ECMAScript® 2018 Language Specification, (7.2.14) this type of comparisson is performed as follows:
7.2.14 Abstract Equality Comparison
If Type(x) is the same as Type(y), then
Return the result of performing Strict Equality Comparison x === y.
If x is null and y is undefined, return true.
If x is undefined and y is null, return true.
If Type(x) is Number and Type(y) is String, return the result of the
comparison x == ! ToNumber(y).
If Type(x) is String and Type(y) is Number, return the result of the
comparison ! ToNumber(x) == y.
If Type(x) is Boolean, return the result of the comparison !
ToNumber(x) == y.
If Type(y) is Boolean, return the result of the comparison x == !
ToNumber(y).
If Type(x) is either String, Number, or Symbol and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).
If Type(x) is Object and Type(y) is either String, Number, or Symbol,
return the result of the comparison ToPrimitive(x) == y.
Return false.
And:
7.1.3 ToNumber ( argument ): If argument is true, return 1. If argument is false, return +0.
(bolds are mine)
So:
(1 < 0 ) < 3
false < 3
0 < 3
true