更新个··.因为es10又增加了!
定义
最新的ECMAScript中定义了8种数据类型JavaScript 数据类型和数据结构 :
7种原始类型:Boolean、Null、Undefined、Number、String、Symbol (ECMAScript 6 新定义)、BigInt(ECMAScript 10 新定义),和Object。
至于平时经常使用的Array、Function、Date...都是Object类型。
类型判断
1.typeof判断
使用typeof判断数据类型,只能判断出原始数据类型和Object,其中原始类型的null还会被判断为Object,另外对象类型下的其他子类型除function外也都会被判定为Object。
//可以判断的类型
typeof null //"object"
typeof undefined //"undefined"
typeof 123 //"number"
typeof '2222' //"string"
typeof true //"boolean"
typeof Symbol(22) //"symbol"
typeof 222n // "bigint"
typeof {} //"object"
typeof function a(){} //"function"
//判断不了具体的object类型
typeof [2,3,4] //"object" Array类型无法判断
typeof new Date() //"object" Date类型无法判断
2.原型判断方法
原理:实例对象上的__proto__属性指向构造函数的原型,构造函原型上的constructor属性指向构造函数本身,在构造函数本身上有个name属性,可以告诉我们构造函数叫啥,所以我们可以利用这点进行判断。但是undefind和null并不能用此方法判断会报错。
function testType(value){
return value.constructor.name //可以直接访问到原型上的方法
}
testType(null) //报错!null并没有__proto__属性,毕竟它本质不是个对象,undefined和null相同就不列举了
testType(666) //"Number"
testType(true) //"Boolean"
testType(new Date()) //"Date"
testType([2,3,4,5]) //"Array"
testType('wwww') //"String"
testType(/8*/) //"RegExp"
原型链的方法缺点是constructor属性可以修改,也不安全。
类型转换
Number类型转换
转换场景
- isNaN检测的时候,检测的值不是数字类型,浏览器会自己调用Number方法把它先转换为数字,再检测是否为非有效数字。
- 基于parseInt/parseFloat/Number去手动转换为数字类型。
- 数学运算:+、-、*、/、%(‘+’不仅是数学运算符,可能是字符串拼接)。
- 在基于‘==’比较时,有时候也会把其他转换成数字类型
转换规律
使用Number方法进行转换,浏览器自行转换都基于此方法。
- 字符串转换为数字:
只要遇到一个非有效数字字符,结果就是NaN。‘’ -> 0, 空字符串都为0
。 - 把布尔转换为数字:
true -> 1, false -> 0
。 - 把没有转换为数字:
null -> 0,undefined -> NaN
。 - 把引用类型值转换为数字:
先都转换为字符串(toString), 然后再转换为数字(Number)
。
String类型转换
转换场景
- 基于alert/confirm等方法输出内容的时候,会把输出值转换为字符串,再输出。
- 基于'+'进行字符串拼接的时候。
- 把引用类型转换为数字的时候。
- 给对象设置属性名。如果不是字符串,先转化为字符串,然后再当作属性储存到对象中(对象的属性只能是数字或者字符串)。
- 手动调用toString/join/String等方法的时候。
转换规律
调用方法toString进行转换
- 除了对象,都是大家理解的结果:
1->'1', NaN->'NaN', []->'', [2,3]->'2,3'
。 - 对象都是"[object Object]":
{}->"[object Object]"
Boolean类型转换
转换场景
- 基于!/Boolean等方法转换
- 条件判断中的条件最后都会转换为布尔类型
转换规律
只有0/NaN/‘’/null/undefined五个值转换为false,其余都是转换为true。
特殊情况:数学运算和字符串拼接‘+’
当表达式中出现字符串,就是字符串拼接,否则就是数学运算
1 + true // 2
'1' + true //'1true'
[12] + 10 //'1210' 引用类型转换为数字,会先转换为字符串,所以变成了字符串拼接
({}) + 10 //"[object Object]10"
[] + 10 // '10'
{} + 10 //10 它不是数学运算,也不是字符串拼接,它是两部分代码:{}; + 10
特殊情况:‘==’左右两边数据类型不一样,先转换为相同类型,再进行比较
- 对象 == 对象:
地址相同才相等
- 对象 == 数字:
把对象转换为数字
- 对象 == 布尔:
都转换为数字
- 对象 == 字符串:
都转换为数字
- 字符串 == 数字:
把字符串转换为数字
- 字符串 == 布尔:
都转换为数字
- 布尔 == 数字:
把布尔转换为数字
总结:不同情况的比较,都是把其它值转换为数字,再进行比较。
- 特殊:
null == undefined //true
null === undefined //false
null&&undefined //和其他都不相等
NaN == NaN:false
NaN和谁都不相等
参考:js中数据类型转换总汇