比较JavaScript中的类型、值和对象(不是重复)

比较JavaScript中的类型、值和对象(不是重复),javascript,recursion,types,javascript-objects,Javascript,Recursion,Types,Javascript Objects,编辑:这不是重复的问题。 我的函数不同,不使用直接对象比较方法 在第四章中,最后一个练习需要一个函数deepEqual,它接受两个参数并比较它们 如果参数是不同的类型,则应返回false 如果参数的类型和值相同,则应返回true 否则,返回false 如果参数都是对象,则应比较它们的属性和值。如果两个对象具有相同顺序的相同属性和值,则函数调用应返回true。例如,如果我们有以下对象:object1={a:1,b:2},object2={a:1,b:2},object3={a:2,b:1},比较

编辑:这不是重复的问题。 我的函数不同,不使用直接对象比较方法

在第四章中,最后一个练习需要一个函数deepEqual,它接受两个参数并比较它们

  • 如果参数是不同的类型,则应返回false
  • 如果参数的类型和值相同,则应返回true 否则,返回false
  • 如果参数都是对象,则应比较它们的属性和值。如果两个对象具有相同顺序的相同属性和值,则函数调用应返回true。例如,如果我们有以下对象:
    object1={a:1,b:2},object2={a:1,b:2},object3={a:2,b:1}
    ,比较object1和object2应该返回true,但比较object1和object3应该返回false
  • 最后,如果对象具有嵌套对象作为参数,则会递归调用deepEqual来比较嵌套对象
所以,这是我的解决方案。它与if/else语句非常复杂,请原谅。

功能相等(obj1、obj2){
var checkForSameTypes=(obj1的类型==obj2的类型);
如果(checkForSameTypes===true){
//同一类型但不是对象
if(obj1的类型!=“对象”&&obj2的类型!=“对象”){
如果(obj1==obj2){
返回true;
}否则{
返回false;
}
//相同类型和对象
}否则如果(对象类型J1==“对象”和对象类型J2==“对象”){
//循环第一个对象并将属性与第二个对象进行比较
用于(obj1中的var prop){
如果(对象J2.hasOwnProperty(属性)){
//如果第二个对象具有属性“prop”,则比较
if(obj1[prop]==“对象”的类型和obj2[prop]==“对象”的类型){
//递归调用
深度相等(obj1[prop],obj2[prop]);
}否则如果(obj1[prop]==obj2[prop]){
//循环继续到下一个属性
继续;
}否则如果(obj1[prop]!==obj2[prop]){
返回false;
} 
//它没有属性“prop”,因此返回false
}否则{
返回false;
}
}
//完成循环,所有属性都相同
返回true;
}
//它们的类型不同,因此返回false
}否则{
返回false;
}
}
问题

除非参数是具有嵌套对象的对象,否则该函数工作正常。 以这些对象为例

var type={go:{inside:“yes”},come:2}
var see={go:{inside:“no”},come:2}
var fine={when:3,go:4}`
当我将
type
see
与调用
deepEqual(type,see)进行比较时
,返回
true
,这是错误的,因为嵌套对象
go
的属性值不同

我已经在纸上一行一行地浏览了整个代码,不知道我必须做什么,或者递归调用不能正确地比较属性,或者我还不知道该怎么做

有人能提供解决方案吗?或者,如果可能的话,还有一个更好的方法或思维过程来解决这个问题


注意:代码仅比较对象属性和值。它不需要比较构造函数或原型。

有许多技术可以进行深入的对象比较,但最可靠的可能也是最简单的。。。在每个要比较的对象上使用,将它们转换为字符串,然后比较字符串

var a={go:{inside:“yes”},come:2,flag:true}
var b={go:{inside:“yes”},come:2,flag:true}
var c={go:{inside:“yes”},come:1}
var d={go:{inside:“yes”},come:2,标志:“true”}
功能相等(obj1、obj2){
//将两个对象转换为字符串并进行比较:
log(JSON.stringify(obj1)==JSON.stringify(obj2));
}
深度相等(a,b);//真的
深度相等(b,c);//假的

深度相等(a,d);//错误的< /代码>问题是,它将考虑<代码> {:1,b:1 } <代码>不同于<代码> {b:1,a:1 },忽略任何在JSON中不可表示的嵌套对象,如<代码> SET>代码>,<代码> MAP>代码>……等@ @ TrimCOOT点。你好,史葛,谢谢这个答案,不幸的是,我不允许使用类似的抽象,例如
JSON.stringify()
。但不能重复。我的问题完全不同