fix Ox.isEqual

This commit is contained in:
rolux 2012-05-25 23:00:28 +02:00
parent c481889f3a
commit 12dcdf13fc

View file

@ -73,6 +73,10 @@ Ox.isElement = function(value) {
/*@ /*@
Ox.isEqual <function> Returns true if two values are equal Ox.isEqual <function> Returns true if two values are equal
<script>
Ox.test.element = document.createElement('a');
Ox.test.fn = function() {};
</script>
> Ox.isEqual((function() { return arguments; }()), (function() { return arguments; }())) > Ox.isEqual((function() { return arguments; }()), (function() { return arguments; }()))
true true
> Ox.isEqual([1, 2, 3], [1, 2, 3]) > Ox.isEqual([1, 2, 3], [1, 2, 3])
@ -85,20 +89,24 @@ Ox.isEqual <function> Returns true if two values are equal
true true
> Ox.isEqual(new Date(0), new Date(1)) > Ox.isEqual(new Date(0), new Date(1))
false false
> Ox.isEqual(Ox.test.element, Ox.test.element)
true
> Ox.isEqual(document.createElement('a'), document.createElement('a')) > Ox.isEqual(document.createElement('a'), document.createElement('a'))
true
> Ox.isEqual(document.createElement('a'), document.createElement('b'))
false false
> Ox.isEqual(function(a) { return a; }, function(a) { return a; }) > Ox.isEqual(Ox.test.fn, Ox.test.fn)
true true
> Ox.isEqual(function(a) { return a; }, function(b) { return b; }) > Ox.isEqual(function() {}, function() {})
false false
> Ox.isEqual(Infinity, Infinity) > Ox.isEqual(Infinity, Infinity)
true true
> Ox.isEqual(-Infinity, Infinity) > Ox.isEqual(Infinity, -Infinity)
false false
> Ox.isEqual(NaN, NaN) > Ox.isEqual(NaN, NaN)
false false
> Ox.isEqual(null, null)
true
> Ox.isEqual(null, void 0)
false
> Ox.isEqual(0, 0) > Ox.isEqual(0, 0)
true true
> Ox.isEqual({}, {}) > Ox.isEqual({}, {})
@ -117,34 +125,32 @@ Ox.isEqual <function> Returns true if two values are equal
true true
@*/ @*/
Ox.isEqual = function(a, b) { Ox.isEqual = function(a, b) {
var isEqual = false, type = Ox.typeOf(a); var ret = false, type = Ox.typeOf(a);
if (a === b) { // 0 === -0, but not equal
isEqual = true; if (a === b && (a !== 0 || 1 / a === 1 / b)) {
ret = true;
} else if (type == Ox.typeOf(b)) { } else if (type == Ox.typeOf(b)) {
if (a == b) { if (a == b) {
isEqual = true; ret = true;
} else if (type == 'date') { } else if (type == 'date') {
isEqual = a.getTime() == b.getTime(); ret = +a == +b;
} else if (type == 'element') { } else if (type == 'element') {
isEqual = a.isEqualNode(b); ret = a.isEqualNode(b);
} else if (type == 'function') {
// fixme: this doesn't do it
// isEqual = a.toString() == b.toString();
} else if (type == 'regexp') { } else if (type == 'regexp') {
isEqual = a.global == b.global && a.ignore == b.ignore ret = a.global == b.global && a.ignore == b.ignore
&& a.multiline == b.multiline && a.source == b.source; && a.multiline == b.multiline && a.source == b.source;
} else if ( } else if (
['arguments', 'array', 'object'].indexOf(type) > -1 ['arguments', 'array', 'object'].indexOf(type) > -1
&& Ox.len(a) == Ox.len(b) && Ox.len(a) == Ox.len(b)
) { ) {
isEqual = true; ret = true;
Ox.forEach(a, function(v, k) { Ox.forEach(a, function(value, key) {
isEqual = Ox.isEqual(v, b[k]); ret = Ox.isEqual(value, b[key]);
!isEqual && Ox.Break(); !ret && Ox.Break();
}); });
} }
} }
return isEqual; return ret;
}; };
/*@ /*@