用于在两个对象或数组之间执行浅比较的函数。当两个值的所有成员都严格等于另一个值的对应成员时,这两个值具有浅相等。
用法
@wordpress/is-shallow-equal 的默认导出是一个接受两个对象或数组的函数:
import isShallowEqual from '@wordpress/is-shallow-equal';
isShallowEqual( { a: 1 }, { a: 1, b: 2 } );
// ⇒ false
isShallowEqual( { a: 1 }, { a: 1 } );
// ⇒ true
isShallowEqual( [ 1 ], [ 1, 2 ] );
// ⇒ false
isShallowEqual( [ 1 ], [ 1 ] );
// ⇒ true
如果你已经知道要处理的值类型,可以导入特定的实现:
import { isShallowEqualArrays } from '@wordpress/is-shallow-equal';
import { isShallowEqualObjects } from '@wordpress/is-shallow-equal';
浅比较与深比较的不同之处在于,它将每个值的成员与另一个值的成员进行严格相等比较,这意味着数组和对象将按其引用进行比较,而不是按其值进行比较(另见JavaScript 中的对象相等)。在必须按值比较嵌套对象的情况下,请考虑改用 fast-deep-equal。
import isShallowEqual from '@wordpress/is-shallow-equal';
import fastDeepEqual from 'fast-deep-equal/es6'; // 深比较
let object = { a: 1 };
isShallowEqual( [ { a: 1 } ], [ { a: 1 } ] );
// ⇒ false
fastDeepEqual( [ { a: 1 } ], [ { a: 1 } ] );
// ⇒ true
isShallowEqual( [ object ], [ object ] );
// ⇒ true
理由
浅相等工具已经比比皆是。由于这些操作通常位于关键热代码路径的核心,WordPress 贡献者有一些特定需求,而现有解决方案只能部分满足这些需求。
具体来说,它应该……
- ……将非原始但引用相等的成员值视为相等。
- 因此排除了
is-equal-shallow这个选项。
- 因此排除了
- ……提供单一函数作为接口,无论值类型如何。
- 因此排除了
shallow-equal这个选项。
- 因此排除了
- ……保持极简;仅提供浅相等的基础功能。
- 因此排除了
shallow-equals这个选项。
- 因此排除了
- ……预期并针对引用相同视为相等的情况进行优化。
- 因此排除了
is-equal-shallow和shallow-equals这些选项。
- 因此排除了
- ……面向非 Facebook 项目使用。
- 因此排除了
fbjs/lib/shallowEqual这个选项。
- 因此排除了
- ……是性能最佳的实现。
- 参见 基准测试。
基准测试
以下结果是在 Node v10.15.3(LTS)环境下,于 MacBook Pro(Late 2016)2.9 GHz Intel Core i7 上生成的。
@wordpress/is-shallow-equal (type specific) (object, equal) x 4,519,009 ops/sec ±1.09% (90 runs sampled)>@wordpress/is-shallow-equal (type specific) (object, same) x 795,527,700 ops/sec ±0.24% (93 runs sampled)>@wordpress/is-shallow-equal (type specific) (object, unequal) x 4,841,640 ops/sec ±0.94% (93 runs sampled)>@wordpress/is-shallow-equal (type specific) (array, equal) x 106,393,795 ops/sec ±0.16% (94 runs sampled)>@wordpress/is-shallow-equal (type specific) (array, same) x 800,741,511 ops/sec ±0.22% (95 runs sampled)>@wordpress/is-shallow-equal (type specific) (array, unequal) x 49,178,977 ops/sec ±1.99% (82 runs sampled)
@wordpress/is-shallow-equal (object, equal) x 4,449,367 ops/sec ±0.31% (91 runs sampled)>@wordpress/is-shallow-equal (object, same) x 796,677,179 ops/sec ±0.23% (94 runs sampled)>@wordpress/is-shallow-equal (object, unequal) x 4,989,529 ops/sec ±0.30% (91 runs sampled)>@wordpress/is-shallow-equal (array, equal) x 44,840,546 ops/sec ±1.18% (89 runs sampled)>@wordpress/is-shallow-equal (array, same) x 794,344,723 ops/sec ±0.24% (91 runs sampled)>@wordpress/is-shallow-equal (array, unequal) x 49,860,115 ops/sec ±1.73% (85 runs sampled)
shallowequal (object, equal) x 3,702,126 ops/sec ±0.87% (92 runs sampled)>shallowequal (object, same) x 796,649,597 ops/sec ±0.21% (92 runs sampled)>shallowequal (object, unequal) x 4,027,885 ops/sec ±0.31% (96 runs sampled)>shallowequal (array, equal) x 1,684,977 ops/sec ±0.37% (94 runs sampled)>shallowequal (array, same) x 794,287,091 ops/sec ±0.26% (91 runs sampled)>shallowequal (array, unequal) x 1,738,554 ops/sec ±0.29% (91 runs sampled)
shallow-equal (type specific) (object, equal) x 4,669,656 ops/sec ±0.34% (92 runs sampled)>shallow-equal (type specific) (object, same) x 799,610,214 ops/sec ±0.20% (95 runs sampled)>shallow-equal (type specific) (object, unequal) x 4,908,591 ops/sec ±0.49% (93 runs sampled)>shallow-equal (type specific) (array, equal) x 104,711,254 ops/sec ±0.65% (91 runs sampled)>shallow-equal (type specific) (array, same) x 798,454,281 ops/sec ±0.29% (94 runs sampled)>shallow-equal (type specific) (array, unequal) x 48,764,338 ops/sec ±1.48% (84 runs sampled)
is-equal-shallow (object, equal) x 5,068,750 ops/sec ±0.28% (92 runs sampled)>is-equal-shallow (object, same) x 17,231,997 ops/sec ±0.42% (92 runs sampled)>is-equal-shallow (object, unequal) x 5,524,878 ops/sec ±0.41% (92 runs sampled)>is-equal-shallow (array, equal) x 1,067,063 ops/sec ±0.40% (92 runs sampled)>is-equal-shallow (array, same) x 1,074,356 ops/sec ±0.20% (94 runs sampled)>is-equal-shallow (array, unequal) x 1,758,859 ops/sec ±0.44% (92 runs sampled)
shallow-equals (object, equal) x 8,380,550 ops/sec ±0.31% (90 runs sampled)>shallow-equals (object, same) x 27,583,073 ops/sec ±0.60% (91 runs sampled)>shallow-equals (object, unequal) x 8,954,268 ops/sec ±0.71% (92 runs sampled)>shallow-equals (array, equal) x 104,437,640 ops/sec ±0.22% (96 runs sampled)>shallow-equals (array, same) x 141,850,542 ops/sec ±0.25% (93 runs sampled)>shallow-equals (array, unequal) x 47,964,211 ops/sec ±1.51% (84 runs sampled)
fbjs/lib/shallowEqual (object, equal) x 3,366,709 ops/sec ±0.35% (93 runs sampled)>fbjs/lib/shallowEqual (object, same) x 794,825,194 ops/sec ±0.24% (94 runs sampled)>fbjs/lib/shallowEqual (object, unequal) x 3,612,268 ops/sec ±0.37% (94 runs sampled)>fbjs/lib/shallowEqual (array, equal) x 1,613,800 ops/sec ±0.23% (90 runs sampled)>fbjs/lib/shallowEqual (array, same) x 794,861,384 ops/sec ±0.24% (93 runs sampled)>fbjs/lib/shallowEqual (array, unequal) x 1,648,398 ops/sec ±0.77% (92 runs sampled)
你可以通过克隆仓库、安装依赖并运行 benchmark/index.js 脚本来自行运行基准测试:
git clone https://github.com/WordPress/gutenberg.git
npm install
npm run build
node ./packages/is-shallow-equal/benchmark
为这个包做出贡献
这是 Gutenberg 项目中的一个独立包。该项目组织为 monorepo。它由多个自包含的软件包组成,每个包都有特定用途。此 monorepo 中的包会发布到 npm,并被 WordPress 以及其他软件项目使用。
要了解更多关于为该包或整个 Gutenberg 项目做出贡献的信息,请阅读项目的主要 贡献者指南。