2021年了!JavaScript有几种数据类型?


看过一些文章,关于JavaScript的数据类型分为几种,有不同的说法。先从大体上看,有说基本数据类型和引用数据类型的;有说原始数据类型和对象数据类型的等等。

在这里结合MDN文档和一些网上的文章整理一下。

先上结论:八种,分别是:string、number、boolean、undefined、null、symbol(ES6)、bigint(ES10)和object

一、JS中的堆栈与数据类型

1.从JavaScript中的堆栈谈起

首先我们需要知道:

  • JavaScript是一门解释型语言
  • JavaScript代码需要在机器(node或者浏览器)上安装一个工具(JS引擎)才能执行。

然而JS引擎(例如chrome v8等)多数是一种由 C++ 开发的“应用”,JavaScript中并没有严格意义上区分栈内存与堆内存,具体怎么做取决与不同引擎的实现方式。

我们需要参考一些编译型语言来看JS的堆栈。

  • 栈(stack): 栈会自动分配内存空间,会自动释放,存放基本类型。
  • 堆(heap): 动态分配的内存,大小不定也不会自动释放,存放引用类型, 栈(stack)内存中存放地址指向堆(heap)内存中的对象.

当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。
在这里插入图片描述
在这里插入图片描述

2.从堆栈看数据类型

综上,我们将JS中的数据类型大体上分为两种:基本数据类型和引用数据类型。

目前为之JS有八种数据类型,分别是:

  • string、number、boolean、undefined、null、symbol(ES6)、bigint(ES10)
  • object

这样,我们从JS的堆栈开始,进一步了解了JavaScript的数据类型,有助于之后理解传值和传址,深浅拷贝等等。

注:function函数其实也是一个对象,是在堆内存当中。对象又是通过 new 构造函数出来的······这部分可以去学习原型与原型链,有助于进一步理解。

二、不可改变的基本数据类型

MDN中写到

基本类型(基本数值、基本数据类型)是一种既非对象也无方法的数据。在 JavaScript 中,共有7种基本类型:string,numbe,boolean,null,undefined,bigint,symbol。

多数情况下,基本类型直接代表了最底层的语言实现。

所有基本类型的值都是不可改变的。

基本类型值可以被替换,但不能被改变,赋值行为可以给基本类型一个新值,而不是改变它。

在函数中JavaScript会将传递进来的参数(基本类型的值)复制一份,创建一个本地副本,函数中的任何操作都不会影响到最初的值,我们操作的只不过是它的副本

那么调用字符串的方法,不会影响之前的字符串;调用数组的方法,部分会影响之前的数组。

三、JS中的基本类型、包装对象、原型

除了 nullundefined之外,所有基本类型都有其对应的包装对象:

  • String 为字符串基本类型。
  • Number为数值基本类型。
  • BigInt 为大整数基本类型。
  • Boolean为布尔基本类型。
  • Symbol 为字面量基本类型。

在包装对象的原型上有基本类型的方法,例如String.prototype中有split、substring等等方法。

而我们的基本类型的 __proto__ 属性又会指向对应包装对象的原型,那么我们可以把基本类型看作是实例,与原型与原型链的知识结合起来了。

这样基本数据类型就可以调用这些方法时,可以通过原型链找到。

const str = "abc";
const num = 123;
str.__proto__ === String.prototype // true
num.__proto__ === Number.prototype // true

四、typeof 操作符能返回哪些结果?

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

类型 结果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
BigInt "bigint"
String "string"
Symbol "symbol"
Function "function"
其他任何对象 "object"

特殊的几点:

  • typeof Object:结果是"function",因为Object是一个构造函数,可以通过new操作符来构造对象。

  • typeof null:结果是"object",null是一个只有一个值的特殊类型。表示一个空对象引用。

    为什么 typeof null 为 “object”? JavaScript 诞生以来便如此

    在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null 也因此返回 "object"

    曾有一个 ECMAScript 的修复提案(通过选择性加入的方式),但被拒绝了该提案会导致 typeof null === 'null'

综上,typeof操作符能返回的类型:

  • string number boolean undefined symbol bigint
  • object 、(typeof null === ‘object’)
  • function

五、== 和 === 相关总结

==运算符,会发生隐式类型转换

// 以下结果都是true
100 == '100'
0 == ''
0 == false
1 == true
false == ''
null == undefined

通常我们在所有地方都使用===,在判断null或者undefined时使用==

const obj = {
    
     foo: "foo" }
if (obj.a == null) {
    
    }
// 相当于
if (obj.a === null || obj.a === undefined) {
    
    }

在==、if、逻辑判断中都类似,自行网上了解一下隐式类型转换规则。

JS隐式类型转换详解

网上看了一下什么面试题大坑,特别奇葩的js隐形转换的面试题,感觉很离谱又没什么意思。

猜你喜欢

转载自blog.csdn.net/weixin_43792004/article/details/112975712