JS专题之:基本数据类型 vs 引用数据类型

236 阅读2分钟

基本数据类型

包含:null, undefined, number, string, boolean

ES6新增:symbol-表示独一无二的值

存放位置:栈内存

比较:值的比较,只判断值是否相等

拷贝:只有一种:赋值(=) 为值的赋值,相互没有影响

引用数据类型

包含:对象,函数,其他(其他引用类型都是根据这两种衍生的, 主要有Array,Date,RegExp)

ES6新增:

  • Set-类似于数组但成员值不可重复, WeakSet成员只能是对象
  • Map-比Object更完善的hash结构,各种类型的值都可以当做键, WeakMap只接受null外的对象作为键名

存放位置:引用地址存放在栈内存,真实数据存放在堆内存

比较:判断是否指向同一个对象

拷贝:

  1. 赋值(=)

    拷贝引用地址,两个引用指向同一个对象

    为了切断两个对象之间的关系,就有了浅拷贝和深拷贝

  2. 浅拷贝

    在堆内存中有一块新的区域放拷贝的对象

    只拷贝一层

    两对象中的对应的引用类型属性指向同一个地址

  3. 深拷贝

    两个对象互不影响

数据类型判断

typeof

typeof undefined
"undefined"

typeof null
"object"

typeof NaN
"number"

typeof [1]
"object"

typeof function() {}
"function"

typeof Object
"function"

typeof Symbol()
"symbol"

typeof new Set([1, 3])
"object"

typeof new Map([[1, 4], [5, 7]])
"object"

注意:

  1. 使用typeof判断返回的是小写的字符串

  2. 使用typeof判断数据类型是有限的

  3. 引用类型使用typeof判断只会返回两种类型:function和Object

Object.prototype.toString

Object.prototype.toString.call(new Date())
"[object Date]"

Object.prototype.toString.call(null)
"[object Null]"

Object.prototype.toString.call(Symbol())
"[object Symbol]"

Object.prototype.toString.call(new Set([3, 9]))
"[object Set]"
function checkType(target) {
  	// str.slice(8, -1)表示从index位置8截取到字符串的(str.length - 1),包含begin不包含end
    return Object.prototype.toString.call(target).slice(8, -1)
}

**注意:**这种判断方式返回的是大写字母开头的字符串

你可能会有疑问,既然是使用实例的toString方法,那为什么不能直接使用而要使用Object原型上的方法呢?

答案是:每个引用类型在自己的原型对象上重写了toString方法

[1,3].toString()
"1,3"
new Date().toString()
"Mon Apr 06 2020 10:49:04 GMT+0800 (中国标准时间)"

instanceof

instanceof运算符测试构造函数的原型对象是否出现在该对象的原型链上。

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
let mycar = new Car('Honda', 'Accord', 1998) 
let a = mycar instanceof Car     // returns true
let b = mycar instanceof Object  // returns true

参考与感谢

不好意思,忘记参考的文章链接了...待我找到一定贴上【感恩!】

写在最后

本人才疏学浅,但依旧想通过代码来弥补这平淡的一生~

本文仅为自我知识总结,望发现错误的学者一定指正!感恩~