자바 스크립트 데이터 형 판단에 대해

1. jsvascript의 데이터 유형

  1. 기본 유형 : 부울, 문자열, 숫자, 널, 정의되지 않음, 기호, BigInt (정수는 임의 정밀도로 표시 될 수 있음)

특별한:

  • 기호 :

ES6은 고유 한 값을 나타내는 새로운 것입니다. "symbol"데이터 유형은 기본 데이터 유형입니다.이 유형의 특성은이 유형의 값을 사용하여 익명 객체 속성을 생성 할 수 있다는 것입니다. 이 데이터 유형은 일반적으로 개인용으로 원할 때 객체 속성의 키 값으로 사용됩니다. 데이터 유형이 "기호"인 값을 "기호 유형 값"이라고 할 수 있습니다. JavaScript 런타임 환경에서는 익명의 고유 한 값을 동적으로 생성하는 Symbol () 함수를 호출하여 기호 유형 값을 만들 수 있습니다. Symbol 유형을 합리적으로 사용하는 유일한 방법은 변수를 사용하여 기호 값을 저장 한 다음 저장된 값을 사용하여 개체 속성을 만드는 것입니다.

  • BigInt :

임의 정밀도로 정수를 나타낼 수 있습니다. BigInt를 사용하면 숫자의 안전한 정수 제한을 초과하더라도 큰 정수를 안전하게 저장하고 조작 할 수 있습니다. BigInt는 정수 끝에 n을 추가하거나 생성자를 호출하여 생성됩니다.

  1. 참조 유형 (객체 유형) : 객체 유형에는 배열 (배열), 함수 (함수) 및 두 개의 특수 객체 인 일반 (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 메소드를 강제 실행합니다. …

추천

출처blog.csdn.net/pz1021/article/details/105177939