JS中的基本数据类型
基本数据类型
- number
- string
- boolean
- null
- undefined
- symbol
- bigint
引用数据类型
- object
- 普通对象
- 数组对象
- 正则对象
- 日期对象
- Math数学函数对象
- ...
- function
数据类型检测
- typeof
检测数据类型的逻辑运算符 - instanceof
检测是否为某个类的实例 - constructor
检测构造函数 - Object.prototype.toString.call
检测数据类型的
typeof [value] 返回当前值的数据类型 "数据类型"
- 返回的结果都是字符串
- 局限性:
- typeof null => "object"
- typeof 不能细分对象类型(检测普通对象或者数组对象等都是"object")
Number 详解
NaN/isNaN/infinity/paresInt/Number
把其它数据类型转换为数字的方法
- 强转换(基于底层机制转换的) Number([value])
- 一些隐式转换都是基于Number完成的
- isNaN('12px') 先把其它类型值转换为数字在检测
- 数学运算 '12px'-13
- 字符串==数字 两个等于号比较很多时候也是要把其它值转换为数字
- ...
- 一些隐式转换都是基于Number完成的
- 弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])
ParseInt
处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找) -> 如果处理的值不是字符串,需要先转换为字符串然后在开始查找接口
Number
直接调用浏览器最底层的数据类型检测机制来完成 : 字符串中必须保证都是有效数字才会转换为数字,否则都是NaN
""\false\null0
undefined: NaN
== 转化的规律
在进行比较的时候,如果左右两边数据类型不一致,则需要先转换为一致的数据类型,然后在进行比较
- 对象 == 字符串 对象转化为字符串
- null = undefined但是和其他都不相等
- NaN 和谁都不相等(包括自己)
- 剩下的两边不同都是转化为数字
+
- 在两边出现字符串(或对象)的情况下,一定是字符串拼接
- 对象本身是要转化为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串才能转换为数字,而一旦转换为字符串,就转换为字符串拼接了
Boolean
只有 0 / NaN / null / undefined / "" =>
false,其余的全是true
{}
- 大括号在运算符前面
- 在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
- 出现在预算符的后面,认为是数学运算
0+{}
{}+0
({}+0)
({})+0
Object
在JS中对象的属性名是什么格式的?
- 普通对象的属性名只能是"字符串"(普通对象的属性名可以是基本数据类型)
- 但是普通对象的属性名不能是对象,如果是对象,需要转化为字符串储存
- 普通对象toString 是调取Object.prototype.toString 是用来检测数据类型的
做题
!(!"Number(undefined)");
/* true
1. Number() 只要有非数字元素都是NaN
2. 只有 0 null undefind "" NaN 转化为false,其余全为 true
*/
isNaN(parseInt(new Date())) + Number([1]) + typeof undefined;
/* "2undefined"
1. new Date() 开头非数字
2. parseInt() 从左到右转化,如果开头非数字则为 NaN
3.
*/
Boolean(Number("")) + !isNaN(Number(null)) + Boolean("parseInt([])") + typeof !(null);
/* "2boolean"
1. parseInt/parseFloat 单纯转化数字,所以将 "" [] null {} 是 NaN
2. Number 会将 "" [] null 转换为 0, undefined {} 转化为 NaN
3. 只有 0 null undefind "" NaN 转化为false,其余全为 true
4. + 两边如果没有字符串,都转化为Number(),直到出现字符串
5. typeof 得到的是字符串格式
*/
parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null);
// "2.6number"
isNaN(Number(!!Number(parseInt("0.8"))));
//false
!typeof parseFloat("0");
/* false
只要不是空字符串,都是true
*/
typeof "parseInt(null)" + 12 + !!Number(NaN);
// "string12false"
!typeof (isNaN("")) + parseInt(NaN);
/* NaN
NaN + 任何做任何数字运算都是 NaN
*/
typeof !parseInt(null) + !isNaN(null);
/* "booleantrue"
isNaN() 调用的是 Number()检测方式
*/