( valA: any, // eslint-disable-line valB: any, // eslint-disable-line deep = true, explicit: string[] = ['__key'] )
| 115 | * @public |
| 116 | */ |
| 117 | export function eq( |
| 118 | valA: any, // eslint-disable-line |
| 119 | valB: any, // eslint-disable-line |
| 120 | deep = true, |
| 121 | explicit: string[] = ['__key'] |
| 122 | ): boolean { |
| 123 | if (valA === valB) return true |
| 124 | if (typeof valB === 'object' && typeof valA === 'object') { |
| 125 | if (valA instanceof Map) return false |
| 126 | if (valA instanceof Set) return false |
| 127 | if (valA instanceof Date && valB instanceof Date) |
| 128 | return valA.getTime() === valB.getTime() |
| 129 | if (valA instanceof RegExp && valB instanceof RegExp) |
| 130 | return eqRegExp(valA, valB) |
| 131 | if (valA === null || valB === null) return false |
| 132 | if (Object.keys(valA).length !== Object.keys(valB).length) return false |
| 133 | for (const k of explicit) { |
| 134 | if ((k in valA || k in valB) && valA[k] !== valB[k]) return false |
| 135 | } |
| 136 | for (const key in valA) { |
| 137 | if (!(key in valB)) return false |
| 138 | if (valA[key] !== valB[key] && !deep) return false |
| 139 | if (deep && !eq(valA[key], valB[key], deep, explicit)) return false |
| 140 | } |
| 141 | return true |
| 142 | } |
| 143 | return false |
| 144 | } |
| 145 | |
| 146 | /** |
| 147 | * A regular expression to test for a valid date string. |
no test coverage detected