모든 객체에는 내부 속성 [[클래스]]가 포함됩니다.
이 속성에 직접 액세스할 수는 없지만 메서드를 통해 액세스할 수 있습니다.
이 메서드는 Object.prototype.toString.call(...)
이는 유형(instanceof, 생성자 등이 신뢰할 수 없음)을 확인하는 보다 안정적인 방법이기도 합니다.
예를 들어 배열을 확인하면
Object.prototype.toString.call([1,2,3]);
콘솔 인쇄"[object Array]"
여기서 "배열"은 실제로 기본 함수 Array() 내에서 [[Class]] 속성을 호출합니다.
유형을 감지하는 함수를 캡슐화할 수 있습니다
function classOf(obj){ return Object.prototype.toString.call(obj).slice(8,-1); }
함수는 매우 간단합니다. 간단히 호출하면 됩니다. Object 프로토타입에서 toString 메소드를 사용하여 우리에게 유용한 정보를 가로채세요
이 기능을 사용해 볼 수 있습니다
console.log(classOf({'a':1})); console.log(classOf([1,2,3])); console.log(classOf(function a(){})); console.log(classOf(/a/)); console.log(classOf(123)); console.log(classOf('abc')); console.log(classOf(true)); console.log(classOf(Symbol())); console.log(classOf(undefined)); console.log(classOf(null));
콘솔 인쇄
하지만 우리는 다음과 같은 사실을 발견했습니다. 객체만 아니라 기본 타입 값인 string, number, boolean까지 출력할 수 있습니다
JavaScript는 기본 타입 값인
에 대해 캡슐화 객체를 래핑하여 객체가 되도록 하고, String()은 객체로 만들기 때문입니다. , Number( ), Boolean()에는 [[Class]] 속성이 있습니다.
undefine 및 null에는 해당 네이티브 함수 Undefine() 및 Null()이 없지만 여전히 반환되는 내부 속성이 있습니다
이를 통해 function 우리는 유형을 정확하게 결정할 수 있습니다
매개변수 목록도 결정할 수 있습니다
function demo(){ console.log(classOf(arguments)); } demo();//"Arguments"
Back to Object.prototype.toString.call(…) 왜 그런 것을 통해 유형을 판단해야 합니까? 귀찮은 문자열
toString()을 직접 호출하면 어떻게 되는지 알 수 있습니다
console.log({'a':1}.toString()); console.log([1,2,3].toString()); console.log(function a(){}.toString()); console.log(/a/.toString()); console.log(123..toString()); // 只写一个点会被当成小数点,所以再写一个点代表方法调用console.log('abc'.toString()); console.log(true.toString()); console.log(Symbol().toString()); // 基本类型调用方法,会自动封装为对象 // 不能使用undefined.toString()或null.toString()会报错,因为没有对应的封装对象
일반 객체만이 우리가 원하는 것을 반환한다는 것을 알 수 있습니다.
이것은 왜냐하면 일반 객체는 최상위 프로토타입 Object
에서 toString 메소드를 직접 호출하는 반면 배열, 함수 및 이러한 기본 패키징 객체는 Object를 상속하는 동시에
일부 메소드를 재정의
toString 메소드를 찾을 때, 자신이어야 합니다 프로토타입 체인의 메소드가 먼저 발견됩니다
따라서 call을 사용하여 최상위 프로토타입 Object.prototype에서 d의 toString 메소드를 호출해야 합니다
위는 JavaScript 유형 검사의 내용입니다. 및 내부속성[[Class]]에 대한 자세한 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!