数据类型及判断数据类型的方法

87 阅读6分钟

数据类型

基本数据类型:

  • 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 TypeResult
undefinedNaN
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的实例

内部机制是判断对象和构造函数在原型链上是否有关系,如果有关系,返回真,否则返回假。