compare.js
 1  'use strict';
 2  
 3  var keys       = Object.keys
 4    , isString   = require('../String/is-string')
 5    , strCompare = require('../String/prototype/case-insensitive-compare')
 6    , isObject   = require('./is-object')
 7  
 8    , resolve, typeMap;
 9  
10  typeMap = {
11  	undefined: 0,
12  	object: 1,
13  	'boolean': 2,
14  	string: 3,
15  	number: 4
16  };
17  
18  resolve = function (a) {
19  	if (isObject(a)) {
20  		a = a.valueOf();
21  		if (isObject(a)) {
22  			a = a.toString();
23  		}
24  	}
25  	return a;
26  };
27  
28  module.exports = function (a, b) {
29  	if (a === b) {
30  		// Same
31  		return 0;
32  	}
33  	a = resolve(a);
34  	b = resolve(b);
35  	if (a == b) {
36  		return typeMap[typeof a] - typeMap[typeof b];
37  	} else if (a == null) {
38  		return -1;
39  	} else if (b == null) {
40  		return 1;
41  	} else if ((typeof a === 'string') || (typeof b === 'string')) {
42  		return strCompare.call(a, b);
43  	} else {
44  		return Number(a) - Number(b);
45  	}
46  };