웹 프론트엔드 JS 튜토리얼 JavaScript typeof의 목적

JavaScript typeof의 목적

Nov 26, 2016 pm 04:07 PM
JavaScript

JavaScript의 Typeof는 실제로 많은 작업에 사용될 수 있지만 이상한 동작도 많이 합니다. 이 문서에서는 다양한 용도를 나열하고 기존 문제와 해결 방법도 지적합니다.

이 글을 읽는 전제는 이제 원시값과 객체값의 차이를 알아야 한다는 것입니다.

변수가 존재하는지, 값이 있는지 확인

typeof는 두 가지 경우에 "정의되지 않음"을 반환합니다.

변수가 선언되지 않았습니다

변수의 값이 정의되지 않았습니다

예:

> 선언되지 않은 변수 유형 === "정의되지 않음"

> var 선언된 변수

> 🎜>'undefine'

> typeof undefine

'undefine'

값이 정의되지 않았는지 여부를 감지하는 다른 방법이 있습니다.

> var value = undefine;

> value === undefine

true

그러나 이 방법을 사용하는 경우 선언되지 않은 변수에 있는 경우 예외가 발생합니다. 왜냐하면 typeof만이 일반적으로 오류 보고 없이 선언되지 않은 변수를 감지할 수 있기 때문입니다.

>

ReferenceError: undeclaredVariable이 정의되지 않았습니다

참고: 초기화되지 않은 변수, 매개 변수로 전달되지 않은 형식 매개 변수 및 존재하지 않는 속성은 항상 액세스 가능하므로 위의 문제가 발생하지 않습니다. 값은 다음과 같습니다. 항상 정의되지 않음:

> var 선언된 변수;

> 선언된 변수 === 정의되지 않음

true

> (함수 (x) { return x === 정의되지 않음 }())

true

> 정의되지 않음

true

번역자 참고 사항: 따라서 선언되지 않은 전역 변수의 존재를 검색하려면 if(window.maybeUndeclaredVariable){}를 사용할 수도 있습니다.

문제: typeof가 이러한 작업을 완료할 때 매우 복잡해 보입니다.

해결 방법: 이러한 작업은 흔하지 않기 때문에 일부 사람들은 더 나은 솔루션을 찾을 필요가 없습니다. 하지만 누군가가 특별한 연산자를 제안할 수도 있습니다:

> 🎜>

> 선언된 변수

false

또는 변수가 선언되었는지 감지하기 위해 연산자가 필요할 수도 있습니다.

> ; 선언되지 않은 변수

false

> 선언된 변수

true

번역자 주: Perl에서 위에 정의된 연산자는 Defined()와 동일하고, 위에서 선언된 연산자는 presents()와 동일합니다.

값이 정의되지 않음 또는 null이 아닌지 확인

질문: 값이 정의되었는지 여부를 감지하려는 경우(값이 정의되지 않음 또는 null이 아님) ), 그런 다음 typeof의 가장 유명한 이상한 표현 중 하나를 발견했습니다(버그로 간주됨): typeof null은 "object"를 반환합니다:

> typeof null

' object'

역자 주: 이는 원래 JavaScript 구현의 버그라고만 말할 수 있으며 이것이 현재 표준이 규제되는 방식입니다. V8은 한때 null === "null" 유형을 수정하고 구현했지만 결국 실행 불가능하다는 것이 입증되었습니다. http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null.

