前言
通过第一篇文章我们已经知道了js中的数据类型,可回顾 js数据类型
一、把其他数据类型转化为Number
首先要了解什么时候会需要把数据转化为number
1.一般用于浏览器的隐式转换中
@1、数学运算
@2、isNaN检测
@ ==
对应的规则:
@1 字符串转换为数字:空字符串变为0,如果出现任何非有效数字字符,结果都是NaN
@2 把布尔转换为数字:true->1 false->0
@3 null->0 undefined->NaN
@4 Symbol无法转换为数字,会报错:Uncaught TypeError: Cannot convert a Symbol value to a number
@5 BigInt去除“n”(超过安全数字的,会按照科学计数法处理)
@6 把对象转换为数字:
+ 先调用对象的 Symbol.toPrimitive 这个方法,如果不存在这个方法
+ 再调用对象的 valueOf 获取原始值,如果获取的值不是原始值
+ 再调用对象的 toString 把其变为字符串
+ 最后再把字符串基于Number方法转换为数字
XXX[Symbol.toPrimitive]的用法:
xxx[Symbol.toPrimitive](hint){
// hint:'number' / 'string' / 'default'
// + number:获取当前对象的数字类型的原始值
// + string:获取当前对象的字符串类型的原始值
// + default:根据操作获取数字或者字符串类型的原始值
}
根据这一转换规则我们有些时候可以自己来重写对象转换的内部方法
例如:
let obj = {
name: 'zhufeng',
age: 12,
[Symbol.toPrimitive](hint) {
let result;
switch (hint) {
case 'number':
result = 0;
break;
case 'string':
result = JSON.stringify(obj);
break;
default:
result = "";
}
return result;
}
};
console.log(Number(obj)); // hint:"number"
console.log(String(obj)); // hint:"string"
console.log(10 + obj); // hint:"default"
console.log(10 - obj); // hint:"number"
Array.prototype[Symbol.primitive] = function(){} …也类似可以重写数组的该方法
2、 parseInt([val],[radix]) 内部数据转化
parseFloat([val]) 转化规则
- 一般用于手动转换
- 规则:[val]值必须是一个字符串,如果不是则先转换为字符串;然后从字符串左侧第一个字符开始找,把找到的有效数字字符最后转换为数字「一个都没找到就是NaN」;遇到一个非有效数字字符ÿ