本文代码全是题目,用于检验知识掌握程度,简单的不会解析,直接给答案
数据类型
- 基本类型
- number
- string
- boolean
- null
- undefined
- symbol
- bigint
- 引用类型
- object
- 普通对象
- 数组对象
- 正则对象
- 日期对象
- Math数学函数对象
- ...
- function
- object
数据类型检测
- typeof 检测数据类型的逻辑运算符
- instanceof 检测是否为某个类的实例
- constructor 检测构造函数
- Object.prototype.toString.call 检测数据类型
typeof 特点
-
返回结果都是字符串
-
局限性
- typeof null => object
所有的值在内存中都是二进制存储的,而null代表空指针,其值全为0,而类型判断时,发现前三位为000,所以被认为是对象
- typeof 不能细分对象类型(检测普通对象或者数组对象等都是'object')
面试题:
let a = typeof typeof typeof [12, 23]
console.log(a); // 'string'
Number类型
- 常规数值
- NaN - 代表不是一个有效数字
- infinity - 无穷大的值
- -infinity - 无穷小的值
- parseInt / parseFloat()
- Number()
- ...
NaN
特点:NaN和任何类型值都不相等,NaN和自身也不相等
判断:isNaN 用于判断是否为NaN
let res = parseFloat('left: 200px');
if (res === 200) {
alert(200)
} else if (res === NaN) {
alert(NaN)
} else if (typeof res === 'number') {
alert('number') // 'number'
} else {
alert('Invaild Number')
}
解析:parseFloat
、parseInt
的特点是接收一个字符串,从左到右进行查找(遇到非有效数字字符则停止查找),如果处理的不是字符串,会先转换为字符串再进行查找,如果结束是没有找到任何有效数字,则返回NaN。所以res = NaN
,NaN和任何类型值都不相等,但它是个数值类型,所以会输出'number'
把其他数据类型转换为数字的方法
- 强转换(基于底层机制转换的),底层机制就是通过Number([value])
- 隐式转换都是基于Number()完成的
- isNaN('12px') - 先把其他类型值转换为数字再检测
- 数学运算 '12px' - 13
- 字符串 == 数字 两个等号比较,很多时候需要把其他值转换为数字
- 隐式转换都是基于Number()完成的
- 弱转换(基于一些额外的方法),parseInt() / parseFloat
parseInt('') // NaN
Number('') // 0
isNaN('') // '' => 0,false
parseInt(null) // NaN
Number(null) // 0
isNaN(null) // isNaN(0) => false
parseInt('12px') // 12
Number('12px') // NaN
isNaN('12px') // true
parseFloat('1.6px') + parseInt('1.2px') + typeof parseInt(null)
// 1.6 + 1 + typeof NaN => '2.6Number'
isNaN(Number(!!Number(parseInt('0.8'))))
// !!Number(0) => Number(0) => false
typeof !parseInt(null) + !isNaN(null)
// typeof true + !isNaN(0) => 'boolean' + true => 'booleantrue'
// 压轴题
let res = 10 + false + undefined + [] + 'Tencent' + null + true + {}
console.log(res)
/**
* 10 + false => 10 + 0 => 10
* 10 + undefined => 10 + Number(undefined) => 10 + NaN => NaN
* NaN + [] => NaN + '' => 'NaN'
* NaN + 'Tencent' => 'NaNTencent'
* 'NaNTencent' + null + true => 'NaNTencentnulltrue'
* 'NaNTencentnulltrue' + {} => 'NaNTencentnulltrue' + ({}).toString() =>
* 'NaNTencentnulltrue' + '[object Object]' =>
* 'NaNTencentnulltrue[object Object]'
+加号
特点:遇到字符串(或者对象,因为对象就是先转换为字符串然后再处理),那么就不是数值运算,而会转变成字符串拼接
==转换规律
- 对象==字符串,对象转换为字符串进行比较
- null == undefined,但是和其他值都不相等
- 两边不同类型,都转换为数字
网友评论