Show More
Commit Description:
submission report
Commit Description:
submission report
References:
File last commit:
Show/Diff file:
Action:
node_modules/es-abstract/2016/AbstractRelationalComparison.js
| 66 lines
| 1.6 KiB
| application/javascript
| JavascriptLexer
|
r789 | 'use strict'; | |||
var GetIntrinsic = require('../GetIntrinsic'); | ||||
var $Number = GetIntrinsic('%Number%'); | ||||
var $TypeError = GetIntrinsic('%TypeError%'); | ||||
var $isNaN = require('../helpers/isNaN'); | ||||
var $isFinite = require('../helpers/isFinite'); | ||||
var isPrefixOf = require('../helpers/isPrefixOf'); | ||||
var ToNumber = require('./ToNumber'); | ||||
var ToPrimitive = require('./ToPrimitive'); | ||||
var Type = require('./Type'); | ||||
// https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5 | ||||
// eslint-disable-next-line max-statements | ||||
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) { | ||||
if (Type(LeftFirst) !== 'Boolean') { | ||||
throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean'); | ||||
} | ||||
var px; | ||||
var py; | ||||
if (LeftFirst) { | ||||
px = ToPrimitive(x, $Number); | ||||
py = ToPrimitive(y, $Number); | ||||
} else { | ||||
py = ToPrimitive(y, $Number); | ||||
px = ToPrimitive(x, $Number); | ||||
} | ||||
var bothStrings = Type(px) === 'String' && Type(py) === 'String'; | ||||
if (!bothStrings) { | ||||
var nx = ToNumber(px); | ||||
var ny = ToNumber(py); | ||||
if ($isNaN(nx) || $isNaN(ny)) { | ||||
return undefined; | ||||
} | ||||
if ($isFinite(nx) && $isFinite(ny) && nx === ny) { | ||||
return false; | ||||
} | ||||
if (nx === 0 && ny === 0) { | ||||
return false; | ||||
} | ||||
if (nx === Infinity) { | ||||
return false; | ||||
} | ||||
if (ny === Infinity) { | ||||
return true; | ||||
} | ||||
if (ny === -Infinity) { | ||||
return false; | ||||
} | ||||
if (nx === -Infinity) { | ||||
return true; | ||||
} | ||||
return nx < ny; // by now, these are both nonzero, finite, and not equal | ||||
} | ||||
if (isPrefixOf(py, px)) { | ||||
return false; | ||||
} | ||||
if (isPrefixOf(px, py)) { | ||||
return true; | ||||
} | ||||
return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f | ||||
}; | ||||