JavaScript_javascript 기술의 Object.prototype.toString 메소드 원리
JavaScript에서 객체 값이 어떤 내장 유형에 속하는지 확인하는 가장 신뢰할 수 있는 방법은 Object.prototype.toString 메서드를 사용하는 것입니다.
var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]"
이 글에서는 toString 메소드가 이를 수행하는 방법과 원리가 무엇인지에 대해 이야기하겠습니다.
ECMAScript 3
ES3에서 Object.prototype.toString 메소드의 사양은 다음과 같습니다.
15.2.4.2 Object.prototype.toString()
toString 메소드가 호출되면 다음 단계가 수행됩니다.
1. 이 객체의 [[Class]] 속성 값을 가져옵니다.
2. 세 개의 문자열 "[object", 첫 번째 단계의 연산 결과 Result(1), "]" 연결 후의 새 문자열을 계산합니다.
3. 두 번째 단계 Result(2)의 연산 결과를 반환합니다.
[[클래스]]는 모든 객체(네이티브 객체와 호스트 객체)가 갖고 있는 내부 속성입니다. 사양에서는 [[클래스]]를 이렇게 정의합니다
内部属性 | 描述 |
---|---|
[[Class]] | 一个字符串值,表明了该对象的类型. |
그런 다음 그는 다음과 같이 설명했습니다.
모든 내장 개체의 [[Class]] 속성 값은 이 사양에 의해 정의됩니다. 모든 호스트 개체의 [[Class]] 속성 값은 [[Class]도 포함하여 임의의 값이 될 수 있습니다. 내장 객체 ] 속성에 의해 사용됩니다. [[Class]] 속성의 값은 기본 객체가 속한 내장 유형을 결정하는 데 사용될 수 있습니다. 이 사양은 다른 방법을 제공하지 않습니다. Object.prototype.toString 메소드를 통해 프로그램이 속성 값에 액세스하도록 합니다(15.2.4.2 참조).
즉, 내부 속성 [[class]의 값인 Object.prototype.toString 메서드에서 반환된 문자열 앞의 고정된 "[object" 및 뒤의 고정된 "]"를 제거합니다. ], 객체 유형을 결정하는 목적이 달성되었습니다. 이를 위해 jQuery의 도구 메소드 $.type()이 사용됩니다.
ES3의 사양 문서에는 [[class]] 내부 속성의 유형이 몇 가지인지 요약되어 있지 않지만, [[class]에는 총 10개의 값이 있습니다. ] 기본 개체의 내부 속성은 각각 "Array", "Boolean", "Date", "Error", "Function", "Math", "Number", "Object", "RegExp", "String"입니다. .
ECMAScript 5
ES5.1에서는 사양이 더 자세하게 작성되는 것 외에도 Object.prototype.toString 메서드 정의와 Object의 [[class]] 내부 속성에 일부 변경 사항이 있습니다. 프로토타입.toString 메소드는 다음과 같습니다:
15.2.4.2 Object.prototype.toString ( )
toString 메소드가 호출되면 다음 단계가 수행됩니다.
이 값이 정의되지 않은 경우 "[객체 정의되지 않음]"을 반환합니다.
이 값이 null이면 "[object Null]"을 반환합니다.
O를 ToObject(this) 호출의 결과로 둡니다.
클래스를 O의 내부 속성 [[클래스]]의 값으로 둡니다.
세 문자열 "[object ", class 및 "]"를 연결한 후 새 문자열을 반환합니다.
ES3보다 1, 2, 3단계가 더 많은 것을 볼 수 있습니다. 1단계와 2단계는 새로운 규칙이며 "Undefound"와 "Null"이 값에 속하지 않기 때문에 매우 특별합니다. [[class]] 속성은 엄격 모드와 아무 관련이 없습니다(대부분의 함수에서 이 값은 엄격 모드에서만 정의되지 않거나 null로 유지되며 비표준 모드에서는 자동으로 전역 객체가 됩니다). 3단계는 새로운 규칙이 아닙니다. ES3 엔진에서는 이 단계에서 세 가지 기본 값 유형이 해당 패키징 객체로 변환되지만 ES5에서는 [[Class. ]] 속성에 대해 자세히 설명합니다:
모든 내장 객체의 [[Class]] 속성 값은 이 사양에 의해 정의됩니다. 모든 호스트 객체의 [[Class]] 속성 값은 "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String" 내부 속성은 엔진이 내부적으로 결정하는 데 사용됩니다. 객체가 속하는 값 유형. 이 사양은 Object.prototype.toString 메소드를 통하는 것 외에는 프로그램이 이 속성의 값에 액세스할 수 있는 다른 방법을 제공하지 않는다는 점에 유의해야 합니다(15.2.4.2 참조).
ES3와 비교했을 때 첫 번째 차이점은 [[class]]에 내부 속성 값이 2개 더 많아 12가지 유형이 된다는 점입니다. 하나는 인수 객체의 [[class]]가 "Arguments"가 되고, 이전 "Object"에는 [[class]] 값이 "JSON"인 전역 개체 JSON이 여러 개 있습니다. 두 번째 차이점은 호스트 개체의 [[class]] 내부 속성 값이 이 12개와 충돌한다는 것입니다. 하지만 ES3를 지원하는 브라우저에서는 이 10개의 값을 의도적으로 사용하는 호스트 개체가 없는 것 같습니다.
ECMAScript 6
ES6는 아직 작업 중인 초안이지만 확실한 것은 [[class]] 내부 속성이 사라지고 다른 내부 속성인 [[NativeBrand]]로 대체되었다는 것입니다. [[NativeBrand]] 속성은 다음과 같이 정의됩니다. :
内部属性 | 属性值 | 描述 |
---|---|---|
[[NativeBrand]] | 枚举NativeBrand的一个成员. | 该属性的值对应一个标志值(tag value),可以用来区分原生对象的类型. |
[[NativeBrand]] 속성 설명:
[[NativeBrand]] 내부 속성은 네이티브 객체가 이 사양을 준수하는 특정 유형의 객체인지 식별하는 데 사용됩니다. 다음 열거 유형 A: NativeFunction, NativeArray, StringWrapper, BooleanWrapper, NumberWrapper, NativeMath, NativeDate, NativeRegExp, NativeError, NativeJSON, NativeArguments, NativePrivateName [[NativeBrand]] 내부 속성은 ECMAScript 네이티브 객체의 특정 유형을 구별하는 데만 사용됩니다. 표 10 명시적으로 지정된 객체 유형에만 [[NativeBrand]] 내부 속성이 있습니다.
표 10 — [[NativeBrand]] 내부 속성 값
属性值 | 对应类型 |
---|---|
네이티브 함수 | 함수 객체 |
네이티브어레이 | 객체 배열 |
문자열 래퍼 | 문자열 객체 |
부울 래퍼 | 부울 객체 |
번호 래퍼 | 숫자 개체 |
네이티브 수학 | 수학 객체 |
NativeDate | 날짜 객체 |
NativeRegExp | RegExp 객체 |
네이티브 오류 | 오류 개체 |
네이티브JSON | JSON 객체 |
네이티브 인수 | 인수 객체 |
NativePrivateName | 개인 이름 개체 |
[[class]]와 달리 모든 객체에 [[NativeBrand]]가 있는 것은 아님을 알 수 있습니다. 동시에 Object.prototype.toString 메서드의 사양도 다음과 같이 변경되었습니다. 🎜>
15.2.4.2 Object.prototype.toString ( )
toString 메소드가 호출되면 다음 단계가 수행됩니다.이 값이 정의되지 않은 경우 "[객체 정의되지 않음]"을 반환합니다.
또는 "String"이면 태그가 문자열 "~"와 태그의 현재 값을 연결한 결과가 되도록 합니다.
표 29 — [[NativeBrand]] 플래그 값
[[네이티브브랜드]] 값 | 플래그 값 |
---|---|
네이티브 함수 | <font face="NSimsun">"Function"</font> |
네이티브어레이 | <font face="NSimsun">"Array"</font> |
문자열 래퍼 | <font face="NSimsun">"String"</font> |
부울 래퍼 | <font face="NSimsun">"Boolean"</font> |
번호 래퍼 | <font face="NSimsun">"Number"</font> |
네이티브 수학 | <font face="NSimsun">"Math"</font> |
NativeDate | <font face="NSimsun">"Date"</font> |
NativeRegExp | <font face="NSimsun">"RegExp"</font> |
네이티브 오류 | <font face="NSimsun">"Error"</font> |
네이티브JSON | <font face="NSimsun">"JSON"</font> |
NativeArguments | <font face="NSimsun">"Arguments"</font> |
可以看到,在规范上有了很大的变化,不过对于普通用户来说,貌似感觉不到.
也许你发现了,ES6里的新类型Map,Set等,都没有在表29中.它们在执行toString方法的时候返回的是什么?
console.log(Object.prototype.toString.call(Map())) //"[object Map]" console.log(Object.prototype.toString.call(Set())) //"[object Set]"
其中的字符串"Map"是怎么来的呢:
15.14.5.13 Map.prototype.@@toStringTag
@@toStringTag 属性的初始值为字符串"Map".
由于ES6的规范还在制定中,各种相关规定都有可能改变,所以如果想了解更多细节.看看下面这两个链接,现在只需要知道的是:[[class]]没了,使用了更复杂的机制.
以上所述是小编给大家分享的JavaScript中Object.prototype.toString方法的原理,希望对大家有所帮助!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

