Blame view

node_modules/es5-ext/object/compare.js 1.06 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  "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);
  };