You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
在浅比较 a和b时,我们期待返回的是 true ,但函数返回的是 false, 因为函数是直接去比较 a 和 b这两个引用值是否相等,即 a === b,这样的比较一般都会返回 fasle ,除非 a 和 b 都指向同一个对象才会返回 true, 即 a = b = { key: 666 },所以浅比较在比较对象时,会产生误判。
函数源代码
函数用途
浅比较两个基本数据类型的值或者对象,在比较基本数据类型时,还会扩展一些比较,
详情参考下方 is() 函数解读
,而所谓的浅比较,是指在比较两个对象时,没有对对象内部嵌套的键值对进行进一步比较,因而会产生判断错误的情况,如:在浅比较
a
和b
时,我们期待返回的是 true ,但函数返回的是 false, 因为函数是直接去比较 a 和 b这两个引用值是否相等,即a === b
,这样的比较一般都会返回 fasle ,除非 a 和 b 都指向同一个对象才会返回 true, 即a = b = { key: 666 }
,所以浅比较在比较对象时,会产生误判。代码解读
function is(x,y)
可以看到,
is
实际上是Object.is()
的polyfill,能对基本数据类型能进行精确的比较,而对于对象,则直接比较引用值是否相等。(这也是为什么shallowEqual函数不能适用于嵌套类型比较的原因)代码解读
function shallowEqual(objA, objB)
总结
在react和react-router中都有用到这个函数,在 react的生命周期函数
shouldComponentUpdate(nextProps, nextState)
中 说到react只会对this.props 和 nextProps
,this.state 和 nextState
进行浅比较,而不适用于嵌套的对象。原因就是使用了此方法,源代码如下:The text was updated successfully, but these errors were encountered: