JS中的数据类型
- 基本数据类型
- number
- string
- boolean
- null
- undefined
- symbol
- bigint
- 引用数据类型
- object
- function
数据类型检测
- typeof 检测数据类型的逻辑运算符
- instanceof 检测是否为某个类的实例
- constructor 检测构造函数
- Object.prototype.toString.call 检测数据类型
typeof [value] 返回当前值的数据类型 "数据类型"
- 返回的结果都是字符串
- 局限性:
- typeof null => 'object'
- typeof 不能细分对象类型(检测普通对象或者数组对象等都是'object')
把其他数据类型转换为数字的方法
- 强转换(基于底层机制转换的) Number([value])
- 一些隐式转换都是基于Number完成的
- isNaN('12px') 先把其他类型值转换为数字再检测
- 数学运算 '12px' - 13
- 字符串==数字 两个等于号比较,很多时候也是要把其他值转换为数字
- ...
- 一些隐式转换都是基于Number完成的
- 弱转换(基于一些额外的方法转换)parseInt([value])/parseFloat([value])
- parseInt 处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找)-> 如果处理的值不是字符串,需要先转换为字符串然后开始查找数字
- Number 直接调用浏览器最底层的数据类型检测机制来完成
- true 1 false 0
- null 0 undefined NaN
- 字符串中必须保证都是有效数字才会转换为数字,否则都是NaN,空字符串值为0
parseInt(""); // NaN 没有找到数字即NaN
Number(""); // 0
isNaN(""); // 先把""转换为数字(隐式Number) isNaN(0) false
parseInt(null); // 先把null转换为字符串"null" parseInt('null') NaN
Number(null); //0
isNaN(null); // 先强制类型转换Number(null) isNaN(0) 0是有效数字所以 false
parseInt("12px"); // 从左往右找,12
Number('12px'); // 包含非数字直接NaN
isNaN('12px'); // 强制类型转换Number('12px') NaN,非有效数字,true
parseFloat("1.6px") + parseInt('1.2px') + typeof parseInt(null); // "2.6number"
isNaN(Number(!!Number(parseInt('0.8')))); // false
typeof !parseInt(null) + !isNaN(null); // "booleantrue"
加号 + 在JS中除了数学运算还有字符串拼接 加号 + 遇到字符串(或者对象,因为对象就是先转换为字符串然后在处理)
[] == true 都转换为数字 结果为 false 首先Number([]) []转换为字符串 '' Number('') 0 true Number(true) 1
- 在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接=>对象本省是需要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,就变成字符串拼接了
- 对象转换为字符串 先调用valueOf 获取原始值(一般都是基本类型值),如果原始值不为基本类型值, 则继续调用toString
== 规律
- 对象 == 字符串, 对象转换为字符串
- null == undefined 但是和其他值都不想等
- NaN和谁(包括自己)都不想等
- 剩下两边不同都是转换为数字
== 在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后在进行比较
=== 绝对相等,两边类型一致,值也一致才想等,类型不一样,直接不对等,不会转换
NaN与任何数字相加都等于NaN
let result = 10 + false + undefined + [] + 'Tencent' + null + true + {}; // 'NaNTencentnulltrue[object Object]'
// 解析
// 10 + false = 10 + 0 = 10 // false强制类型转换为数字0
// 10 + undefined = NaN // 10和undefined相加 undefined强制类型转换为(Number(undefined))NaN,NaN和任何数字相加都为NaN
// NaN + [] = 'NaN' // NaN和[]相加,[]进行转换,先转换为"",此时直接 + 起到 拼接作用,直接输出结果为 NaN + "" = "NaN", (""不会执行Number('')转换了)
// 'NaN' + 'Tencent' = 'NaNTencent'
// 'NaNTencent' + null = 'NaNTencentnull' // 字符串拼接
// 'NaNTencentnull' + true = 'NaNTencentnulltrue' // 字符串拼接
// 'NaNTencentnulltrue' + {} = 'NaNTencentnulltrue[object Object]' // {} 会执行内置方法({}).toString()转换为字符串'[object Object]'
![] == false 运算符优先级 ![] 再算比较 ![] 转换为布尔值进行取反(把其他类型转换为布尔类型遵循的规律: 只有 0/NaN/null/undefined/"" 五个值是false, 其余都是true
![] == false 同等于 !true == false => false == false // true