数据类型
基本数据类型:
- String,字符串
- Number,整数或浮点数
- Boolean,布尔值,有两个值,true和false
- null,一个表明null值得特殊关键字,与Null和NULL是不同的
- undefined,变量未赋值时的属性
- Symbol,ES6的新特性,是一种实例,唯一且不可改变
- BigInt,任意精度的整数,可以安全地存储和操作大证书,甚至可以超过数字的安全整数限制(可以通过整数末尾带‘n'来创建BigInt值)
引用数据类型:
Array、Object、Function
类型转换
引入:typeof操作符
typeof()能够返回每一种数据到底是什么类型的,能够区分数据与数据之间的不同。 typeof可以返回以下几种类型:
typeof返回的结果是string类型的
- 'number'
- 'string'
- 'boolean'
- 'undefined'
- 'object '(不是单纯的指对象,而是泛泛地指引用类型,例如对象{},数组[],null)
那null不是原始类型吗? => 因为最早的时候,null是代替空对象出现的,给对象占位的。但是null绝对不是一个object
- 'function'
- 'symbol'
- 'bigint'
typeof有两种写法:可以在后面加括号,也可以在后面加空格
typeof(123) //number
typeof('123') //string
typeof(null) //object
typeof({}) //object
typeof([]) //object
typeof function(){} //function
typeof undefined //undefined
typeof Symbol() //symbol
typeof 123n //bigint
typeof(typeof a) //string typeof a返回的是’undefined‘
显示类型转换
1、Number(mix)
可以将任意类型的参数mix转换为数值类型,如果该值不能被转换,则返回NaN
根据ES5规范,Number[[value]],返回的值是通过调用ToNumber(value)方法,如果没有value,则返回 +0
ToNumber:
| Argument Type | Result |
|---|---|
| undefined | NaN |
| null | +0 |
| Boolean | 如果为true,则返回1;为false,返回0 |
| Number | 返回与value相等的结果 |
| String | 遵循以下规则:1、如果只包含数字,则将其转换为十进制;2、 如果是空字符串,则转换为0;3、 如果都不是以上的格式,则转换为NaN |
| Object | 设 primValue 为 ToPrimitive(input argument, hint Number)。返回 ToNumber(primValue) |
// (1) 如果mix为字符串,字符串为数值,则返回数字;为空,则返回0;其余返回NaN
Number('123') //123
Number('abc') //NaN
Number('') //0
// (2) 如果为布尔值,true返回1,false返回0
Number(true) //1
Number(false) //0
// (3) 如果是null,返回0
Number(null) //0
// (4) 如果undefined,返回NaN
Number(undefined) //NaN
// (5)如果是数值,返回本身
Number(123) //123
2、parseInt(string,radix)
parseInt有两种用法:
第一种传入一个参数:将参数转换为整数类型的数值。
目的不是转换成数,而是转换成整型的数。
从数字位开始看,看到非数字位截止
// (1)如果为数值,则返回本身
parseInt(123) //123
// (2)如果为布尔值,null,undefined,则转换为NaN
parseInt(true) //NaN
// (3)如果是浮点类型,则只保留整数(不是四舍五入,是直接去掉)
parseInt(123.3) //123
第二种传入两个参数:第一个参数是要转换的字符串,第二个参数是基底。
以目标进制为基底转换为10进制的数。
// 举一个例子
parseInt('10',16) //16
//就是把’10‘ 当成16进制的数去转换为十进制
3、 parseFloat(string)
与parseInt极其相似,将参数转换为浮点数类型的数值。
从数字位开始看,看到除了第一个点以外的非数字位截止
parseFloat('100.2') //100.2
parseFloat('100.2abc') //100.2
4、 toString(radix)
作用和String一样,将值转换为字符串,但是用法和String()不一样
想把‘谁’转换为字符串,就用‘谁’.toString()
但是有两个特殊点,undefined和null不能使用toString()方法
toString()携带一个参数radix基底,但和parseInt()的用法不一样,这个基底是将10进制为目标进制转换为radix的进制的字符串
let num = 123
num.toString() //'123'
let n = null
n.toString() //TypeError: Cannot read properties of null (reading 'toString')
num.toString(8) //'173'
//将123 转换为8进制的字符串
5、 String(mix)
与Number类似,将任意类型的参数mix转换为字符串
根据ES5规范,String[[value]],返回的值是通过调用ToString(value)方法,如果没有参数value,则返回空字符串
// 把任意类型的参数都转换为字符串
String(123) //'123'
String(true) //true
String(null) //'null'
String(undefined) //'undefined'
String() //''
6、 Boolean(mix)
与Number、String类似,将任意类型的参数mix转换为布尔值
false、’ ‘、0、NaN、null、undefined都会被转换成false,其余任何参数都会被转换成true
根据ES5规范,调用的是ToBoolean(value)方法
// 传入false、’’、0、NaN、null、undefined
Boolean(false) //false
Boolean('') //false
Boolean(0) //false
Boolean(NaN) //false
Boolean(null) //false
Boolean(undefined) //false
Boolean(123) //true
隐式类型转换
隐式类型转换内部调用的都是显示类型的方法
1、 isNaN()
判断一个值是不是NaN,并返回
isNaN(NaN) //true
isNaN(123) //false
isNaN('123') //false
isNaN('abc') //true
isNaN(null) //false
//因为Number(null)转换为+0,不是NaN,所以返回false
isNaN()内部做了一件事,就是先把值通过Number()进行转换,再通过转换的值和NaN进行比对
2、++/--,+/-(一元正负)
也是先将值通过Number()进行转换,再进行运算
let a = '123'
++a //124
let b = 'abc'
++b //NaN
+a //123
+b //NaN
3、+(加号)
当加号两侧,有一侧是字符串的话,内部就会调用String(),把两侧都变成字符串
如果是布尔值加数字,则使用Number()将布尔值转换成数字再进行运算
'a'+1 //'a1'
4、- * / %
内部调用Number(),都会把数据转换成数字类型
'1' * 1 //1
'a' * 1 //NaN Number('a') * Number(1)
5、 && || !
&&和||返回的是表达式的值,不是隐式类型的值,但是前后判断是隐式类型的值
内部都是调用的Boolean()方法
6、> < >= <= == !=
当有数字进行比较的时候,调用Number()方法
当是字符串进行比较的时候,没有隐式类型转换,比较的是ascll码
当布尔值和其他类型的值进行比较的时候,先将布尔值通过Number()进行转换,再进行比较
1 < '2' //true
'3' > '2' //false
true > 0 //true
NaN和其他任何类型比较永远返回false(包括他自己)
null == undefined比较结果是true,除此之外,null、undefined和其他任何比较都为false(不包括自身)
NaN == NaN //false
1 == '1' //true
false == 0 //true
null == undefined //true
null == 2 //false
不发生类型转换
=== !==
绝对等于和绝对不等于
1 === 1 //true
1 === ’1‘ //false
NaN === NaN //false
判断数据类型的方法
常见的判断js数据类型的方法有以下几种
typeof操作符
typeof的问题就是,无论传入的对象是什么类型的,都返回'object'。
总的来说,typeof对对象类型的值不能准确地判断出类型,但是能够准确地判断基本数据类型的值。
因此引入了instanceof操作符
instanceof
语法 A instaceof B,判断A是否为B的实例
内部机制是判断对象和构造函数在原型链上是否有关系,如果有关系,返回真,否则返回假。