Реагируйте сравнение реквизита: "_.isEqual" против "==="
Моя проблема в том, что глубокое сравнение lodash равенства и строгого равенства === возвращает разные значения при сравнении полей nextProps и self.props в методе жизненного цикла componentWillReceiveProps.
- Значит ли это, что значения этих свойств должны быть разных типов? Я предполагаю, что _.isEqual выполняет преобразование типов для сравнения равенства, так как === нет.
- Рекомендуется ли использовать _.isEqual при проверке равенства между полями nextProps и self.props?
Вот мой конкретный пример -
componentWillReceiveProps(nextProps){
(nextProps.obj === self.props.obj); // false
_.isEqual(nextProps.obj, self.props.obj); // true
typeof(nextProps.obj); // object
typeof(self.props.obj); // object
nextProps.obj; // { k1: "v1", k2: "v2", k3: "v3" }
self.props.obj; // { k1: "v1", k2: "v2", k3: "v3" }
}
Кто-нибудь знает, что может происходить?
3 ответа
_.isEquals:
Выполняет глубокое сравнение между двумя значениями, чтобы определить, являются ли они эквивалентными. он вернет true, если значения эквивалентны, иначе false.
Пример:
var object = { 'a': 1 };
var other = { 'a': 1 };
console.log(_.isEqual(object, other));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
===:
Для строгого равенства сравниваемые объекты должны иметь одинаковый тип и:
сравниваемые должны иметь одинаковый тип и:
- Две строки строго равны, если они имеют одинаковую последовательность символов, одинаковую длину и одинаковые символы в соответствующих позициях.
- Два числа строго равны, когда они численно равны (имеют одинаковое числовое значение). NaN не равно ничему, в том числе NaN. Положительные и отрицательные нули равны друг другу.
- Два булевых операнда строго равны, если оба истинны или оба ложны.
- Два объекта строго равны, если они ссылаются на один и тот же объект
Пример:
var object = { 'a': 1 };
var other = { 'a': 1 };
console.log(object === other);
// => false
Компоненты React имеют очень тяжелые клавиши. При сравнении свойств сравнивать эти ключи не имеет смысла, поскольку они не содержат данных о состоянии приложения. Кроме того, есть опасность попасть в ловушку циклических ссылок, что приведет к бесконечному циклу проверки свойств компонента React. По этой причине эти свойства лучше всего игнорировать. Этот трюк используется в библиотеке epoberezkin/fast-deep-equal .
const isPropsEqual = _.isEqualWith(
data1,
data2,
(data1Value, data2Value, key) => {
const ignoreKeysList = [
'_owner',
'$$typeof'
]
return ignoreKeysList.includes(key) ? true : undefined
}
)
Это просто рабочая среда, которая помогает вам игнорировать структурные части компонента React при сравнении.
В javascript, когда вы используете '===' для сравнения объектов, он вернет true, только если это тот же объект, тогда как _.isEqual вернет true, если объект эквивалентен.
Что касается вашего фактического вопроса, я думаю, вы должны использовать _.isEqual, чтобы сравнить 2 объекта, чтобы увидеть, являются ли они точной копией друг друга.
Для получения дополнительной информации см.: https://lodash.com/docs