文笔不是很好,一直在博客园属于那种只看不说的那种,有次心血来潮,想把自己的一些心得记录下来,我认认真真写了大半个小时,谁知一点保存,会话超时然后我的东西不知道去哪里,当时想死的心都有,写博客也就没那个兴趣了。平常遇到问题可能就和周围的同事讨论下,然后就是发发贴 ,看有什么解决方案么,但这种情况不是很理想,提出的问题不知道是别人没看懂,还是我没表述清楚,发出去的问题就像肉包子打狗一样,没有了下文。下面进入今天的主题吧。

在js 判断相等常见的就是 == (等同)和===(恒等); 
    ==, 两边值类型不同的时候,要先进行类型转换,再比较 ;
    ===,不做类型转换,类型不同的一定不等。

例:
    var a = 3;
    var b = "3"; 
    a==b 返回 true
    a===b 返回 false 
   这个是基本类型相等的判断。

如果是对象的判断,那又会出现什么情况呢?

 var People = function (id, name) {
         
   this.id = id;
          
  this.name = name;
    
    } var a = new People("3","小肖");
var b = new People("3","小肖");
var c = a; console.log("对象相等判断:"+ (a==b));//false
console.log("对象相等判断:"+ (a==c));// true
console.log("对象相等判断:"+ (b==c)); //false
console.log("对象相等判断:"+ (a===c));// true

对象都是按地址进行传递的, 这里我就自认为他们对象和java,C#一样比的对象的地址是否相等?在java中我们比较两个对象的值是否相等使用的是equal的方式,最终比的是对象的hashcode 是否相等,如果相等就可判断两个对象时等同的。在js中没有这样的函数,自然想起能否自己写一个通用的函数来做判断,自然想到如下方法:

  var People = function (id, name) {
this.id = id;
this.name = name;
} People.prototype.equal = function (obj) {
if (obj instanceof People) {
var result = true;
for (k in this) {
if (this[k] != obj[k]) {
result = false;
break;
}
}
return result;
} else {
return false;
}
}
var a = new People("3", "小肖");
var b = new People("3", "小肖");
var c = a; console.log("对象相等判断a equal b:" + (a.equal(b))); //true

好像现在能满足我的要求了,但是这只是在最一般情况下。如我对 a 或者b 进行简单的修改

       a.value = 98; //对a 对象添加一个值,在java对象中显然不能这么做,但js中这样做不推荐,但并不排除 有人不这么干。
console.log("对象相等判断a equal b:" + (a.equal(b))); //false
delete a.value;
b.value = 98;
console.log("对象相等判断a equal b:" + (a.equal(b))); //true

在这种情况也许最简单的方式那 检查两个属性的长度是否相等就可以解决问题了,这样是可以解决问题,但是又有情况又出现了,请看

    var People = function (id, name, arr) {
this.id = id;
this.name = name;
this.group = arr;
} People.prototype.equal = function (obj) {
if (obj instanceof People) {
var result = true;
for (k in this) {
if (this[k] != obj[k]) {
result = false;
break;
}
}
return result;
} else {
return false;
}
}
var a = new People("3", "小肖", [1, 2]);
var b = new People("3", "小肖", [1, 2]);
console.log("对象相等判断a equal b:" + (a.equal(b))); //false

当对象的字段 不是基本类型,而是对象,这个时候又不相等了。本来值是相等的,我们期待的结果是返回true。这个时候可能又会想到的解决方案是我们再进行类型判断。
如果是Object类型,或者数组等(即对象类型),我们再采用递归的方式来重复调用自己来做判断。这好像也行。但这样做是不是有点把问题搞复杂了,有么有更好的思路或者方法来解决这个问题呢?

