JavaScript数据类型
number
string
boolean
null
undefined
symbol
static Symbol
Symbol.prototype
bigint
object
普通对象
数组对象
正则对象
日期对象
Math数学函数对象
JSON对象
Set
Map
…
function
普通函数
箭头函数
构造函数
生成器函数
匿名函数
自调用函数
…
数据类型检测
typeof 检测数据类型的逻辑运算符
instanceof 检测是否为类的实例
constructor 检测构造函数
Object.prototype.toString.call 检测数据类型
typeof [value] 返回当前值的数据类型,返回的数据类型是字符串
返回的结果都是字符串
局限性:
typeof null => “object” 类型
typeof 不能细分对象类型(检测普通对象或数组对象等都是返回"object")
原理:
所有的数据类型值在计算机中都是按照“二进制”进行存储
null的二进制值是“000000”
只要是对象都是以“000”开始的
typeof检测时是按照计算机存储的二进制值来检测的,所以检测null时也是返回“object”
把其它数据类型转换为数字的方法:
强转换(基于底层机制转换) Number(value)
一些隐式转换是基于Number完成的
isNaN(‘12px’) 先把其它类型值转换为数字再检测
数学运算 “12px” - 13
字符串 == 数字 两个等于号比较很多时候也是要把其它类型值转换为数字
…
弱转换(基于额外的方法转换)parseInt(value)/parseFloat(value)
数据类型转换及面试题:
let a = typeof typeof typeof [ 12 , 23 ]
console. log ( a)
NaN 跟任何值都不相等,包括它自己,与任何值相加都是NaN
let res = parseFloat ( "left:200px" ) ;
if ( res === 200 ) {
alert ( 200 ) ;
} else if ( res === NaN ) {
alert ( NaN )
} else if ( typeof res === "number" ) {
alert ( "number" )
} else {
alert ( "Invalid Number" )
}
parseInt/parseFloat 处理的值是字符串,先从字符串左侧开始查找有效数字字符(遇到非有效数字字符则停止查找) 如果处理的值不是字 符串,需要先转换为字符串然后再开始在开始查找
parseInt([value],[radix])传2个参数的转换规则:
[radix]表示是一个进制,不写或者写0默认都是按照10进制处理,(特殊情况:如果value是以0x开头则默认是16进制)
进制有一个取值范围:2-36之间,如果不在这个范围内,则转换结果一定是NaN
把value看做是radix进制,最后把radix进制转换为10进制
Number 直接调用浏览器最底层的数据类型检测机制来完成 + true 1 flase 0 + null 0 undefined NaN + 字符串中必须保证都是有效数字才会转换为数字,否则都是NaN
== 两个等号比较时 + 对象==字符串,对象转换为字符串 + null == undefined 返回true (===返回false),但是和其它值都不相等 + 0 == null 返回false null和undefined在进行等号比较时不进行数据类型转换 + 其余两边不同都转换为数字
=== 三个等号比较时:两边类型一致,值也一致才相等,类型不一样直接不对等,不会转换
0 NaN null undefined “” 转换为布尔类型都是false,其余的都是true
大括号与运算符结合: + 大括号在运算符前面并且没有小括号处理优先级,则不认为是数学运算,加了小括号后才会运算 + 如果大括号出现在运算符后面则认为是数学运算
普通对象toString()是调用Object.prototype.toString()用来检测数据类型的,返回’[object Obj