(주석: typeof는 null에서 작동할 때 "객체"를 반환합니다. 이는 JavaScript 언어 자체의 버그입니다. 안타깝게도 이 버그는 기존 버그가 너무 많기 때문에 절대 수정되지 않습니다. 코드는 이미 이 동작에 의존합니다. 그러나 null이 객체입니까? stackoverflow에 이 문제에 대한 토론이 있습니다: http://stackoverflow.com/questions/801032/null-object-in-javascript/7968470#7968470 @justjavac) 🎜>

해결책: 이 작업을 수행하려면 typeof를 사용하지 말고 대신 다음 함수를 사용하십시오.

function isDefined( x) {

return x !== null && x !== undefine;

}

또 다른 가능성은 myValue가 정의되지 않은 경우 다음 표현식에서 "기본값 연산자"를 도입하는 것입니다. defaultValue를 반환합니다:

myValue ?? defaultValue

위 표현식은 다음과 같습니다.

(myValue !== 정의되지 않은 && myValue !== null) ? myValue : defaultValue

또는:

myValue ??= defaultValue

는 실제로 다음을 단순화한 것입니다. 명령문:

myValue = myValue ?? defaultValue

bar와 같은 중첩 속성에 액세스할 때 다음 연산자의 도움이 필요할 수 있습니다.

obj.foo.bar

obj 또는 obj.foo가 정의되지 않은 경우 위 표현식에서는 예외가 발생합니다. 연산자.??를 사용하면 위 표현식이 레이어별로 속성을 탐색할 때 값이 정의되지 않거나 null인 첫 번째 발견된 속성을 반환할 수 있습니다.

obj .??foo.??bar

위 표현식은 다음과 동일합니다:

(obj === 정의되지 않음 || obj === null) ?

: (obj.foo === 정의되지 않음 || obj.foo === null) ? obj.foo

: obj.foo.bar

는 객체 값을 구별합니다. 및 기본 값

다음 함수는 x가 객체 값인지 확인하는 데 사용됩니다.

function isObject(x) {

return (typeof x === "function"

|| (typeof x === "object" && x !== null));

}

문제: 위 이는 typeof가 함수와 객체를 다른 유형으로 취급하고 typeof null이 "객체"를 반환하기 때문입니다.

해결 방법: 객체 값을 감지하는 데에도 종종 사용되는 방법이 있습니다. :

function isObject2(x) {

return x === Object(x);

}

경고: 여기서는 object를 감지하는 데 사용할 수 있다고 생각할 수도 있지만, object의 프로토타입을 사용하여 인스턴스 관계를 결정합니다. 따라서 프로토타입이 없는 개체는 어떻게 해야 할까요?

> obj = Object.create(null);

> Object.getPrototypeOf(obj)

null

obj는 실제로 객체이지만 어떤 인스턴스도 아닙니다. 값:

> obj 유형

'객체'

> obj 인스턴스

false

실제로는 그러한 개체를 거의 접하지 못할 수 있지만 존재하며 목적이 있습니다.

번역자 주: Object.prototype은 프로토타입이 없는 유일한 내장 개체입니다.

>Object.getPrototypeOf(Object.prototype)

null

>typeof Object.prototype

'객체'

>Object.prototype instanceof Object

false

기본 값의 유형은 무엇입니까?

typeof는 기본 값 유형을 보는 데 가장 적합합니다. .

> typeof "abc"

'문자열'

> 정의되지 않음

'정의되지 않음'

문제: null 유형의 이상한 동작을 알고 있어야 합니다.

> typeof null // 조심하세요!

'object'

해결 방법: 다음 함수를 사용하면 이 문제를 해결할 수 있습니다(이 용도로만 사용). 사례).

