文章目录
一、JS中的数据类型有哪些?
JS中的数据类型可以分为基本数据类型和引用数据类型。
基本数据类型:
undefined
null
number
boolean
string
Symbol(ES6)
bigInt(ES10)
引用数据类型:
Object
Array
RegExp
Date
Function
二、两种类型区别
1.存储方式
基本数据类型:采用栈存储值,系统会为它自动分配内存。
引用数据类型:采用的是栈存储地址,堆存储值,系统是对其动态分配内存,所以不会自动释放,尽量每次使用后将其设置为null,减少内存消耗。
2.拷贝方式
基本数据类型:拷贝过程为在栈中新生成一个具有同样指的副本,并让新变量指向它,所以拷贝后基本数据类型互不影响。
引用数据类型:由于引用数据类型是栈存地址,堆存值,并且js是无妨直接访问堆内存中的对象,所以它的拷贝只是将新变量的栈中所存地址指向已用的堆内存,拷贝后彼此之间会有影响。所以就提出了深拷贝浅拷贝。
3.能否增添属性和方法?
基本数据类型:它并不是对象,所以无法直接为其自定义属性方法,但js中有自动解包封包的机制,所以它可以调用一些属性方法,如可对数字类型的变量调用tostring(实际上是将它包装成为包装类)。
引用数据类型:它是对象,可以自定义属性方法。
4.比较方式
基本数据类型:比较是进行的值比较,即直接比较栈中所存储的值。
引用数据类型:比较的是地址比较,若指向同一个地址,则相等。
三、判断方式
js中常用数据类型有四种
typeof
instanceof
constructor
Object.prototype.toString.call()
1.typeof
typeof可以测试出number、string、boolean、undefined及function,而对于null及数组、对象,typeof均检测出为object,不能进一步判断它们的类型。
2.instanceof
从结果中看出instanceof不能区别undefined和null,而且对于基本类型如果不是用new声明的则也测试不出来,对于是使用new声明的类型,它还可以检测出多层继承关系。
原理:
function myInstance(L, R) {//L代表instanceof左边,R代表右边
var RP = R.prototype
var LP = L.__proto__
while (true) {
if(LP == null) {
return false
}
if(LP == RP) {
return true
}
LP = LP.__proto__
}
}
console.log(myInstance({},Object));
3.constructor
constructor不能判断undefined和null,并且使用它是不安全的,因为contructor的指向是可以改变的
4.Object.prototype.toString.call()
在任何值上调用 Object 原生的 toString() 方法,都会返回一个 [object NativeConstructorName] 格式的字符串。每个类在内部都有一个 [[Class]] 属性,这个属性中就指定了上述字符串中的构造函数名。
但是它不能检测非原生构造函数的构造函数名。