js 判断对象相等的更多相关文章

  1. Js判断对象是否为空,Js判断字符串是否为空

    Js判断对象是否为空,Js判断字符串是否为空,JS检查字符串是否为空字符串 >>>>>>>>>>>>>>>&g ...

  2. JS判断对象是否存在的方法

    Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: ...

  3. js判断对象是否为空

    /** *判断对象是否为空 * * @param e * @returns {Number} */function isEmptyObject(e) { var t; for (t in e) ret ...

  4. js判断对象数组中是否存在某个对象

    1. 如果要判断数组中是否存在某个元素的话很好判断,直接用数组的indexOf方法就好,存在返回当前索引不存在返回-1 var arr=[1,2,3,4] arr.indexOf(3) arr.ind ...

  5. js判断对象是否为数组

    1.ECMAScript5中有一个现成的方法:Array.isArray(). var obj = {1:[1],2:[2]}, arr = [1], str = "1"; Arr ...

  6. js 判断对象类型

    在企业级的开发中,我们常用 typeof 来判断企业 对象类型:但是 typeof 不能判断 Array 和 null 这里我们使用一个 原型上的 toString方法:请看一下代码: <scr ...

  7. Js判断对象是否是数组的方法

    1.ECMAScript5中有一个现成的方法:Array.isArray(). var obj = {1:[1],2:[2]}, arr = [1], str = "1"; Arr ...

  8. js判断对象中是否存在某一项和判断是否是对象

    1.判断是否为对象 let str = { name: '第一', age: 12 } console.log(typeof str== "object") 2.判断对象中是否有某 ...

  9. js 判断对象是否为空

    利用JSON.stringify var objData = {};JSON.stringify(objData) ==="{}" // true 第二种用原声js 方法 Obje ...

随机推荐

  1. centos下安装usb摄像头驱动

    centos安装在虚拟机下,win7下能正常使用摄像头. 虚拟机显示监测到摄像头,但驱动安装失败. terminal下输入yum install cheese,提示是否安装,输入y确认下载,大概100 ...

  2. 在 CentOS 里安装 BIND-UTILS 以使用 DIG、HOST 和 NSLOOKUP

    想用一下 dig 指令来进行域名设置的查询,结果 CentOS 提示没有此指令,然后想当然的以为就需要安装 DIG 软件包,可是查了查才知道实际上 dig.host.nslookup 这几个指令都在 ...

  3. Windows Kernel Way 扉言

    七年寒窗,但求一道. 笔者在学习windows/linux以及各类编程语言.框架之初因摸不到门路而磕磕绊绊,因寻不到明师而步履蹒跚,或不知缘从何起,或不知路在何处,只能尝试.回溯.重来.反反复复,竟也 ...

  4. NSURLSession的使用(1)

    一.创建一个Session,并且对其进行初始化 包含三种创建方式:   1.+ (NSURLSession *)sharedSession  单例模式 2.+ (NSURLSession *)sess ...

  5. Cocos2d-x如何控制动作速度

    基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变.但这样的改变速度匀速的.线性的.通过ActionEase及其的派生类和Speed 类我们可以使精灵以非匀速或非线性速度运动,这样看起了效果更 ...

  6. ASP.NET MVC 路由进阶(之二)--自定义路由约束

    3.自定义路由约束 什么叫自定义路由约束呢?假如路由格式为archive/{year}/{month}/{day},其中year,month,day是有约束条件的,必须是数字,而且有一定范围. 这时候 ...

  7. will VS be going to

    1.Future - Will vs. Going to 2."Will be doing" vs. "will do" 3.Simple Future

  8. 比较X与Y的大小,绝对精准!!!!!!

    代码! #include<stdio.h> int max(int a,int b) { int x; x=a+b; return x; } int main() { int i,n,t; ...

  9. .Net Core 中的包、元包与框架(Packages, Metapackages and Frameworks)

    包,元包与框架 本文翻译自 Packages, Metapackages and Frameworks. .Net Core 是一种由 NuGet 包组成的平台.一些产品体验受益于代码包的细粒度定义, ...

  10. 对C#调用C++ dll文件进行总结

    在实际项目工作中,经常用到C#调用C++ 或者C编写的dll文件. dll支持一般函数声明和类的定义声明,但是一般为了简化,都是 采用函数声明的方式.这里主要并不是写 dll的编写. 先在vs中创建一 ...