요약하자면, 객체의 유형을 결정하는 네 가지 주요 방법이 있습니다: 생성자 속성, typeof 연산자, 인스턴스of 연산자 및 Object.prototype.toString() 메서드.
생성자 속성
생성자 미리 정의된 생성자 속성은 생성자 자체입니다.
var Foo = function(){};
Foo.prototype.constructor === Foo;//true new를 통해 생성자를 호출하여 생성된 객체는 프로토타입 속성을 기반으로 합니다. 생성자 프로토타입. JavaScript에는 클래스라는 개념이 없지만 생성자의 기능은 유사한 이름의 것과 유사하며 객체 유형의 식별자입니다. 객체가 상속한 생성자 속성에 액세스하여 객체의 유형을 볼 수 있습니다. 기본 유형 변수는 액세스 시 JavaScript가 래퍼 객체를 형성하므로 생성자 속성에도 액세스할 수 있습니다.
1 //기본 객체
2 var obj = {name: "obj"};
3 obj.constructor === Object;//true
4
5 //자체 정의된 "클래스"
6 var Foo = function(){};
7 var f = new Foo();
8 f.constructor === Foo;//true
9
10 //기본 유형
11 //Number
12 var num = 1;
13 num.constructor === Number;//true
14 var nan = NaN ;
15 nan.constructor === 숫자;//true
16 //부울
17 var b = true;
18 b.constructor === 부울;//true
19 //String
20 var s = "string";
21 s.constructor === String;//true
22 //Function
23 var Fun =function(){};
24 Fun.constructor === Function;//true; 하지만 생성자 속성을 복사하거나 덮어쓸 수 있으므로 유형 판단 오류가 발생할 수 있습니다. 일반적으로 생성자 속성에 의도적으로 값을 할당하지 않더라도 생성자 속성의 값이 예상과 다른 경우가 있습니다. 다음 예를 살펴보세요.
var baseClass = function(){};
var 파생 클래스 = function(){};
derivedClass.prototype = new baseClass();
var obj = new 파생 클래스();
obj.constructor === 파생 클래스;//false;
obj.constructor === baseClass;//true; 부모 클래스의 인스턴스는 프로토타입이므로 하위 클래스 인스턴스를 통해 생성자에 액세스하는 것이 부모 클래스 생성자입니다. 따라서 JavaScript 객체지향 프로그래밍에서는 서브클래스 정의 시 생성자 속성을 수정하는 코드를 추가하겠습니다.
derivedClass.prototype.constructor = 파생 클래스; 생성자를 사용하여 변수 유형을 결정하는 것이 편리하지만 반드시 안전하지는 않으므로 주의가 필요합니다.
교차 프레임 및 교차 창 문제:
다른 프레임의 개체 유형이나 다른 창의 변수를 확인하는 경우 생성자 속성이 제대로 작동하지 않습니다. 다양한 창의 핵심 유형이 다르기 때문입니다[1].
instanceof 연산자 사용
instanceof 연산자는 객체의 프로토타입 체인에 생성자의 프로토타입 속성이 있는지 여부를 결정합니다[2]. 프로토타입 체인의 개념은 JavaScript 객체지향 프로그래밍 (1) 프로토타입과 상속에서 읽을 수 있습니다. 다음 코드는 프로토타입 체인 obj1->derivedClass.prototype->baseClass.prototype->...->Object.prototype을 형성합니다. Object.prototype은 모든 객체의 프로토타입이며, anyObj instanceof Object === true입니다.
var baseClass = function(){};
var 파생 클래스 = function(){};
derivedClass.prototype = new baseClass();//상속 사용
var obj1 = 새로운 파생 클래스();
obj1 인스턴스of baseClass;//true
obj1 인스턴스of 파생 클래스;//true
obj1 인스턴스of Object;//true
obj2 = 개체. create(derivedClass.prototype);
obj2instanceofbaseClass;//true
obj2instanceofderivedClass;//true
obj2instanceofObject;//trueconstructor 속성은 null 및 정의되지 않은(숫자)를 제외한 기본 유형에 적용할 수 있습니다. , 문자열, 부울 유형). Instanceof는 작동하지 않지만 객체 패키징 방법을 사용하여 판단할 수 있습니다.
3개의 Number 인스턴스 // false
'abc' instanceof String // false
true instanceof Boolean // false
new Number(3) instanceof Number // true
new String('abc')instanceofString //true
new Boolean(true)instanceofBoolean //true 그러나,instanceof는 프레임 간 및 창 간 상황에서 제대로 작동하지 않습니다.
Object.prototype.toString() 메서드 사용
Object.prototype.toString() 메서드는 객체의 유형을 나타내는 문자열을 반환할 수 있는 하위 수준 메서드입니다. 또한 null과 정의되지 않음을 확인하는 데에도 사용할 수 있습니다. 가장 일반적인 유형은 다음과 같습니다.
Object.prototype.toString.call(3);//"[객체 번호]"
Object.prototype.toString.call(NaN);//"[객체 번호]"
Object.prototype.toString.call([1,2,3]);//"[객체 배열]"
Object.prototype.toString.call(true);//"[객체 부울]"
Object.prototype.toString.call("abc");//"[객체 문자열]"
Object.prototype.toString.call(/[a-z]/);//"[객체 RegExp]"
Object.prototype.toString.call(function(){});//"[객체 함수]"
//Chrome 및 Firefox에서는 null이고 정의되지 않습니다. IE에서는 "[object Object]"
Object.prototype.toString.call(null);//"[object Null]"
Object.prototype입니다. toString.call(undefine);//"[객체 정의되지 않음]"
//자체 정의 객체
var a = new Foo();
Object.prototype.toString.call(a) ;//"[객체 객체]"
//형식화된 래퍼
var b = new Boolean(true);
Object.prototype.toString.call(b);//"[객체 부울]"
var n = new Number(1);
Object.prototype.toString.call(n);//"[객체 번호]"
var s = new String("abc") ;
Object.prototype.toString.call(s);//"[object String]"은 종종 결과의 유형 정보를 가로채기 위해 슬라이스 메소드를 사용합니다:
Object.prototype. toString.call("abc").slice(8,-1);//"String"은 MDN 문서 [3]에 자세히 소개된 typeof 연산자
를 사용합니다. Typeof는 "정의되지 않음", "객체", "부울", "숫자", "문자열", "함수" 및 "xml"을 포함하여 더 적은 정보를 반환할 수 있습니다.
유형 결과
정의되지 않음 "정의되지 않음"
Null "object"
Boolean "boolean"
Number "number"
String "string"
호스트 개체(제공됨) JS 환경에 따라) 구현에 따라 다름
함수 객체(ECMA-262 용어로 [[Call]] 구현) "function"
E4X XML 객체 "xml"
E4X XMLList 객체 "xml"
다른 개체 "객체"
// 숫자
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 = == 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // "Not-A-Number"임에도 불구하고
typeof Number(1) = == 'number'; // 이 형식은 절대 사용하지 마세요!
// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof는 항상 문자열을 반환합니다
typeof String("abc") === 'string'; // 이 형식은 사용하지 마세요!
// 부울
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean' // 사용하지 않음 이 형식입니다!
// 정의되지 않음
typeof undefine === 'undefine';
typeof blabla === 'undefine' // 정의되지 않은 변수
// 개체
typeof {a:1} === 'object';
typeof [1, 2, 4] === 'object'; // 구별하려면 Array.isArray 또는 Object.prototype.toString.call을 사용하세요. 배열의 일반 객체
typeof new Date() === 'object';
typeof new Boolean(true) === 'object'; // 사용하지 마세요. 🎜>typeof new Number(1) === 'object'; // 혼란스럽습니다. 사용하지 마세요!
typeof new String("abc") === 'object'; 사용하지 마세요!
typeof function(){} === 'function';
typeof Math.sin === 'function';
typeof undefine;//"undefine"
typeof null;//"object" 이는 JavaScript의 시작부터 나타납니다.
typeof /s/ === 'object' // ECMAScript 5.1을 준수합니다. 객체를 래핑한 결과는 '객체'입니다. 여기서는 그것이 좋은지 나쁜지에 대한 평가가 없습니다(패키지 객체와 기본 유형을 구별해야 하는 경우). 그러나 typeof는 강력한 방법이 아니므로 주의해서 사용해야 합니다. 예:
var s = "I am a string";
typeof s === "string";
//String에 메서드 추가
String.prototype . A_String_Method = function(){
console.log(this.valueOf());
console.log(typeof this);
};
s.A_String_Method();
/ / 나는 문자열이다
//객체