JavaScript | 数据类型

34 阅读5分钟

Gemini_Generated_Image_xnle44xnle44xnle.png

在 JavaScript 中,数据类型分为两大类:原始数据类型和引用数据类型。

typeof 操作符

typeof 操作符可以用来判断一个变量的数据类型,它返回一个字符串,表示变量的数据类型。

// 原始数据类型
let a = 10
console.log(typeof a) // 'number'
// 字符串类型
let b = 'hello'
console.log(typeof b) // 'string'
// 布尔类型
let c = true
console.log(typeof c) // 'boolean'
// null 类型
let d = null
console.log(typeof d) // 'object'
// Undefined 类型
let e = undefined
console.log(typeof e) // 'undefined'

原始数据类型

number 类型

number 类型表示数值,包括整数和浮点数。

// 整数类型
let a = 10
console.log(typeof a) // 'number'
// 浮点数类型
let b = 3.14
console.log(typeof b) // 'number'

数字可以有很多操作,比如,乘法 *、除法 /、加法 +、减法 - 等等。

let a = 10
let b = 20
console.log(a * b) // 200
console.log(a / b) // 0.5
console.log(a + b) // 30
console.log(a - b) // -10

string 类型

string 类型表示字符串,用单引号或双引号括起来。

// 字符串类型
let a = 'hello'
console.log(typeof a) // 'string'
let b = 'world'
console.log(typeof b) // 'string'

在 JavaScript 中,有三种包含字符串的方式。

  • 双引号:"Hello".
  • 单引号:'Hello'.
  • 反引号:Hello

双引号和单引号都是“简单”引用,在 JavaScript 中两者几乎没有什么差别。

反引号是 ES6 中新增的一种字符串引用方式,它可以包含变量和表达式,并且可以跨多行。

// 反引号字符串
let a = `hello world`
console.log(a) // 'hello world'
// 包含变量的字符串
let name = '张三'
let age = 18
let message = `我是 ${name},我今年 ${age} 岁`
console.log(message) // '我是 张三,我今年 18 岁'
// 跨多行的字符串
let c = `JavaScript 是世界上
最流行的语言`
console.log(c) // 'JavaScript 是世界上\n最流行的语言'

boolean 类型

boolean 类型表示布尔值,只有两个值:true 和 false。

// 布尔类型
let a = true
console.log(typeof a) // 'boolean'
let b = false
console.log(typeof b) // 'boolean'

null 类型

null 类型表示空值,它只有一个值:null。

// null 类型
let a = null
console.log(typeof a) // 'object'  这是一个历史遗留问题,null 被认为是一个空对象引用, 而不是一个空值, 这在 JavaScript 中是一个错误的设计。
console.log(getType(null)) // "null"  修复了 typeof null === 'object' 的 bug

undefined 类型

undefined 类型表示未定义的值,它只有一个值:undefined。

// Undefined 类型
let a = undefined
console.log(typeof a) // 'undefined'

symbol 类型

symbol 类型表示唯一的标识符,它是 ES6 中新增的一种数据类型。symbol 类型的值是唯一的,不能重复。

// symbol 类型
let a = Symbol('a')
console.log(typeof a) // 'symbol'

引用数据类型

object 类型

object 类型表示对象,它是一种复合数据类型,用于存储多个值。对象可以包含属性和方法。

// 对象类型
let a = {
  name: '张三',
  age: 18,
}
console.log(typeof a) // 'object'

function 类型

function 类型表示函数,它是一种特殊的对象,用于执行特定的任务。

// 函数类型
function test() {
  console.log('hello world')
}
console.log(typeof test) // 'function'

array 类型

array 类型表示数组,它是一种特殊的对象,用于存储多个值。数组可以包含任意类型的值。

// 数组类型
let a = [1, 2, 3, 4, 5]
console.log(typeof a) // 'object'
console.log(getType(a)) // "array"  修复了 typeof [] === 'object' 的 bug

特殊数据类型

date 类型

date 类型表示日期和时间,它是一种特殊的对象,用于处理日期和时间。

// 日期类型
let a = new Date()
console.log(typeof a) // 'object'
console.log(getType(a)) // "date"  修复了 typeof new Date() === 'object' 的 bug

regexp 类型

regexp 类型表示正则表达式,它是一种特殊的对象,用于匹配字符串。

// 正则表达式类型
let a = /hello/
console.log(typeof a) // 'object'
console.log(getType(a)) // "regexp"  修复了 typeof /hello/ === 'object' 的 bug

map 类型

map 类型表示映射,它是一种特殊的对象,用于存储键值对。map 类型的键可以是任意类型的值,而值可以是任意类型的值。

// 映射类型
let a = new Map()
console.log(typeof a) // 'object'
console.log(getType(a)) // "map"  修复了 typeof new Map() === 'object' 的 bug

set 类型

set 类型表示集合,它是一种特殊的对象,用于存储唯一的值。set 类型的元素只能是唯一的,不能重复。

// 集合类型
let a = new Set()
console.log(typeof a) // 'object'
console.log(getType(a)) // "set"  修复了 typeof new Set() === 'object' 的 bug

weakmap 类型

weakmap 类型表示弱映射,它是一种特殊的对象,用于存储键值对。weakmap 类型的键必须是对象,而值可以是任意类型的值。weakmap 类型的键是弱引用的,当键对象不再被引用时,键值对会自动被删除。

// 弱映射类型
let a = new WeakMap()
console.log(typeof a) // 'object'
console.log(getType(a)) // "weakmap"  修复了 typeof new WeakMap() === 'object' 的 bug

weakset 类型

weakset 类型表示弱集合,它是一种特殊的对象,用于存储唯一的对象。weakset 类型的元素只能是对象,不能重复。weakset 类型的元素是弱引用的,当元素对象不再被引用时,元素会自动被删除。

// 弱集合类型
let a = new WeakSet()
console.log(typeof a) // 'object'
console.log(getType(a)) // "weakset"  修复了 typeof new WeakSet() === 'object' 的 bug

数据类型的判断

在 JavaScript 中,有两种方法可以判断一个变量的数据类型:

  1. 使用 typeof 运算符
  2. 使用 instanceof 运算符
  3. 使用 getType 函数

instanceof 运算符

instanceof 运算符用于检查一个对象是否是另一个对象的实例。它的语法如下:

object instanceof constructor

其中,object 是要检查的对象,constructor 是要检查的构造函数。如果 object 是 constructor 的实例,则返回 true;否则返回 false。

let a = [1, 2, 3, 4, 5]
console.log(a instanceof Array) // true

getType 函数

getType 函数可以用来判断一个变量的数据类型。它的实现如下:

function getType(obj) {
  return Object.prototype.toString.call(obj).slice(8, -1)
}