数据类型(一)

发布于:2023-01-04 ⋅ 阅读:(303) ⋅ 点赞:(0)

分类

简单数据类型(简单数据类型),存储在栈中

 1. Number(数值)
 2. String(字符串)
 3. Null(空)
 4. undefined(未定义)
 5. Symbol(原始数据类型)
 6. Bigint(大整数)
 7. Boolean(布尔)

引用数据类型(复杂数据类型),存储于堆中

 1.Object(对象)  包括基本的对象、函数(Function)、数组(Array)和内置对象(Date等)

类型判断

1.使用 typeof 得到的结果是一个字符串

	
  var b = 12
  console.log(typeof b)// number 
  ///
   b = '12'
  console.log(typeof b) // string
   b = null
  console.log(typeof b) // object
   b = []
  console.log(typeof b) // object
    b = []
   console.log(typeof b) // object

使用typeof 判断 null 时,所得到的结果是object,具体原因 参考https://blog.csdn.net/qq_35508835/article/details/108299244,使用typeof判断复杂数据类型,所得到的结果是object,所以typeof判断不了引用数据类型和null

  1. 使用instanceof判断数据类型
var obj = {}
obj instanceof Object//true
var arr= []
arr instanceof Array//true
var str = 'xxx'
str instanceof String // false

实现原理

function myInstanceof(left, right) {
    // 这里先用typeof来判断基础数据类型,如果是,直接返回false
    if(typeof left !== 'object' || left === null) return false;
    // getProtypeOf是Object对象自带的API,能够拿到参数的原型对象
    let proto = Object.getPrototypeOf(left);
    while(true) {                  
        if(proto === null) return false;
        if(proto === right.prototype) return true;//找到相同原型对象,返回true
        proto = Object.getPrototypeof(proto);
    }
}

用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,返回的是一个bool值
可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型

  1. 使用Object.prototype.toString.call()判断数据类型
    返回"[object, 类型]",注意返回的格式及大小写,前面是小写,后面是首字母大写
Object.prototype.toString.call(999) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(Symbol()) // "[object Symbol]"
Object.prototype.toString.call(42n) // "[object BigInt]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(true) // "[object Boolean]

能判断基础数据类型和复杂数据类型,但是过于繁琐

本文含有隐藏内容,请 开通VIP 后查看