基本数据类型
包含:null, undefined, number, string, boolean
ES6新增:symbol-表示独一无二的值
存放位置:栈内存
比较:值的比较,只判断值是否相等
拷贝:只有一种:赋值(=) 为值的赋值,相互没有影响
引用数据类型
包含:对象,函数,其他(其他引用类型都是根据这两种衍生的, 主要有Array,Date,RegExp)
ES6新增:
- Set-类似于数组但成员值不可重复, WeakSet成员只能是对象
- Map-比Object更完善的hash结构,各种类型的值都可以当做键, WeakMap只接受null外的对象作为键名
存放位置:引用地址存放在栈内存,真实数据存放在堆内存
比较:判断是否指向同一个对象
拷贝:
-
赋值(=)
拷贝引用地址,两个引用指向同一个对象
为了切断两个对象之间的关系,就有了浅拷贝和深拷贝
-
浅拷贝
在堆内存中有一块新的区域放拷贝的对象
只拷贝一层
两对象中的对应的引用类型属性指向同一个地址
-
深拷贝
两个对象互不影响
数据类型判断
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"
注意:
-
使用typeof判断返回的是小写的字符串
-
使用typeof判断数据类型是有限的
-
引用类型使用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
参考与感谢
不好意思,忘记参考的文章链接了...待我找到一定贴上【感恩!】
写在最后
本人才疏学浅,但依旧想通过代码来弥补这平淡的一生~
本文仅为自我知识总结,望发现错误的学者一定指正!感恩~