JavaScript 的数据类型
JavaScript 是一种弱类型或者说动态语言,这意味这你不用提前声明变量的类型,在程序运行的过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据,比如:
// foo is a Number now
let foo = 42
// foo is a String now
foo = 'test'
// foo is a Boolean now
foo = true
最新的ECMAScript标准定义了8中数据类型:
- 7 种原始数据类型:
- Null
- Undefined
- Boolean
- Number
- String
- BigInt
- Symbol
- 和 Object
Symbol(符号)是ECMAScript第6版新定义的,符号类型是唯一的且不可修改的,也可以用来做对象的key的的值
Object 常用的有标准的对象({})、数组、函数、日期、正则等
类型判断(检测)
typeof
typeof 对于原始数据类型(null除外)和function可以进行准确的识别,其它一律识别为object
instanceof
一般用作判断对象a是否是另一个对象A的实例,原理是判断对象a的构造函数A的原型对象是否出现在了a的原型链上,不理解的可以参考 instanceof原理
isArray
用来判断一个对象是否是数组类型,比如:
// true
console.log(Array.isArray([1, 2]))
constructor
判断一个对象是否属于另一个对象的实例,比如:
const num = new Number(1)
// true
console.log(num.constructor === Number)
好用的 Object.prototype.toString
以上介绍的几种判断数据类型的方法或多或少都有一些局限性,不够通用,Object.prototype.toString 是一个通用的类型判断方法,结果格式为:'[object, Xxxx]',比如:
// [object Null]
console.log(Object.prototype.toString.apply(null))
// [object Number]
console.log(Object.prototype.toString.apply(1))
// ...
类型转换
在使用 JavaScript 变量的时候,有时候会涉及类型转化,比如显示的将字符串 '1' 转换为数字 1, Number('1');当然还有隐式的类型转换,通常发生在+、-、*、/、==、===、>、<等运算符
显示转换
显示类型的转换很简单,直接用Type(xxx)即可,比如:
// 1
console.log(Number('1'))
// '1'
console.log(String(1))
具体的转换过程同隐式类型转换一致
隐式转换
基本类型转换
备注
console.log(Number(null)) // 0
console.log(Number(undefined)) // NaN
+ 运算符
- 字符串 + 任意基本类型的数据 =》任意类型 转成 字符串,然后做字符串拼接
- 非字符串基本类型 + 非字符串基本类型 =》都会统一 转成 数字, 然后进行运算
-、*、/、>、< 运算符
- 任意基本类型 转成 数字,然后进行运算,如果无法转换成数字,则结果为 NaN
==、=== 运算符
- 任意基本类型 和 数字 进行比较时都会先转换成数字,然后进行 判等(==、===)
- 字符串 和 布尔值 进行判等,先将两者 转成 数字,然后进行 判等
- === 运算符既比较值,还要比较值的类型
- undefined、null 和 false不相等
console.log(undefined == null) // true
console.log(undefined === null) // false
console.log('0' == false) // true, 转换成数字都为 0
console.log(null == false) // false
console.log(undefined == false) // false
引用类型转换
两个引用类型相比较,结果为false,因为对象比较,比较的是存放值的引用地址,两个对象的地址肯定不相等,所以为false,当然直接赋值的就是相等的,两个指向同一个内存地址 当引用类型和基本类型相比较时,会先将对象转成基本类型,然后进行比较,后续的比较时的转换过程同上面的基本类型一致
- 对象 转 布尔值,永远为 true
对象一般都会继承 valueOf 和 toString 方法,当然也可以自定义这两个方法,当对象和基本类型进行运算时,会调用对象的valueOf方法将对象转换成 字符串、数字 或 本身,而调用toString时肯定会转成字符串,一般默认调用valueOf方法,如果没有valueOf则调用toString
- 对象转数字,调用valueOf,当然调用valueOf不一定会转成数字
- 对象转字符串,调用toString