프론트 엔드 개발시 프론트 엔드 열지대 티켓 인쇄를위한 자주 묻는 질문과 솔루션, 티켓 인쇄는 일반적인 요구 사항입니다. 그러나 많은 개발자들이 구현하고 있습니다 ...

이 기사는 브라우저 개발자 도구를 사용하여 효과적인 JavaScript 디버깅, 중단 점 설정, 콘솔 사용 및 성능 분석에 중점을 둡니다.

이 기사는 소스 맵을 사용하여 원래 코드에 다시 매핑하여 미니어링 된 JavaScript를 디버그하는 방법을 설명합니다. 소스 맵 활성화, 브레이크 포인트 설정 및 Chrome Devtools 및 Webpack과 같은 도구 사용에 대해 설명합니다.

이 기사는 Java의 컬렉션 프레임 워크의 효과적인 사용을 탐구합니다. 데이터 구조, 성능 요구 및 스레드 안전을 기반으로 적절한 컬렉션 (목록, 세트, 맵, 큐)을 선택하는 것을 강조합니다. 효율적인 수집 사용을 최적화합니다

엔트리 레벨 타입 스크립트 자습서를 마스터 한 후에는 TypeScript를 지원하고 JavaScript로 컴파일하는 IDE에서 자신의 코드를 작성할 수 있어야합니다. 이 튜토리얼은 TypeScript의 다양한 데이터 유형으로 뛰어납니다. JavaScript에는 NULL, UNDEFINED, BOOLEAN, 번호, 문자열, 기호 (ES6에 의해 소개 됨) 및 객체의 7 가지 데이터 유형이 있습니다. TypeScript는이 기반으로 더 많은 유형을 정의 하며이 튜토리얼은이 모든 튜토리얼을 자세히 다룹니다. 널 데이터 유형 JavaScript와 마찬가지로 Null in TypeScript

이 튜토리얼은 Chart.js를 사용하여 파이, 링 및 버블 차트를 만드는 방법을 설명합니다. 이전에는 차트 유형의 차트 유형을 배웠습니다. JS : 라인 차트 및 막대 차트 (자습서 2)와 레이더 차트 및 극지 지역 차트 (자습서 3)를 배웠습니다. 파이 및 링 차트를 만듭니다 파이 차트와 링 차트는 다른 부분으로 나뉘어 진 전체의 비율을 보여주는 데 이상적입니다. 예를 들어, 파이 차트는 사파리에서 남성 사자, 여성 사자 및 젊은 사자의 비율 또는 선거에서 다른 후보자가받는 투표율을 보여주는 데 사용될 수 있습니다. 파이 차트는 단일 매개 변수 또는 데이터 세트를 비교하는 데만 적합합니다. 파이 차트의 팬 각도는 데이터 포인트의 숫자 크기에 의존하기 때문에 원형 차트는 값이 0 인 엔티티를 그릴 수 없습니다. 이것은 비율이 0 인 모든 엔티티를 의미합니다
