数据类型

1. 数据类型

原始类型与引用类型

  • 原始类型:Undefined,Null,Boolean,String,Number,Symbol,BigInt(ES10引入)

  • 引用类型:Object,Boolean,String,Number......

原始类型值直接存储在栈内存,而引用类型值存储在堆内存,其栈内存值存储的是值存储地址,如下图所示:

原始类型复制即重新复制一份原始数据,而引用类型复制为拷贝地址,两个地址指向同一个堆内存,更改其中一个也会影响另一个,如下图所示:

2. 类型识别

2.1 typeof

2.2 instanceof

2.3 constructor

2.4 Object.prototype.toString()

2.5 总结

  • typeof 目标 === 'object' —— 可以判断基本数据类型(除 null 为 object),引用对象类型均为 object(除function)

  • 目标 instanceof Array === true —— 不可以判断基本数据类型,可以判断引用对象类型包括自定义对象

  • 目标.constructor === Object —— 可以判断基本数据类型(除 null 和 undefined)和对象数据类型(内置和自定义)

  • Object.prototype.toString.call(目标).slice(8,-1).toLowerCase() === 'string' —— 可以判断基本数据类型和引用对象类型,不能识别自定义对象

3. 类型转化

3.1 强制转换

  • Number()

  • String()

  • Boolean()

  • pareseInt() / parseFloat()

3.2 隐式转换

比较时类型转换顺序

3.2.1 Boolean()

除了 +0、-0、undefined、null、''、false、NaN 之外其余均为 true。

3.2.2 Number()

区别 parseInt() 和 Number():

parseInt 逐个解析字符,而 Number 函数整体转换字符串的类型,基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。

3.2.3 parseInt()

3.2.4 String()

3.2.5 Number() 和 String() 原理

Number() 参数为对象时背后的规则:

  1. 调用对象自身的valueOf方法。如果返回原始类型的值,直接对该值使用Number函数,不再进行后续步骤。

  2. 如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。

  3. 如果toString方法返回的是对象,就报错。

String() 参数为对象时背后的规则:

  1. 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。

  2. 如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。

  3. 如果valueOf方法返回的是对象,就报错。

Object.prototype.valueOf() 方法的作用是返回一个对象的“值”,默认情况下返回对象本身。

Object.prototype.toString() 方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串“[object Object]”。

如果你对内容有任何疑问,欢迎提交 ❕issues✉️ email

最后更新于

这有帮助吗?