2012-04-29 2 views
3

나는 라이브러리에서 객체 참조의 유효성을 검사하는 간단한 함수를 가지고있다. (여기서 객체는 생성 된 HTML 요소에 대한 참조 인 DIV이다.) 그것은 다음과 같습니다참조 및 데이터 유형 검사는 동일합니까?

function varIsValidRef(aRef) { 
    return (!(aRef == null || aRef == undefined) && typeof(aRef) == "object"); 
} 

내가이 같은 효과가 있음을 발견 실험을하는 동안 : 나는 짧은 손() 시험에 대한 약간의 논란이있는 이해

function varIsValidRef(aRef) { 
    return (aRef) && typeof(aRef) == "object"; 
} 

를? 다양한 데이터 유형 (null, undefined, integer, float, string, array)에 대해 테스트하는 동안 최종 결과에 차이점을 찾을 수 없습니다. 이 함수는 예상대로 작동하는 것 같습니다.

이 두 버전이 완전히 똑같다고 말하는 것이 안전한가요?

+1

+1의이 다른 동안이 "null", null, "undefined", undefined

(aRef) 

의와 거짓로 평가된다. 내가 대답 할 수 있다고 생각 했어. 대신 혼자 혼란스러워했다. – Aidanc

+0

\t return (aRef) && typeof (aRef) == "object"&& (typeof (aRef.length) == "undefined")를 사용하면 더 흥미로워집니다. 허위 사실; –

답변

1

아니, 내 의견으로는 이러한 기능은 동일하게 작동하지 않습니다

첫 번째 옵션
aRef 경우가 undefined 또는 null 아니고 VAR의 종류가 true를 반환 object입니다.

두 번째 옵션
먼저 우리는 부울에 aRef을 변환합니다. null, undefined0과 같은 값은 false이되고 나머지는 true이됩니다. true (해당 값 중 하나가 아 T) 인 경우 유형이 오브젝트인지 점검합니다.

따라서 두 번째 옵션은 aRef0 인 경우 false를 반환합니다. 원하지 않는 경우입니다. 그리고 객체 나 문자열 또는 어떤 것이 부울과 같은지 검사하기 때문에 그것을 검사하는 우아한 방법이 아닙니다.

그리고 적어도 그들은 같은 것을 반환하지 않습니다.첫 번째 옵션은 부울을 반환하지만 두 번째 옵션은 (aRef)이 거짓 인 경우 함수에 넣어 값을 반환 자바 스크립트 falsy 값으로이 값을 사용하기 때문에

varIsValidRef(0); 
>>> 0 

varIsValidRef(''); 
>>> "" 

varIsValidRef(undefined); 
>>> undefined 

varIsValidref(null); 
>>> null 

당신이 반환 값의 차이를 볼 수 없습니다를 if 문이나 그런 식으로 사용하면됩니다.

첫 번째 옵션을 사용하는 것이 좋습니다.

+0

또한 유효한 객체로 배열을 제외하려고 시도하는 세 번째 버전이 있습니다 (테스트에서 다룰 수는 있지만) : return (aRef) && typeof (aRef) == "object"&& (typeof (aRef.length) == "정의되지 않음")? 허위 사실; –

0

그들은 같은 결과를 얻지 만 동일하지 않습니다.

첫 번째 함수는 false로 함께 계산 될 경우 더 엄격하거나 그렇지 않은 경우에는 해당 개체를 더 엄격하게 계산합니다.

aRef!false 여부 falsy 값 중이면 제 기능을 확인한다 (즉, [], null, undefined) 그렇지 않은 경우에 유형 오브젝트가 있는지 확인.

나는 첫 번째 함수를 더 선호한다. 왜냐하면 받아들이는 것이 더 엄격하기 때문이다. 그러나 최선을 다하는 함수가 모두 사용되어야한다면.

논란에 관해서는 방정식에서 거짓 값을 사용하는 방법과시기에 대해 신중해야하지만 그것이 원하는대로하는 것이 중요합니다. (그 때문에 당신은 어떤 거짓 값을 알아야합니다. 당신이 그것을 올바르게 구현하면 아무런 문제가 없어야합니다. 두 사람은 함께 모이기가 어렵습니다. 그래서 그걸로, 만약 네가하고 싶은 일을한다면, 더 많이 또는 더 적게, 꼭 그것을 사용하라.

0

흥미있는 경우에, 그러나 모두 완전히 다른를 임에도 불구하고 같은 방식으로 작동하는 것이 논리적 인 것 같다. 첫 번째 지점을 볼 수 있습니다. 여기

return (!(aRef == null || aRef == undefined) && typeof(aRef) == "object"); 

nullundefined 모두

는 경우 true를 반환 식 aRef 동일한 둘 중 여부 아니다하게는 ! 뿅와 결합 false 상태를 나타낸다 정의되지 않음.

1

그들은 강력하게 다르다 :

!(aRef == null || aRef == undefined) 

이 부분이 0, "", false, null, undefined, NaN