js数据类型
- 原始值类型: number/string/boolean/null/undefined/symbol/bigint
- 对象类型:
- 标准普通对象 object {}
- 标准特殊对象 Array/Date/Math/RegExp
- 非标准特殊对象 Number/String/Boolean
- 可执行对象 function
例如:
1 -> 原始值
new Number (1) -> 非标准特殊对象
Symbol -> 创建一个唯一值
- 给对象设置唯一值属性名。 Map可以允许属性名是对象。 Symbol.toPrimitive/iterator/hasInstance/toStringTag
- vuex状态管理:在派发行为标识统一进行管理。
把其他类型转化为数字Number
隐式转化:浏览器默认转化 Number([val])
发生场景:
- 数学运算 - * / 例如:10 - '2' -> 8
- isNaN检测
- == 比较
转化规则:
- 字符串转化为数字 :空字符串 '' ->0 /'123'->123/ '2w'-> NaN
- 布尔转化为数字: true->1 false->0
- null - 0 undefined -NaN
- Symbol 无法转化报错
- BigInt 去除n
- 对象转化为数字:
- 先调用对象的Symbol.toPrimitive ,若无则进行下一步
- 再调用对象的valueOf获取原始值,若无则进行下一步
- 再调用对象的toString()将其转化为字符串, 最后再把字符串基于Number()转化为数字
// 情况1
let a = new Date()
a[Symbol.toPrimitive]
//ƒ [Symbol.toPrimitive]() { [native code] }
a[Symbol.toPrimitive]('number')
//1666186608758 相当于 Number(new Date())
// 情况3:
arr[Symbol.toPrimitive]
//undefined
arr.valueOf()
//[3]
arr.toString()
//'3'
Number('3')
//3
// 基本对象转化为数字
let obj = {}
obj[Symbol.toPrimitive]
//undefined
obj.valueOf()
//{}
obj.toString()
//'[object Object]'
Number('[object Object]')
//NaN
显示转化:Number([val])/parseInt()
parseInt([val],[radix])
- val必须是字符串,不是,要先隐式转换为字符串String([val])
- radix 进制
- 不写,或者0 默认是10 (0x->16进制)
- 有效范围:2-36之间(不在有效范围内直接返回NaN)
- 从左侧第一个字符查找符合radix进制的值,遇到不符合的结束查找。把找到的内容按照[radix]进制转换为10进制数值。
parseInt('101124r',2) -> 1011 = 1*2^3 + 1*2^1+1*2^0 = 8+2+1
把其他类型转化为字符串String
String([val]) [val].toString()不是同一个方法。
- +两边,出现字符串,进行字符串的拼接。
- +两边,一边是对象,把对象按照toPrimitive->valueOf->toString
new Date()[Symbol.toPrimitive]('default')- +'10'只出现在左边,进行数字转化
String(null) -> null
String([]) - > ''
String({}) -> '[object Object]'
把其他类型转化为布尔Boolean
五个假值:null undefined false 0 NaN。其他转成Boolean均为true
== 进行类型转化
- 对象和字符串比较,对象转字符串按照toPrimitive->valueOf->toString
- null == undefined -> true ,null/undefined和其他值都不相等
- NaN != NaN
- 对象 == 对象 比较的是堆内存地址,地址相同则相等。
- 两边类型不一样都是转化为数字进行比较的。
=== 不会隐式转化,只要类型不同,直接false
转化表:
JavaScript类型转换表,参自《JavaScript权威指南》