前端面试系列——JS数据类型有哪些?


一、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]] 属性,这个属性中就指定了上述字符串中的构造函数名。
但是它不能检测非原生构造函数的构造函数名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值