1. jsvascript의 데이터 유형
- 기본 유형 : 부울, 문자열, 숫자, 널, 정의되지 않음, 기호, BigInt (정수는 임의 정밀도로 표시 될 수 있음)
특별한:
- 기호 :
ES6은 고유 한 값을 나타내는 새로운 것입니다. "symbol"데이터 유형은 기본 데이터 유형입니다.이 유형의 특성은이 유형의 값을 사용하여 익명 객체 속성을 생성 할 수 있다는 것입니다. 이 데이터 유형은 일반적으로 개인용으로 원할 때 객체 속성의 키 값으로 사용됩니다. 데이터 유형이 "기호"인 값을 "기호 유형 값"이라고 할 수 있습니다. JavaScript 런타임 환경에서는 익명의 고유 한 값을 동적으로 생성하는 Symbol () 함수를 호출하여 기호 유형 값을 만들 수 있습니다. Symbol 유형을 합리적으로 사용하는 유일한 방법은 변수를 사용하여 기호 값을 저장 한 다음 저장된 값을 사용하여 개체 속성을 만드는 것입니다.
- BigInt :
임의 정밀도로 정수를 나타낼 수 있습니다. BigInt를 사용하면 숫자의 안전한 정수 제한을 초과하더라도 큰 정수를 안전하게 저장하고 조작 할 수 있습니다. BigInt는 정수 끝에 n을 추가하거나 생성자를 호출하여 생성됩니다.
- 참조 유형 (객체 유형) : 객체 유형에는 배열 (배열), 함수 (함수) 및 두 개의 특수 객체 인 일반 (RegExp) 및 날짜 (날짜)가 포함됩니다.
2. 데이터 유형 판단
1. typeof
console.log(typeof 2)//number
console.log(typeof true)//boolean
console.log(typeof 'str')//string
console.log(typeof []) //object
console.log(typeof function(){
})//function
console.log(typeof {
}) //object
console.log(typeof undefined)//undefined
console.log(typeof null)//object
const bar = Symbol()
console.log(typeof bar )//symbol
const x = 2n ** 53n//BigInt类型
console.log(typeof x)//bigint
const y = typeof x
console.log(typeof y)//string
요약하자면 :
- typeof가 반환 할 수있는 값은 다음과 같습니다.
number,string,undefined,Boolean,object,function,symbol,bigint
- typeof에 의해 반환 된 결과는 모두 문자열 유형입니다.
2. instanceof
위의 유형의 감지 배열과 객체는 모두 "object"를 반환하므로 참조 유형의 데이터 유형을 정확하게 판단 할 수없고 null을 정확하게 판단 할 수 없습니다.
instanceof 연산자는 생성자의 프로토 타입 속성이 인스턴스 객체의 프로토 타입 체인에 나타나는지 여부를 감지하는 데 사용됩니다.
instanceof의 내부 실행 시뮬레이션 : A의 proto 가 B의 프로토 타입을 가리킬 때 A 는 B의 인스턴스로 간주됩니다.
instanceof (A,B) = {
var L = A.__proto__;
var R = B.prototype;
if(L === R) {
//A的内部属性__proto__指向B的原型对象
return true;
}
return false;
}
예 :
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car);
// expected output: true
console.log(auto instanceof Object);
// expected output: true
데이터 유형 감지에 사용
console.log(2 instanceof Number); //false
console.log(true instanceof Boolean); //false
console.log("str" instanceof String); //false
console.log([] instanceof Array); //true
console.log([] instanceof Object) //true
console.log(function(){
} instanceof Function);//true
console.log({
} instanceof Object) //true
console.log(null instanceof Object) //false
//通过实例构造函数得到的值是原始类型也是可以使用instanceof判断数据类型
var bool2 = new Boolean()
console.log(bool2 instanceof Boolean);// true
var num2 = new Number()
console.log(num2 instanceof Number);// true
var str2 = new String()
console.log(str2 instanceof String);// true
요약하자면 :
- instanceof는 undefined와 null을 구분할 수 없습니다.
- 기본형의 경우 new로 선언하지 않으면 테스트 할 수 없으며, 인스턴스 생성자를 통해 얻은 값은 기본형이며 instanceof를 사용하여 데이터 형을 결정할 수도 있습니다.
- new로 선언 된 유형의 경우 배열을 감지 할 때와 같이 다중 상속 관계도 감지 할 수 있습니다. instanceof는 []이 Array의 인스턴스임을 확인할 수 있지만 []도 Object의 인스턴스라고 생각합니다. 프로토 타입 체인 전문
3. 생성자
constructor 속성의 기능은 인스턴스 객체에 의해 생성되는 생성자를 아는 것입니다.
console.log((2).constructor === Number); //true
console.log((true).constructor === Boolean); //true
console.log(("str").constructor === String); //true
console.log(([]).constructor === Array); //true
console.log(([]).constructor===Object ); //false
console.log((function(){
}).constructor === Function);//true
console.log(({
}).constructor === Object) //true
그러나 생성자는 개발 중에 다시 작성할 수 있습니다.
function Fn(){
}
Fn.prototype = new Array(); //prototype==原型
var f = new Fn();
console.log(f.constructor === Fn)//false
console.log(f.constructor === Array)//true
요약하자면 :
- 생성자는 재 작성이 가능하며 재 작성 후 판단이 부정확합니다.
- undefined 및 null에는 생성자 속성이 없으며 생성자는 undefined 및 null을 판단 할 수 없습니다.
4. Object.prototype.toString.call ***
toString은 Object 프로토 타입 객체에 대한 메소드입니다.이 메소드는 기본적으로 호출자의 특정 유형을 반환합니다.보다 엄밀히 말하면 toString이 실행될 때 이것이 가리키는 객체 유형입니다. 반환 된 유형 형식은 [object, xxx], xxx는 특정 유형입니다. 데이터 유형
console.log(Object.prototype.toString.call('')) ; // [object String]
console.log(Object.prototype.toString.call(2)) ; // [object Number]
console.log(Object.prototype.toString.call(true)) ; // [object Boolean]
console.log(Object.prototype.toString.call(undefined)) ; // [object Undefined]
console.log(Object.prototype.toString.call(null)) ; // [object Null]
console.log(Object.prototype.toString.call(new Function())) ; // [object Function]
console.log(Object.prototype.toString.call(new Date())) ; // [object Date]
console.log(Object.prototype.toString.call([])) ; // [object Array]
console.log(Object.prototype.toString.call(new RegExp()) ); // [object RegExp]
console.log(Object.prototype.toString.call(new Error())) ; // [object Error]
console.log(Object.prototype.toString.call(window) ); //[object Window]
console.log(Object.prototype.toString.call( Symbol()))//[object Symbol]
console.log(Object.prototype.toString.call( 3n))//[object BigInt]
요약하자면 :
- String, Number, Boolean, Undefined, Symbol, Null, Function, BigInt, Date, Array, RegExp, Error, HTMLDocument, ... 기본적으로 모든 개체 유형은이 메서드를 통해 얻을 수 있습니다.
- 직접 new Date (). toString () 대신 Object.prototype.toString.call을 통해 얻어야합니다. 프로토 타입 체인의 관점에서 볼 때 모든 객체의 프로토 타입 체인은 궁극적으로 Object를 가리 킵니다. JS 변수 검색 규칙에 따라 , other objects Object의 toString 메소드에 직접 접근하는 것도 가능해야합니다. 실제로 대부분의 객체는 자체 toString 메소드를 구현하고있어 Object의 toString이 종료 될 수 있으므로 호출을 사용하여 Object의 toString 메소드를 강제 실행합니다. …