diff --git a/src/arrays.js b/src/arrays.js index 72fa593..f0e3ee7 100644 --- a/src/arrays.js +++ b/src/arrays.js @@ -1,3 +1,5 @@ +import { objectIs } from './util'; + export default function shallowEqualArrays(arrA, arrB) { if (arrA === arrB) { return true; @@ -14,7 +16,7 @@ export default function shallowEqualArrays(arrA, arrB) { } for (var i = 0; i < len; i++) { - if (arrA[i] !== arrB[i]) { + if (objectIs(arrA[i], arrB[i]) === false) { return false; } } diff --git a/src/arrays.test.js b/src/arrays.test.js index fdcf789..830151b 100644 --- a/src/arrays.test.js +++ b/src/arrays.test.js @@ -48,6 +48,18 @@ var tests = [ arrA: [obj1, obj2, obj3], arrB: [obj1, obj2, obj3], result: true + }, + { + should: 'return true if all corresponding elements pass Object.is', + arrA: [Number.NaN], + arrB: [0/0], + result: true + }, + { + should: 'return false if all corresponding elements don\'t pass Object.is', + arrA: [-0], + arrB: [+0], + result: false } ]; diff --git a/src/objects.js b/src/objects.js index 079c439..e3e6676 100644 --- a/src/objects.js +++ b/src/objects.js @@ -1,3 +1,5 @@ +import { objectIs } from './util'; + export default function shallowEqualObjects(objA, objB) { if (objA === objB) { return true; @@ -18,7 +20,7 @@ export default function shallowEqualObjects(objA, objB) { for (var i = 0; i < len; i++) { var key = aKeys[i]; - if (objA[key] !== objB[key] || !Object.prototype.hasOwnProperty.call(objB, key)) { + if (objectIs(objA[key], objB[key]) === false || !Object.prototype.hasOwnProperty.call(objB, key)) { return false; } } diff --git a/src/objects.test.js b/src/objects.test.js index 6f54a8e..33d2c5b 100644 --- a/src/objects.test.js +++ b/src/objects.test.js @@ -52,6 +52,18 @@ var tests = [ objA: { first: undefined }, objB: { second: 'green' }, result: false + }, + { + should: 'return true when all values pass Object.is', + objA: { first: Number.NaN }, + objB: { first: 0/0 }, + result: true + }, + { + should: 'return false when all values don\'t pass Object.is', + objA: { first: 0 }, + objB: { first: -0 }, + result: false } ]; diff --git a/src/util.js b/src/util.js new file mode 100644 index 0000000..40f8a02 --- /dev/null +++ b/src/util.js @@ -0,0 +1,12 @@ +export function objectIs(a, b) { + if (a === 0 && b === 0) { + return 1 / a === 1 / b; + } + if (a === b) { + return true; + } + if (a !== a && b !== b) { + return true; + } + return false; +}