js中的数据类型

295 阅读4分钟

更新个··.因为es10又增加了!

定义

最新的ECMAScript中定义了8种数据类型Java​Script 数据类型和数据结构

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 == NaNfalse
NaN和谁都不相等

参考:js中数据类型转换总汇