function getPrimitiveTypeName(x) {

var typeName = typeof x;

switch(typeName) {

케이스 "정의되지 않음 ":

케이스 "부울":

케이스 "번호":

케이스 "문자열":

return typeName;

사례 "객체":

             if (x === null) {

                                              ~ > | "+x);

}

}

더 나은 솔루션 해결책: 원래 값의 유형을 반환하는 것 외에도 getTypeName() 함수를 구현합니다. 객체 값의 내부 [[클래스]] 속성을 반환합니다. 이 함수를 구현하는 방법은 다음과 같습니다(역자 주: jQuery의 $.type이 그러한 구현입니다)

특정 값이 함수인지

typeof를 사용할 수 있습니다. 값이 함수인지 테스트합니다.

> typeof 함수() {}

'function'

> typeof Object.prototype.toString

' function'

원칙적으로 instanceof Function도 이 요구 사항을 감지할 수 있습니다. 언뜻 보면 글쓰기 방식이 더 우아해 보이는 것 같습니다. 그러나 브라우저에는 특이한 점이 있습니다. 모든 프레임과 창에는 자체 전역 변수가 있습니다. 따라서 한 프레임에서 다른 프레임으로 객체를 전달하는 경우 두 프레임의 생성자가 다르기 때문에 인스턴스가 제대로 작동하지 않습니다. 이것이 ECMAScript5에 Array.isArray() 메소드가 있는 이유입니다. 객체가 주어진 생성자의 인스턴스인지 여부를 확인하는 프레임워크 간 방법이 있다면 좋을 것입니다. 위의 getTypeName()은 사용 가능한 해결 방법이지만 보다 근본적인 해결 방법이 있을 수 있습니다.

개요

언급된 다음은 현재 JavaScript에서 가장 시급한 요구사항이며 typeof가 현재 담당하는 기능적 특징 중 일부를 대체할 수 있습니다.

isDefined()(예: Object.isDefined()): 함수 또는 연산자로 사용할 수 있습니다.

isObject()

getTypeName()

객체가 지정된 생성자의 인스턴스인지 여부를 감지하는 프레임워크 간 메커니즘

특정 변수가 선언되었는지 여부를 확인하십시오. 자체 연산자가 필요하지 않을 수도 있습니다.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

JavaScript로 문자열 문자를 교체하십시오 JavaScript로 문자열 문자를 교체하십시오 Mar 11, 2025 am 12:07 AM

JavaScript 문자열 교체 방법 및 FAQ에 대한 자세한 설명 이 기사는 JavaScript에서 문자열 문자를 대체하는 두 가지 방법 인 내부 JavaScript 코드와 웹 페이지의 내부 HTML을 탐색합니다. JavaScript 코드 내부의 문자열을 교체하십시오 가장 직접적인 방법은 대체 () 메소드를 사용하는 것입니다. str = str.replace ( "find", "replace"); 이 메소드는 첫 번째 일치 만 대체합니다. 모든 경기를 교체하려면 정규 표현식을 사용하고 전역 플래그 g를 추가하십시오. str = str.replace (/fi

자신의 Ajax 웹 응용 프로그램을 구축하십시오 자신의 Ajax 웹 응용 프로그램을 구축하십시오 Mar 09, 2025 am 12:11 AM

그래서 여기 당신은 Ajax라는이 일에 대해 배울 준비가되어 있습니다. 그러나 정확히 무엇입니까? Ajax라는 용어는 역동적이고 대화식 웹 컨텐츠를 만드는 데 사용되는 느슨한 기술 그룹을 나타냅니다. 원래 Jesse J에 의해 만들어진 Ajax라는 용어

10 JQuery Fun 및 Games 플러그인 10 JQuery Fun 및 Games 플러그인 Mar 08, 2025 am 12:42 AM

10 재미있는 jQuery 게임 플러그인 웹 사이트를보다 매력적으로 만들고 사용자 끈적함을 향상시킵니다! Flash는 여전히 캐주얼 웹 게임을 개발하기위한 최고의 소프트웨어이지만 JQuery는 놀라운 효과를 만들 수 있으며 Pure Action Flash 게임과 비교할 수는 없지만 경우에 따라 브라우저에서 예기치 않은 재미를 가질 수 있습니다. jQuery tic 발가락 게임 게임 프로그래밍의 "Hello World"에는 이제 jQuery 버전이 있습니다. 소스 코드 jQuery Crazy Word Composition 게임 이것은 반은 반은 게임이며, 단어의 맥락을 알지 못해 이상한 결과를 얻을 수 있습니다. 소스 코드 jQuery 광산 청소 게임

jQuery 시차 자습서 - 애니메이션 헤더 배경 jQuery 시차 자습서 - 애니메이션 헤더 배경 Mar 08, 2025 am 12:39 AM

이 튜토리얼은 jQuery를 사용하여 매혹적인 시차 배경 효과를 만드는 방법을 보여줍니다. 우리는 멋진 시각적 깊이를 만드는 계층화 된 이미지가있는 헤더 배너를 만들 것입니다. 업데이트 된 플러그인은 jQuery 1.6.4 이상에서 작동합니다. 다운로드

내 자신의 JavaScript 라이브러리를 어떻게 작성하고 게시합니까? 내 자신의 JavaScript 라이브러리를 어떻게 작성하고 게시합니까? Mar 18, 2025 pm 03:12 PM

기사는 JavaScript 라이브러리 작성, 게시 및 유지 관리, 계획, 개발, 테스트, 문서 및 홍보 전략에 중점을 둡니다.

브라우저에서 성능을 위해 JavaScript 코드를 최적화하려면 어떻게해야합니까? 브라우저에서 성능을 위해 JavaScript 코드를 최적화하려면 어떻게해야합니까? Mar 18, 2025 pm 03:14 PM

이 기사는 브라우저에서 JavaScript 성능을 최적화하기위한 전략에 대해 설명하고 실행 시간을 줄이고 페이지로드 속도에 미치는 영향을 최소화하는 데 중점을 둡니다.

Matter.js : 소개를 시작합니다 Matter.js : 소개를 시작합니다 Mar 08, 2025 am 12:53 AM

Matter.js는 JavaScript로 작성된 2D 강성 신체 물리 엔진입니다. 이 라이브러리를 사용하면 브라우저에서 2D 물리학을 쉽게 시뮬레이션 할 수 있습니다. 그것은 단단한 몸체를 생성하고 질량, 면적 또는 밀도와 같은 물리적 특성을 할당하는 능력과 같은 많은 기능을 제공합니다. 중력 마찰과 같은 다양한 유형의 충돌 및 힘을 시뮬레이션 할 수도 있습니다. Matter.js는 모든 주류 브라우저를 지원합니다. 또한, 터치를 감지하고 반응이 좋기 때문에 모바일 장치에 적합합니다. 이러한 모든 기능을 사용하면 엔진 사용 방법을 배울 수있는 시간이 필요합니다. 이는 물리 기반 2D 게임 또는 시뮬레이션을 쉽게 만들 수 있습니다. 이 튜토리얼에서는 설치 및 사용을 포함한이 라이브러리의 기본 사항을 다루고

jQuery 및 Ajax를 사용한 자동 새로 고침 DIV 컨텐츠 jQuery 및 Ajax를 사용한 자동 새로 고침 DIV 컨텐츠 Mar 08, 2025 am 12:58 AM

이 기사에서는 jQuery 및 Ajax를 사용하여 5 초마다 DIV의 컨텐츠를 자동으로 새로 고치는 방법을 보여줍니다. 이 예제는 RSS 피드의 최신 블로그 게시물을 마지막 새로 고침 타임 스탬프와 함께 가져오고 표시합니다. 로딩 이미지는 선택 사항입니다

See all articles