数据类型
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。
所有对象(包括空对象)的转换结果都是true,甚至连false对应的布尔对象new Boolean(false)也是true,注意区别布尔值与布尔对象。
3.2.2 Number()
null 转为 0,undefined 转为 NaN!!!
Number 方法的参数是对象时,将返回 NaN,除非是包含单个数值的数组,注意是单个数值。
3.2.3 parseInt()
3.2.4 String()
String 方法的参数如果是对象,返回一个类型字符串;如果是数组,返回数组的字符串形式。
3.2.5 Number() 和 String() 原理
Number() 参数为对象时背后的规则:
调用对象自身的
valueOf方法。如果返回原始类型的值,直接对该值使用Number函数,不再进行后续步骤。如果
valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。如果
toString方法返回的是对象,就报错。
String() 参数为对象时背后的规则:
先调用对象自身的
toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。如果
toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。如果
valueOf方法返回的是对象,就报错。
Object.prototype.valueOf() 方法的作用是返回一个对象的“值”,默认情况下返回对象本身。
Object.prototype.toString() 方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串“[object Object]”。
最后更新于
这有帮助吗?