You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.1 KiB
39 lines
1.1 KiB
"use strict"; |
|
|
|
var strCompare = require("../string/#/case-insensitive-compare") |
|
, isObject = require("./is-object") |
|
, isValue = require("./is-value") |
|
, numIsNaN = require("../number/is-nan") |
|
, resolve |
|
, typeMap; |
|
|
|
typeMap = { undefined: 0, object: 1, boolean: 2, string: 3, number: 4 }; |
|
|
|
resolve = function (a) { |
|
if (isObject(a)) { |
|
if (typeof a.valueOf !== "function") return NaN; |
|
a = a.valueOf(); |
|
if (isObject(a)) { |
|
if (typeof a.toString !== "function") return NaN; |
|
a = a.toString(); |
|
if (typeof a !== "string") return NaN; |
|
} |
|
} |
|
return a; |
|
}; |
|
|
|
module.exports = function (val1, val2) { |
|
if (val1 === val2) return 0; // Same |
|
|
|
val1 = resolve(val1); |
|
val2 = resolve(val2); |
|
// eslint-disable-next-line eqeqeq |
|
if (val1 == val2) return typeMap[typeof val1] - typeMap[typeof val2]; |
|
if (!isValue(val1)) return -1; |
|
if (!isValue(val2)) return 1; |
|
if (typeof val1 === "string" || typeof val2 === "string") { |
|
return strCompare.call(val1, val2); |
|
} |
|
if (numIsNaN(val1) && numIsNaN(val2)) return 0; // Jslint: ignore |
|
return Number(val1) - Number(val2); |
|
};
|
|
|