JS中的数据类型
数据类型的分类
- 基本数据类型
- number
- string
- boolean
- null
- undefined
- symbol
- bigint
- 引用数据类型
- object
- 普通对象
- 数组对象
- 正则对象
- 日期对象
- Math数学函数对象
- ...
- function
- object
数据类型的检测
- typeof 检测数据类型的逻辑运算符
- instanceof 检测是否为某个类的实例
- constructor 检测构造函数
- Object.prototype.toString.call 检测数据类型的
检测特殊类型
- typeof null ==> "object"
- typeof undefined ==> "undefined"
- typeof {} ==> "object"
- typeof [] ==> "object"
- typeof NaN ==> "Number"
把其它数据类型转换为数字的方法
- 强转换(基于底层机制转换的) Number([value])
- 一些隐式转换都是基于Number完成的
- isNaN('12px') 先把其它类型值转换为数字在检测
- 数学运算 '12px'-13
- 字符串==数字 两个等于号比较很多时候也是要把其它值转换为数字
- ...
- 一些隐式转换都是基于Number完成的
- 弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])
typeof检测的注意
typeof [value] 返回当前值的数据类型 "数据类型"
- 返回的结果都是字符串
- 局限性:
- typeof null => "object"
- typeof 不能细分对象类型(检测普通对象或者数组对象等都是"object")
typeof检测题目
let a = typeof typeof typeof [12, 23];
console.log(a); //=>"string"
/*
* typeof [12, 23] =>"object"
* typeof "object" =>"string"
* ...
*/
if ("哈哈" == NaN) {
// 条件是否成立? NaN!=NaN 它和谁都不相等,包括和自己本身也不相等
}
isNaN(值) 检测这个值是否为有效数字,如果不是有效数字返回TRUE,是有效数字返回FALSE
let res = parseFloat('left:200px'); //=>NaN
if (res === 200) {
alert(200);
} else if (res === NaN) { //NaN!=NaN
alert(NaN);
} else if (typeof res === 'number') { //=>typeof NaN => "number"
alert('number');
} else {
alert('Invalid Number');
}
Number 直接调用浏览器最底层的数据类型检测机制来完成
特点:
- true 1 false 0
- null 0 undefined NaN
- 字符串中必须保证都是有效数字才会转换为数字,否则都是NaN
parseInt("") //NaN
/*
*parseInt 处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找) -> 如果处理的值不是字符串,需要先转换为字符串然后在开始查找接
*/
Number("") //0
isNaN("") //先把""转换为数字(隐式 Number) isNaN(0) false
parseInt(null) //parseInt('null') NaN
Number(null) //0
isNaN(null) // isNaN(0) false
parseInt("12px") //12
Number("12px") //NaN
isNaN("12px") //isNaN(NaN) true
parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null);
//1.6 + 1 + typeof NaN => 2.6 + 'number' -> '2.6number'
//加号遇到字符串就会变成字符串拼接
isNaN(Number(!!Number(parseInt("0.8"))));
// isNaN(0) false
typeof !parseInt(null) + !isNaN(null);
// 'booleantrue'
let result = 10 + false + undefined + [] + 'Tencent' + null + true + {};
// console.log(result);
// 10 + 0 10
// 10 + undefined NaN
// NaN + [] 'NaN'
// 'NaN' + 'Tencent' 'NaNTencent'
// 'NaNTencentnulltrue[object Object]'
1. 0 NaN null undefind 空字符串 转化为布尔值都是假 []==true 两个等号比较的时候,如果左边是对象,右边是布尔,都转换为数字 过程:1.空数组首先调用隐藏式类型转换 Number([])转化成空字符串Number('')==>0 2.true转化成数字也是1,所以结果是false 2. 在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接 =>对象本身是要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,不好意思就变为字符串拼接了
等号的比较
- "==" 在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后在进行比较!
规则:
- 对象==字符串 对象转换为字符串 [10] == '10' true
- null == undefined (三个等号下不相等),但是和其它任何的值都不相等 0 == null false
- NaN和谁(包括自己)都不相等
- 剩下的情况都是转换为数字在做比较的
- "===" 绝对相等,两边类型一致,值也一致才相等,类型不一样,直接不对等,不会转换