1. 数据类型有哪些?如何判断数据类型?

406 阅读2分钟

数据类型有哪些?区别?如何判断数据类型?

数据类型有哪些?

  • 数据类型主要分为2种:原始数据类型,引用数据类型。
  • 引用数据类型:Object,Array,Function
  • 原始数据类型:String,Number,Boolean,Null,Undefined

区别

  • 原始数据类型直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
  • 引用数据类型存储在堆中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
let c = 15;
let b = c
c = 50
console.log(b) //15
console.log(c) //50
let object1 = {
  name:'Bingeh',
  age:18
};
let object2 = object1;

//updating object1,
object1.age = 20;
console.log(object2); // {name:'Bingeh',age:20}

如何判断数据类型?

// (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
// 其中数组、对象、null都会被判断为object,其他判断都正确。
//(2)instanceof
console.log((2 as any) instanceof Number) // false
console.log((true as any) instanceof Boolean) // false
console.log(('str' as any) instanceof String) // false
console.log([] instanceof Array) // true
console.log(function () {} instanceof Function) // true
console.log({} instanceof Object) // true
// 可以看到,`instanceof`**只能正确判断引用数据类型**,而不能判断基本数据类型。`instanceof` 运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的 `prototype` 属性。
// (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(function () {}.constructor === Function) // true
console.log({}.constructor === Object) // true
// `constructor`有两个作用,一是判断数据的类型,二是对象实例通过 `constrcutor` 对象访问它的构造函数。需要注意,如果创建一个对象来改变它的原型,`constructor`就不能用来判断数据类型了:
//(4)Object.prototype.toString.call()**
// `Object.prototype.toString.call()` 使用 Object 对象的原型方法 toString 来判断数据类型:
const a = Object.prototype.toString
console.log(a.call(2)) //[object Number]
console.log(a.call(true)) //[object Boolean]
console.log(a.call('str')) //[object String]
console.log(a.call([])) //[object Array]
console.log(a.call(function () {})) //[object Function]
console.log(a.call({})) //[object Object]
console.log(a.call(undefined)) //[object Undefined]
console.log(a.call(null)) //[object Null]
/*
同样是检测对象obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

这是因为toString是Object的原型方法,而Array、function等**类型作为Object的实例,都重写了toString方法**。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object原型上的toString方法。
*/