Я изучаю, как работают API-интерфейсы Hooks, предоставляемые React-Redux-v.7.1 , и увидел, что это упоминалось в Сравнения и обновления равенства (https://react -redux.js.org/api/hooks#equality-comparisons-and-updates) что:
" Начиная с v7.1.0-alpha.5 сравнение по умолчанию является строгим === Сравнение ссылок. Это отличается от connect () , который использует поверхностные проверки на равенство по результатам вызовов mapState , чтобы определить, требуется ли повторный рендерингЭто имеет несколько последствий для использования useSelector () ."
Мне интересно почему строгое равенство лучше, чем поверхностное равенство, которое используется Connect () ? Затем я изучил их сравнения на равенство:
Стандартная строгая проверка на равенство useSelector () просто проверяет a === b
const refEquality = (a, b) => a === b
И проверки на равенство в response-redux / src / connect / connect.js использует Object.is () , а также другие проверки, которыетак же, как в реагирует .
// The polyfill of Object.is()
function is(x, y) {
if (x === y) {
return x !== 0 || y !== 0 || 1 / x === 1 / y
} else {
return x !== x && y !== y
}
}
export default function shallowEqual(objA, objB) {
if (is(objA, objB)) return true
if (
typeof objA !== 'object' ||
objA === null ||
typeof objB !== 'object' ||
objB === null
) {
return false
}
const keysA = Object.keys(objA)
const keysB = Object.keys(objB)
if (keysA.length !== keysB.length) return false
for (let i = 0; i < keysA.length; i++) {
if (!hasOwn.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
return false
}
}
return true
}
Согласно описанию Object.is () в MDN:" Object.is не выполняет преобразование типов и не обрабатывает специальные значения для NaN, -0 и +0 (придает такое же поведение, что и ===, за исключением тех специальных числовых значений )."
Понятия не имею, почему a === b лучше, чем серия проверок на равенство. (Я впервые задаю вопросы здесь, извиняюсь за грубость или недостаток информации)