JavaScriptでは、二つのオブジェクトが同じかどうかをどう判断しますか?

3264 ワード

はじめに、二つのオブジェクトが同じかどうかをどう判断しますか?
二つのObjectタイプのオブジェクトは、同じ属性、同じ値を持っていても、==または==を使って比較すると、同じとは思えません.これは彼らが引用(メモリ内の位置)で比較しているので、基本タイプとは違って値で比較しているからです.
var obj1 = {
    name: "xiaoming",
    sex : "male"
}
 
var obj2 = {
    name: "xiaoming",
    sex : "male"
}
 
console.log(obj1 === obj2); // false
しかし、浅いコピーが同じメモリを指している場合、この時は2つのオブジェクトが同じです.
var obj1 = {
    name: "xiaoming",
    sex : "male"
};
 
var obj2 = {
    name: "xiaoming",
    sex : "male"
};
 
var obj3 = obj1;
 
console.log(obj1 === obj3); // true
 
console.log(obj2 === obj3); // false

あなたが考えているように、オブジェクトの値が等しいことを確認します.私たちは基本的に遍歴するオブジェクトの属性ごとに、それらが同じかどうかを確認します.

/*
 * @param x {Object}   1
 * @param y {Object}   2
 * @return  {Boolean} truefalse    
 */
var deepEqual = function (x, y) {
  //        
  if (x === y) {
    return true;
  }
  else if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
    if (Object.keys(x).length != Object.keys(y).length)
      return false;

    for (var prop in x) {
      if (y.hasOwnProperty(prop))
      {  
        if (! deepEqual(x[prop], y[prop]))
          return false;
      }
      else
        return false;
    }

    return true;
  }
  else 
    return false;
}
この簡単な実現は私たちの例に適用されるが、多くの場合、処理できない.たとえば:
  • この属性値の一つがオブジェクトである場合ですか?
  • 属性値の一つがNaNである場合(JavaScriptでは、自分の唯一の価値に等しいですか?
  • )
  • 属性の値がundefinedの場合、他のオブジェクトはこの属性がない(したがって、計算結果は不確定?)
  • .
    結語:
    検査対象の「値が等しい」という強力な方法は、最適なテストライブラリに依存して、様々な境界状況をカバーしています.
    最後にUnderscoreのソースアドレスを添付します.githb.com/hanzchi/un…
    読んでいただいてありがとうございます.この文章があなたの役に立つことを願っています.以上に足りないところがあります.コメントエリアでよろしくお願いします.
    転載先:https://juejin.im/post/5c948c41e51d451606692b30