반복하는 동안 객체나 배열의 요소는 임의의 값일 수 있다는 점에 유의해야 합니다. 기본 유형 값, 객체, 배열 외에도 이 값은 메서드, DOM 객체 또는 창 객체일 수도 있습니다. 일부 참조 유형은 반복할 수 없으며 분기 판단이 필요하다는 것을 확인했습니다. 코드는 다음과 같습니다.
코드 복사 코드는 다음과 같습니다. 다음과 같습니다:
함수 비교(a,b){
var
pt = /undefine|number|string|boolean/,
fn = /^(함수*) (w *b)/,
cr = "생성자",
cn = "childNodes",
pn = "parentNode",
ce = 인수.callee
if(pt. test( typeof a) || pt.test(typeof b) || a === null || b === null){
return a === b || )) ; //편의상 NaN == NaN
}
if(a[cr] !== b[cr]){
return false
}
switch( a[cr]){
case 날짜: {
return a.valueOf() === b.valueOf()
}
case 함수: {
return a.toString ().replace(fn,'$1') === b.toString().replace(fn,'$1'); //하드 코딩에서 함수가 선언되는 방식은 toString의 결과에 영향을 미칩니다. 이므로 일반 형식을 사용하세요
};
case Array : {
if(a.length !== b.length){
return false
}
for(var i =0;i< ;a.length;i ){
if(!ce(a[i],b[i])){
return false
}
}
break; ;
};
기본값: {
var alen = 0, d
if(a === b){
return
}
if(a [cn] || a[pn] || b[cn] || b[pn]){
return a === b
}
for(d in a) {
alen
}
for(d in b){
blen
}
if(alen !== blen){
return false; }
for(d in a){
if(!ce(a[d],b[d])){
return false;
}
}
break;
} ;
}
return true;
}
console.log(compare({},{a:1})) //false
console.log(compare ({a: 1},{b:2})); //false
console.log(비교({b:2,a:1},{a:1,b:2})) / /true
console.log(compare({a:function(){return false;},b:2},{a:function(){return false;},b:2}));
console .log(compare([],[])); //true
console.log(compare([2,1],[1,2])) //false
console .log(비교(function(){alert(1)},function(){})); //false
console.log(compare(function aaa(){alert(1)},function(){ Alert(1) })); //true
console.log(compare(document.getElementsByTagName("a")[0],document.getElementsByTagName("a")[1])) //false
console.log(compare(document.getElementsByTagName("a")[0],document.getElementsByTagName("a")[0])); //true