cocotte-compare
v0.5.1
Published
deep equal
Downloads
2
Readme
cocotte-compare
はじめに
人間らしい比較を行う関数を提供します
javascriptの等価演算子では==
と===
が存在しますが、どちらもテストに不向きな場面があります
人間らしい演算子を行うcocotte-compare
を利用する事で、テストを簡単に行う事ができます
例えば、{a: 1} == {a: 1}
としても {a: 1} === {a: 1}
としても結果はfalse
ですcompare({a: 1}, {a: 1})
はtrue
を返すことができます
例
var compare = require('cocotte-compare');
var target1 = {
a: 1,
b: 2,
c: [1, 2, 3]
};
var target2 = {
b: 2,
c: [1, 2, 3],
a: 1
};
// 自己循環
target1.d = target1;
target2.d = target2;
// クロス循環
target1.e = target2;
target2.e = target1;
console.log(compare(target1, target2)); // true
関数定義
{Boolean} compare({Mixed} value, {Mixed} compareTo, {Number} level)
- value: 比較する値
- compareTo: 比較対象の値
- level:
===
の比較に切り替える階層(省略可能)
levelを設定すると、オブジェクトのプロパティや配列の要素は===
で比較することができます
例えば、同じオブジェクトを順にもつ配列などを比較することができます
var x = {};
var y = {};
console.log(compare([x], [y])); // true
console.log(compare([x], [y], 1)); // false
ルール
- キャストは行いません。
compare(1, '1')
はfalse
です - プリミティブは値を比較します
valueOf
メソッドが自身を返さないオブジェクトはその値同士を比較し、プロパティの比較を行いません- オブジェクトの比較は、すべてのプロパティに対しルールを適用して一致する必要があります
- プロパティの追加順序は無視します
- 配列は、順序が一致し、それぞれの要素にルールを適用してすべて
true
である場合にtrue
です - 自己循環参照にも対応しています
0
と-0
との比較はtrue
ですnew
を使用して作成されたString
,Number
,Boolean
とプリミティブの値との比較はfalse
です- エラーオブジェクトは、プロトタイプと
message
プロパティの値が一致した場合にtrue
です - 関数は参照先が同じである場合にのみ
true
です - プロパティのenumerable,writable,configurableの設定が異なる場合も
false
です - プロパティのget,setはたとえコードが一緒でも関数が一致しない場合は
false
です - preventExtensions,seal,freezeされたオブジェクトとされていないオブジェクトとの比較は
false
です - level以上の階層の値は
===
で比較します