数据类型
原始类型(值引用)(保存在栈中)
-
Number
:浮点数,存在精度误差问题 -
BigInt
:精度更大 -
String
:采用UTF-16 格式存储,但是对 UTF-16 的支持是不完整的
只支持两字节的字符,不支持四字节的字符
-
Boolean
-
只有
undefined
,null
,0
,NaN
,‘’
会转为false
-
注意:
[]
,{}
是会转为true
-
if 等流控制语句会自动给进行布尔值的转换
-
-
-
Symbol
-
Undefined
- 只声明但未赋值的变量(不建议,声明和初始化建议一起执行)
- 不存在的变量
- 函数没有
return
-
Null
:空对象指针- 建议使用 null 来初始化变量
引用类型(地址引用)(保存在堆中)
- 对象:键名是字符串类型
- 数组
- 函数
JSON
Date
Error
- …
判断数据类型
typeof
-
两个特殊的情况:
typeof null
结果为Object
typeof 函数
结果为function
-
js在存储时,二进制的头3位用于标记数据类型
Object
为000
null
表示空值所以也为000
instanceof
-
作用:检测构造函数的
prototype
属性是否出现在某个实例对象的原型链上。 -
实例对象
instanceof
构造函数
【面试题】
为什么?
Object instanceof Function //true
Function instanceof Object //true
- js自带的构造函数都是由
Function()
实例化生成的,所以都继承于Function.prototype
- 对象都继承于
Object.prototype
Object.prototype.toString
Object.prototype.toString.call(this);
- 原理:调用后,会查找this对象的
[[Class]]
属性的值,并与[object]
进行字符串拼接
包装函数
-
原始类型没有方法或属性,通过包装函数可以实现
-
包装函数:会将原始类型暂时转为引用类型,使其能调用相应的方法
let num=10 num.toString() //'10'
-
与引用类型的区别:生命周期不同,包装后的引用类型只在其所在的那行代码中有效,也就是说在包装后会变回其最初的原始类型
let b=Boolean(false) b instanceof Boolean //false b instanceof Object //false //b在包装后会变回其最初的原始类型,instanceof 左侧只有是引用类型才好使 typeof b //'boolean'
-
Object()
:根据参数类型,实例化其包装函数let obj = Object("some text"); console.log(obj instanceof String); // true 实例化了
-
null
和undefined
没有包装函数
数据类型的转换
-
强制转换:内部会有
valueOf()
和toString()
的运用(Date比较特殊,相反) -
自动转换:预期什么类型的值,就调用该类型的函数。
- 如果该位置既可以是字符串,也可能是数值,那么默认转为数值
Object.prototype.toString() | 返回值 |
---|---|
Object | “[object 数据类型]” |
Array | “元素,元素,…” |
Function | “函数源码” |
Date | “日期” |
Number | 返回字符串,参数代表进制,默认十进制 |
其他原始类型 | “值” |
Object.prototype.valueOf() | 返回值 |
---|---|
Object | 在堆中的值,{…} |
Array | 在堆中的值,[…] |
Function | 函数源码(没有function开头) |
Date | 1970 年 1 月 1 日开始的毫秒数 |
原始类型 | 对应的值 |
BigInt
BigInt数据类型精度范围更大,解决js的精度问题,必须添加后缀n
- BigInt 不能与普通数值进行混合运算
- 开头不能使用
+
- BigInt 与字符串混合运算时,会先转为字符串,再进行运算