数据类型
数据类型
js 中的数据类型分为,基本数据类型 和 引用数据类型
基本数据类型
常见的基本数据类型:
boolean
布尔值string
字符串number
数字null
空值undefined
未定义symbol
符号
区别
string
、number
、boolean
、symbol
这四种类型统称为原始类型symbol
表示独一无二的值,通过Symbol
函数生成,生成的symbol
值为原始类型,所以Symbol
函数不能使用new
调用null
和undefined
通常认为是特殊值,值是唯一的,就是其本身
TIP
基本数据类型大多数是一些简单是数据段,它们 存放在栈中
引用数据类型
常见引用数据类型有:
Object
(对象)Array
(数组)Function
(函数)Date
(时间)RegExp
(正则)- 等等。。。
TIP
原始类型存储的是值,对象类型存储的是地址(指针),存在栈中
引用类型的 数据 是保存在 堆中的
js 中对引用数据类型的操作,都是操作的对象的引用,而不是对象
数据类型判断
常见的三种判断方式,分别:typeof
、instanceof
和 Object.prototype.toString()
typeof
typeof
对于原始数据类型,除了 null
都可以正常显示
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof
对于 引用类型,并不能准确判断
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
instanceof
检测构造函数的 prototype
是否出现在被检测的对象的原型链上
它不能检测 null 和 undefined
[] instanceof Array // true
({}) instanceof Object // true
(()=>{}) instanceof Function // true
注意:instanceof 也不是万能的。原型链的问题
let arr = []
let obj = {}
arr instanceof Array // true
arr instanceof Object // true
obj instanceof Object // true
Object.prototype.toString()
判断原理:Object.prototype.toString方法的原理
Object.prototype.toString()
返回的 [object Class]
Class
指的是其检测出的数据类型,这是我们判断数据类型的关键
// 基础类型
Object.prototype.toString.call({}) // '[object Object]'
Object.prototype.toString.call([]) // '[object Array]'
Object.prototype.toString.call(() => {}) // '[object Function]'
Object.prototype.toString.call('seymoe') // '[object String]'
Object.prototype.toString.call(1) // '[object Number]'
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call(Symbol()) // '[object Symbol]'
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
// 引用类型
Object.prototype.toString.call(new Date()) // '[object Date]'
Object.prototype.toString.call(Math) // '[object Math]'
Object.prototype.toString.call(new Set()) // '[object Set]'
Object.prototype.toString.call(new WeakSet()) // '[object WeakSet]'
Object.prototype.toString.call(new Map()) // '[object Map]'
Object.prototype.toString.call(new WeakMap()) // '[object WeakMap]'
数据类型转化
将值从一种类型转换为另一种类型称为类型转换
在 JavaScript 中类型转换都属于强制类型转换。
强制类型又分为隐式强制类型和显式强制类型
let a = 10
let b = a + '' // 隐式强制类型
let c = String(a) // 显式强制类型
隐式类型转换
- 通过 ToNumber 将值转换为数字,只要有 number 参与就会转换
参数 | 结果 | 过程 |
---|---|---|
true | 1 | true 转换为数字 1 |
null | 0 | null 转换为 数字 0 |
undefined | NaN | undefined 转换为数字是 NaN |
['5'] | 5 | ['5'] 首先转换变成'5' ,然后变成数字5 |
强制类型转换
转换成 Number 类型方法:
Number()
、parseFloat()
、parseInt()
转换成 String 类型方法:
String()
、toString()
转换成 Boolean 类型 方法:
Boolean()
面试题
- const 为什么不能重新赋值、重新声明
- const 指针指向不可以改变,指向地址的内容是可以改变的
- 因为 const 只是保证了对象的的指针不变,而对象的内容改变不会影响到指针的改变,所以对象属性是可以修改的