所谓值类型,其实指的是原始数据类型,它和后面讲的原始数据类型、基本数据类型是同一个东西。在语义理解上,基本和原始似乎能搭的上边,而值似乎不沾边,所有这里就分开来讲。
值类型存储在栈内存中,当你进行拷贝操作,会得到一片新的内存地址,当你进行相关运算,它会改变当前数据段所存的地址,当进行相关函数定义,就会去内存中开辟有关变量的地址,直到这个函数运行结束,内存就会被相应的回收。
大致有这些值类型:Number、String、Boolean、Symbol、Null、Undefined、BigInt
引用类型分堆内存和栈内存存储。引用类型的访问地址存在栈内存中,其指向堆内存的结构。就因为是这个模型,当你进行引用类型对象拷贝的时候,其实拷贝的是其栈内存的地址,所以当你操作这个引用类型对象,首先它找到栈内存的地址,然后在堆内存中进行修改,这就很好地说明了浅拷贝引用类型对象,操作其中一个对象会影响另一个对象,因为它拷贝的是栈内存的地址,指向的是同一个堆内存地址。
大致有这些引用类型:Object、Function、Array、RegExp、Date
在Javascript中,有7种原始数据类型,原始数据类型的值是不可改变的。
Number、String、Boolean、Symbol、Null、Undefined、BigInt
除了null和undefined外,其他的都有。String、Number、Boolean、BigInt、Symbol
typeof
操作符返回一个字符串,表示未经计算的操作数的类型。typeof可以判断Number、String、Boolean、Symbol、BigInt、Undefined、Object、Function。这里值得一提的就是typeof null === object
, 什么鬼?一个基本数据类型等于一个引用类型。其实这个是JS语言设计上的问题,曾经也有ES修复提案被拒绝了,之所以产生这个结果是因为,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null
代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null
也因此返回 "object"
instanceof
运算符用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。像数组、函数、对象都可以用instanceOf来进行判断。
Javascript是一种弱类型的动态语言,也就是说,其定义的变量的类型的确立是在程序运行的时候,自动确立的。它是比较灵活的,你可以let a = 2020
,程序运行的时候走到这一步会确立它是number类型,之后你又可以a = '2020'
,走到这一步它又是字符串类型。
具体的相关测试用例这里就不展开了,有兴趣的同学可以看下楼下的地址。
关于typeof的相关测试用例:https://zhengjiangtao.cn/coding/interview/use_typeof.js
关于instanceof的相关测试用例:https://zhengjiangtao.cn/coding/interview/use_instanceof.js
项目地址: https://github.com/ataola/coding
Javascript数据类型和数据结构(MDN): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures
原始数据(MDN): https://developer.mozilla.org/zh-CN/docs/Glossary/Primitive
typeof(MDN): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof
instanceof(MDN): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof