JS 数据类型 | 类型确认 | 类型转化 隐式转化规则

JS 数据类型

最新的 ECMAScript 标准定义了 8 种数据类型:
七种 基本数据类型:

  1. Boolean,有 2 个值分别是:true 和 false。
  2. null,一个表明 null 值的特殊关键字。JavaScript 是大小写敏感的,因此 null 与 Null、NULL或变体完全不同。
  3. undefined,和 null 一样是一个特殊的关键字,undefined 表示变量未赋值时的属性。
  4. Number,整数或浮点数,例如: 42 或者 3.14159。
  5. BigInt,可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。
  6. String,字符串是一串表示文本值的字符序列,例如:“Howdy”。
  7. Symbol (在 ECMAScript 6 中新添加的类型)。一种实例是唯一且不可改变的数据类型。

以及对象(Object)。

基本类型(原始数据)
Number
BigInt
String
Boolean
Undefined
Null
Symbol
引用类型 Object
Date
Regexp
Array
JSON
Object
Function
Map、WeakMaps
Set、WeakSets

Math
Error

基本(原始)类型的方法不可以修改基本类型的“原始值”变量被重新赋值与这里的概念不同

null == undefined // true
// 原因: 值 undefined 实际上是从 值 null 派生来的

NaN == NaN // false
// 原因:非数有无数种值,显然不是指向某一个地址。而它又是算数运算的结果 因而它是 number 类型。

类型确定

参考博客
需要确定的问题:

  1. 原始类型还是引用类型,进一步具体的类型
  2. null 和 undefined

1. typeof 单目

  1. 可准确判断 除null原始类型,返回对应小写类型名
  2. 可准确识别 Function 返回“function”
  3. 其余都返回 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(class {}) // '[object Function]'

Object.prototype.toString.call(target).slice(8, -1)

// 截取有效部分
Object.prototype.toString.call(target).slice(8, -1) === 'Xxxx'

5. jQuery.type()

类型转化

隐式转化

算数运算符

  1. 操作数会尝试转化为数字进行计算。
    特殊的:
  • + 运算符中有字符串时,另一个操作数自动.toString

但当该 +一元运算符x= + '2' 时,字符串会被转化为数字
注意 += 本质上还二元

  • 如果 + 操作数是对象的话,会先调用对象的 toString() 方法(有valueOf方法则直接调用valueOf),再尝试转化为数字运算

0 * infinty => NaN

  1. 比较运算符 会试图将操作数 转化为数字 进行比较
// 经典面试题
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()

转化为布尔类型

转化为布尔类型为false的值:

0-0""undefinednullNaN
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值