JS 数据类型 | 类型确认 | 类型转化 隐式转化规则
JS 数据类型
最新的 ECMAScript 标准定义了 8 种数据类型:
七种 基本数据类型:
Boolean
,有 2 个值分别是:true 和 false。null
,一个表明 null 值的特殊关键字。JavaScript 是大小写敏感的,因此 null 与 Null、NULL或变体完全不同。undefined
,和 null 一样是一个特殊的关键字,undefined 表示变量未赋值时的属性。Number
,整数或浮点数,例如: 42 或者 3.14159。BigInt
,可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。String
,字符串是一串表示文本值的字符序列,例如:“Howdy”。Symbol
(在 ECMAScript 6 中新添加的类型)。一种实例是唯一且不可改变的数据类型。
以及对象(Object
)。
Math
Error
基本(原始)类型的方法不可以修改基本类型的“原始值”。变量被重新赋值与这里的概念不同
null == undefined // true
// 原因: 值 undefined 实际上是从 值 null 派生来的
NaN == NaN // false
// 原因:非数有无数种值,显然不是指向某一个地址。而它又是算数运算的结果 因而它是 number 类型。
类型确定
参考博客
需要确定的问题:
- 原始类型还是引用类型,进一步具体的类型
- null 和 undefined
1. typeof 单目
- 可准确判断 除null 的 原始类型,返回对应小写类型名
- 可准确识别 Function 返回“function”
- 其余都返回 object (*特:包括null)
包括 ES6 扩展:
typeof new Map() / Set() // 'object' typeof Symbol() // 'symbol' 属于原始类型
2. instanceof 双目
其通过构造函数 区分 引用类型
除了针对引用类型 以对象方式创建的原始类型亦可通过此法判断
xxobj instanceof 对应类型构造函数 // true or false
特点: 无法直接判断出 纯 Object
所有引用类型 instanceof Object // 都为 `true`,此判断应放在最后。
可利用此特性作为判断是否为引用类型
// null 并非 引用类型,因此 instanceof 无法识别 null
null instanceof Null // 错误 Null is not defined
// 结合 typeof 和 instanceof 可以判断是否为 null
null instanceof Object // false
typeof null // 'object'
包括 ES6 扩展:
new Map() instanceof Map // true // 对象时也为 true new Set() instanceof Set// true // 对象时也为 true
3. 已知为对象,访问对象实例的 constructor 属性
仅对构造对象有效 可以准确判断区分 特殊对象(数组、日期等) 和 一般对象
该属性保存了对象的构造函数
对象.constructor === 相应的类型构造函数进行比较
obj.constructor ==/=== Object
obj.constructor ==/=== Array
包括 ES6 扩展:
new Map().constructor == Map // true new Set().constructor == Set// true
仍然未解决 typeof 无法识别 null 的问题 需与typeof 结合判断
null 没有构造函数
4. Object.prototype.toString.call(target)
不需要考虑特殊情况,万金油
理论基础:理论上来讲原始类型也是对象
可以通过 原型.toString 配合匹配相应类型名 确定是否为该类型 也可以直接裁剪
Object.prototype.toString.call(obj) // '[object Object]'
Object.prototype.toString.call(arr) // '[object Array]'
Object.prototype.toString.call(date) // '[object Date]'
Object.prototype.toString.call(str) // '[object String]'
Object.prototype.toString.call(num) // '[object Number]'
Object.prototype.toString.call(bool) // '[object Boolean]'
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
Object.prototype.toString.call(Symbol()) // '[object Symbol]' ES6
Object.prototype.toString.call(new Map()) // '[object Map]' ES6
Object.prototype.toString.call(new Set()) // '[object Set]' ES6
Object.prototype.toString.call(target).slice(8, -1)
// 截取有效部分
Object.prototype.toString.call(target).slice(8, -1) === 'Xxxx'
5. jQuery.type()
类型转化
隐式转化
算数运算符
- 操作数会尝试转化为数字进行计算。
特殊的:
- 当
+
运算符中有字符串时,另一个操作数自动.toString
但当该
+
为一元运算符 如x= + '2'
时,字符串会被转化为数字;
注意+=
本质上还二元
- 如果
+
操作数是对象的话,会先调用对象的toString()
方法(有valueOf
方法则直接调用valueOf
),再尝试转化为数字运算
0 * infinty => NaN
- 比较运算符 会试图将操作数 转化为数字 进行比较
// 经典面试题
1<2<3 // 1<2 === true => 1 | 1<3 true
1<0<3 // 1<0 === false => 0 | 0<3 true
类型转化的方法
转化为字符串
1. .toString()
2. String()
转化为数值
1. Number()
对于除去字符串拼接的算数运算,操作数会自动转化为数字
Data提供的.getTime()也是一种转化数字的方法
Number(undefined) // NaN
Number(null) // 0
2. parseInt() /parseFloat()
转化为布尔类型
0,-0,"",undefined,null,NaN
内容会不断更新,欢迎批评指正。
分类:
# JavaScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)