cocotte-compare

0.5.1 • Public • Published

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以上の階層の値は===で比較します

Readme

Keywords

Package Sidebar

Install

npm i cocotte-compare

Weekly Downloads

1

Version

0.5.1

License

MIT

Last publish

Collaborators

  • yukik