typeof
및 instanceof
연산자는 모두 데이터 유형을 결정하는 데 사용되지만 사용 시나리오가 다르며 일부 세부 사항에는 특별한 주의가 필요합니다. 다음은 알아보고, 이 지식 포인트를 철저히 숙지하고, 더 이상 면접관의 질문을 두려워하지 마세요.
typeof
는 어떤 유형이든 피연산자 앞에 배치되는 단항 연산자입니다. 피연산자의 유형을 설명하는 문자열을 반환합니다. 밤나무를 보세요:
const type = typeof 'Long Live China' // string; 유형666; 유형의 true; // 부울 유형은 정의되지 않음; // 정의되지 않음 typeof Symbol(); // 기호 1n 유형; typeof () => {} // 함수 유형의 []; // 객체 유형의 {}; // 객체 typeof new String('xxx'); // 객체 typeof null; // object
위의 예에서 볼 수 있듯이 typeof
기본 데이터 유형과 함수만 정확하게 결정할 수 있으며(함수는 실제로 객체이며 다른 데이터 유형에 속하지 않지만 typeof를 사용하여 구별할 수도 있음) Out 참조 데이터 유형(모두 반환 개체)을 정확하게 결정합니다.
주목해야 할 점은 typeof null
호출하면 object
반환된다는 것입니다. 이는 특수 값 null
null 개체(널 개체 포인터라고도 함)에 대한 참조로 간주되기 때문입니다.
참조 데이터 유형을 정확하게 확인하려면 instanceof
연산자를 사용할 수 있습니다.
instanceof
연산자는 피연산자 뒤, 주어진 객체 앞에 배치됩니다. 피연산자가 주어진 객체의 인스턴스인지 여부를 나타내는 부울 값을 반환합니다.
const result = [] instanceof Array; const 사람 = function() {}; const p = 새로운 사람(); p 인스턴스of 사람; // 참 const message = new String('xxx'); message instanceof String; // 참
을
반환하고, instanceof는 부울 값을 반환합니다
.
참조 데이터 유형(함수 제외)을 결정하는 것은 불가능합니다
typeof
와 instanceof
모두 특정 단점이 있으며 모든 시나리오의 요구 사항을 충족할 수 없습니다. 데이터 유형을 보편적으로 감지해야 하는 경우 Object.prototype.toString.call()
메서드를 사용할 수 있습니다.
Object.prototype.toString.call({}) // "[object Object]" Object.prototype.toString.call([]); // "[객체 배열]" Object.prototype.toString.call(666); // "[객체 번호]" Object.prototype.toString.call('xxx'); // "[object String]"
이 메서드는 "[object Object]"
형식의 문자열을 반환합니다.
보다 편리한 사용을 위해 다음 메소드를 캡슐화할 수 있습니다.
function getType(value) { 유형 = 값 유형을 지정합니다. if (type !== 'object') { // 기본 데이터형인 경우 직접 return return type; } // 참조 데이터 유형인 경우 추가 판단이 이루어지며 일반 반환 결과는 return Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1'); } getType(123); // 숫자 getType('xxx'); // 문자열 getType(() => {}); // 함수 getType([]); // 배열 getType({}); //객체 getType(null); // 널