2011-12-15 2 views
2

함수, 객체 또는 배열 일 수있는 변수가 있다고 가정 해 봅시다.자바 스크립트 : 변수가 함수, 배열 또는 객체인지 확인하는 가장 효율적인 방법

나는 그것을 결정하는 가장 효율적인 방법을 찾고 싶습니다.

나는 다른 변수 (isArray, isObject)를 계산하고 싶지 않다는 것을 알고 있기 때문에 다음과 같은 방법으로 최적화되지 않았다고 생각합니다. isFunction = true;

리소스를 최적화하기 위해 계산하는 순서는 무엇입니까? 은 3 항 연산을 사용합니까?

var isFunction, 
    isArray, 
    isObject; 

var obj = function() {}; 

isFunction = (typeof obj === "function") ? true : false; 
isArray = (obj.length > 0) ? true : false; 
isObject = (typeof obj === "object") ? true : false; 

console.log(isFunction , isArray , isObject); // true, false, false (the good way) 
console.log(isFunction , isArray , isObject); // true, undefined, undefined 
+3

왜 []이 (가) 배열이 아니라고 생각합니까? 또한, 당신은'? true : false'. – SLaks

+0

''불확실성 '을 파싱 할 때'undefined','null','<1','NaN'은 모두'false'와 같습니다. 네가 원하는 걸 이해하지 못한다 ... 좀 더 자세하게 말 해주세요. –

+1

왜 당신은 그것을 알아야합니까? JavaScript는 강력한 형식의 언어는 아닙니다. 왜 상황을 점검하고 객체 *가 당신이 기대하는 종류의 객체처럼 보이는지 확인하는 것이 어떻습니까? – Pointy

답변

2

나는 이것이 "효율적"이라고 말할 수 있습니다. 그것은 짧지 만 읽을 만하며 올바르게 작업해야합니다. some의 기본 구현을 가진 최신 브라우저에서는 성능이 좋고 some의 특성은 배열의 항목 중 하나가 조건을 충족 할 때까지 콜백 만 실행하는 것과 같습니다.

이전 브라우저의 경우 Array.prototype.some을 추가했는지 확인하십시오.

function isOneOf(obj, types) { 
    var type; 
    type = Object.prototype.toString.call(obj); 
    return types.split(' ').some(function (t) { 
    return type.indexOf(t) > -1; 
    }); 
} 

isOneOf({}, 'Array Object Function'); 

Array, Date, Error, Function, Null, Number, Object, StringUndefined을 위해 일해야한다. 모든 유형의 브라우저를 통한 철저한 크로스 브라우저 테스트를 수행하지는 않았으므로 사전에 적절한 단위 테스트를 수행해야합니다.

0

다음 함수는 배열, 기능 도장 툴킷 테스트 등

isString = function(it){ 
    return (typeof it == "string" || it instanceof String); // Boolean 
}, 

isArray = function(it){ 
    return it && (it instanceof Array || typeof it == "array"); // Boolean 
}, 

isFunction = function(it){ 
    return opts.call(it) === "[object Function]"; 
}, 

isObject = function(it){ 
    return it !== undefined && 
     (it === null || typeof it == "object" || lang.isArray(it) || lang.isFunction(it)); // Boolean 
}, 

isArrayLike = function(it){ 
    return it && it !== undefined && // Boolean 
     // keep out built-in constructors (Number, String, ...) which have length 
     // properties 
     !lang.isString(it) && !lang.isFunction(it) && 
     !(it.tagName && it.tagName.toLowerCase() == 'form') && 
     (lang.isArray(it) || isFinite(it.length)); 
}, 

나는 이러한 종류의 코드를 최적화하기 위해 노력하는 점을 볼 수 없습니다 어떻게 방법입니다. 최적화에 대해 정말로 신경을 쓰면 이러한 검사가 필요하지 않은 단순한 오버로드되지 않는 함수를 사용해야합니다.

관련 문제