源码中,实现浅对比的函数是:shallowequal(),源码:
//shouldcomponentupdate 源码: 判断是不是purereactcomponent,是的话,返回shallowequal() if (ctor.prototype && ctor.prototype.ispurereactcomponent) { return ( !shallowequal(oldprops, newprops) || !shallowequal(oldstate, newstate) ); }
// shallowequal方法源码: const hasownproperty = object.prototype.hasownproperty; // 这个is函数,处理了基本类型对比。 function is(x, y) { // samevalue algorithm if (x === y) { // steps 1-5, 7-10 // steps 6.b-6.e: +0 != -0 // added the nonzero y check to make flow happy, but it is redundant return x !== 0 || y !== 0 || 1 / x === 1 / y; } else { // step 6.a: nan == nan return x !== x && y !== y; } } /** * performs equality by iterating through keys on an object and returning false * when any key has values which are not strictly equal between the arguments. * returns true when the values of all keys are strictly equal. */ function shallowequal(obja: mixed, objb: mixed): boolean { if (is(obja, objb)) { return true; } // 由于obejct.is()可以对基本数据类型做一个精确的比较, 所以如果不等 // 只有一种情况是误判的,那就是object,所以在判断两个对象都不是object // 之后,就可以返回false了 if ( typeof obja !== 'object' || obja === null || typeof objb !== 'object' || objb === null ) { return false; } // 过滤掉基本数据类型之后,就是对对象的比较了 // 首先拿出key值,对key的长度进行对比 const keysa = object.keys(obja); const keysb = object.keys(objb); if (keysa.length !== keysb.length) { return false; } /// key值相等的时候 // 借用原型链上真正的 hasownproperty 方法,判断objb里面是否有a的key的key值 // 属性的顺序不影响结果也就是{name:'daisy', age:'24'} 跟{age:'24',name:'daisy' }是一样的 // 最后,对对象的value进行一个基本数据类型的比较,返回结果 for (let i = 0; i < keysa.length; i++) { if ( !hasownproperty.call(objb, keysa[i]) || !is(obja[keysa[i]], objb[keysa[i]]) ) { return false; } } return true; } export default shallowequal;
如对本文有疑问, 点击进行留言回复!!
JavaScript中某一标签内函数用this获取不到当前标签的问题笔记
MSAL.js 2.0发布 支持授权代码流 (authorization code flow)
网友评论