JavaScript의 Typeof는 실제로 매우 복잡합니다. 많은 작업을 수행하는 데 사용할 수 있지만 이 문서에는 다양한 용도가 나열되어 있으며 기존 문제와 해결 방법도 나와 있습니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FOperators%2Ftypeof
> 정의되지 않은 유형
'한정되지 않은'
> typeof null // 잘 알려진 버그
'물체'
> true 유형
'부울'
>123의 유형
'숫자'
> "abc" 유형
'끈'
> 함수 유형() {}
'기능'
> {} 유형
'물체'
>유형[]
'물체'
> 알 수 없는 변수 유형
'한정되지 않은'
1. 변수가 존재하는지, 값이 있는지 확인하세요.
typeof는 변수가 선언되지 않은 경우와 변수의 값이 정의되지 않은 경우라는 두 가지 상황에서 "정의되지 않음"을 반환합니다.
> undeclaredVariable 유형 === "정의되지 않음" true > var 선언된 변수
값이 정의되지 않았는지 여부를 감지하는 다른 방법이 있습니다.
> var 값 = 정의되지 않음; > 값 === 정의되지 않음 true
그러나 이 메소드가 선언되지 않은 변수에 사용되면 예외가 발생합니다. 왜냐하면 typeof만이 오류 보고 없이 일반적으로 선언되지 않은 변수를 감지할 수 있기 때문입니다.
> undeclaredVariable === 정의되지 않음 ReferenceError: undeclaredVariable이 정의되지 않았습니다.
참고: 초기화되지 않은 변수, 전달된 매개변수가 없는 형식 매개변수 및 존재하지 않는 속성에는 항상 액세스할 수 있고 값이 항상 정의되지 않기 때문에 위의 문제가 발생하지 않습니다.
> var 선언된 변수; > 선언된 변수 === 정의되지 않음 true > (function (x) { return x === 정의되지 않음 }()) true > ({}).foo === 정의되지 않음 true
번역자 참고 사항: 따라서 선언되지 않은 전역 변수의 존재를 검색하려는 경우 if(window.maybeUndeclaredVariable){}를 사용할 수도 있습니다.
문제: typeof는 이러한 작업을 수행하기가 번거롭습니다.
해결책: 이러한 종류의 작업은 흔하지 않으므로 더 나은 해결책을 찾을 필요가 없다고 생각하는 사람들도 있습니다. 그러나 누군가는 특별한 연산자를 제안할 수도 있습니다.
> undeclaredVariable false를 정의했습니다. > varclaredVariable을 정의했습니다. false;
또는 변수가 선언되었는지 여부를 감지하는 연산자가 필요할 수도 있습니다.
> undeclaredVariable false로 선언됨 > var declaredVariable > 선언된 변수 true로 선언됨;
번역자 주: Perl에서 위에 정의된 연산자는 Defined()와 동일하고, 위에서 선언된 연산자는 presents()와 동일합니다.
2. 값이 정의되지 않음 또는 null이 아닌지 확인합니다.
문제: 값이 정의되었는지 확인하려는 경우(값이 정의되지 않았거나 null이 아님) typeof의 가장 유명한 단점(버그로 간주됨) 중 하나에 직면하게 됩니다. typeof null은 "객체"를 반환합니다.
> null '객체' 유형
번역가의 참고 사항: 이는 원래 JavaScript 구현의 버그라고 할 수 있으며, 이는 이제 표준이 표준화된 방식입니다. V8은 한 번 수정되어 typeof null === "null"을 구현했지만 궁극적으로는 실행 불가능하다는 것이 입증되었습니다. //wiki .ecmascript.org/doku.php?id=harmony:typeof_null
해결책: 이 작업에는 typeof를 사용하지 말고 대신 다음과 같은 함수를 사용하십시오.
function isDefined(x) { return x !== null && x !== 정의되지 않음 }
또 다른 가능성은 "기본값 연산자"를 도입하는 것입니다. 여기서 다음 표현식은 myValue가 정의되지 않은 경우 defaultValue를 반환합니다.
myValue ??
위의 표현식은 다음과 동일합니다.
(myValue !== 정의되지 않음 && myValue !== null) ? myValue : defaultValue
또는:
myValue ??= defaultValue
실제로 이는 다음 설명을 단순화한 것입니다.
myValue = myValue ??
bar와 같은 중첩 속성에 액세스할 때 다음 연산자의 도움이 필요할 수 있습니다.
obj.foo.bar
obj 또는 obj.foo가 정의되지 않은 경우 위의 표현식은 예외를 발생시킵니다. 연산자.??를 사용하면 정의되지 않은 속성 또는 null인 속성을 계층별로 탐색할 때 발견된 첫 번째 값을 반환할 수 있습니다.
obj.??foo.??bar
위의 표현식은 다음과 동일합니다.
(obj === 정의되지 않음 || obj === null) ? obj : (obj.foo === 정의되지 않음 || obj.foo === null) ?
3. 객체값과 원시값 구별
다음 함수는 x가 객체 값인지 테스트합니다.
function isObject(x) { return (typeof x === "함수" || (typeof x === "object" && x !== null));
문제: typeof는 함수와 객체를 다른 유형으로 간주하고 typeof null은 "객체"를 반환하기 때문에 위의 감지가 복잡합니다.
해결 방법: 다음 방법은 개체 값을 검색하는 데 자주 사용됩니다.
function isObject2(x) { return x === Object(x) }
경고: 여기서는 object 인스턴스를 사용하여 감지할 수 있다고 생각할 수 있지만, 인스턴스 오브는 개체의 프로토타입을 사용하여 인스턴스 관계를 결정하므로 프로토타입이 없는 개체는 어떻게 되나요?
> var obj = Object.create(null) > Object.getPrototypeOf(obj) null
obj는 실제로 객체이지만 어떤 값의 인스턴스도 아닙니다.
> typeof obj 'object' > obj 인스턴스of Object false
실제로 이러한 개체는 거의 접할 수 없지만 존재하며 용도가 있습니다.
번역자 주: Object.prototype은 기본적으로 존재하는 객체이며 프로토타입이 없습니다.
>Object.getPrototypeOf(Object.prototype)null>typeof Object.prototype'object'>Object.prototype 인스턴스of 객체 false
4.원시값의 종류는 무엇인가요?
typeof는 기본 값의 유형을 확인하는 가장 좋은 방법입니다.
> "abc" '문자열' 유형 > 정의되지 않은 '정의되지 않음' 유형
문제: null 유형의 이상한 동작을 알고 있어야 합니다.
> typeof null // '객체'를 조심하세요!
해결책: 다음 함수는 이 문제를 해결할 수 있습니다(이 사용 사례에만 해당).
function getPrimitiveTypeName(x) { var typeName = typeof x; switch(typeName) { 케이스 "정의되지 않음": 케이스 "부울": 케이스 "문자열": 케이스 "객체": if (x == = null) { return "null"; } default: // 전달된 이전 판단 중 없음 new TypeError("매개변수가 기본 값이 아닙니다: "+x) }
더 나은 해결책: 원래 값의 유형을 반환하는 것 외에도 객체 값의 내부 [[Class]] 속성을 반환할 수 있는 함수 getTypeName()을 구현합니다. 다음은 이 함수를 구현하는 방법입니다. jQuery $.type은 그러한 구현입니다)
5. 특정 값이 함수인지 여부
typeof는 값이 함수인지 여부를 감지하는 데 사용할 수 있습니다. > typeof function () {} 'function' > typeof Object.prototype.toString 'function'
원칙적으로 인스턴스 오브 함수는 또한 이 요구 사항을 감지할 수 있습니다. 언뜻 보기에는 쓰기 방법이 더 우아해 보이지만 브라우저에는 특이한 점이 있습니다. 즉, 각 프레임과 창에는 자체 전역 변수가 있습니다. 객체가 다른 프레임워크에 전달되면 두 프레임워크의 생성자가 다르기 때문에 인스턴스가 제대로 작동하지 않습니다. 이것이 ECMAScript 5에 Array.isArray() 메소드가 있는 이유입니다. 객체가 주어진 생성자의 인스턴스인지 확인하는 프레임워크 간 메소드가 있다면 좋을 것입니다. 위의 getTypeName()은 사용 가능한 해결 방법입니다. 그러나 보다 근본적인 해결책이 있을 수 있습니다.
6.개요
언급된 다음은 현재 JavaScript에서 가장 시급하게 필요한 기능이어야 하며 typeof가 현재 담당하는 기능적 기능 중 일부를 대체할 수 있습니다.
isDefined()(예: Object.isDefined()): 함수 또는 연산자로 사용할 수 있습니다.
isObject()
getTypeName()
객체가 지정된 생성자의 인스턴스인지 여부를 감지하기 위한 프레임워크 간 메커니즘
변수가 선언되었는지 여부를 확인하기 위해 자체 연산자가 필요하지 않을 수도 있습니다.