JavaScript 的类型

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
阅读 238

推荐阅读