把其他类型转化为Number类型
1.特定需要转换为Number的
+ Number([val])
+ parseInt/parseFloat([val])
2.隐式转换(浏览器内部默认需要先转换为Number再进行计算的)
+ isNaN([val])
+ 数学运算(特殊情况:+在出现字符串的情况下不是数学运算,是字符串拼接)
+ 在==比较的时候,有些值需要转换为数字再进行比较
把其他类型转换为数字
Number('') // 0
Number('10') // 10
Number('10px') //NaN 只要出现非有效数字结果都是NaN
Number(true) // 1
Number(false) // 0
Number(null) // 0
Number(undefined) // NaN
Number(Symbol(10)) // 报错,报类型转换错误 cannot convert a Symbol value to a number
Number(BigInt(10)) // 10
对象变为数字,应该先valueof,如果没有原始值再toString变为字符串,最后把字符串转换为数字
parseInt机制:从左侧第一个字符开始,查找有效数字字符(遇到非有效的数字字符停止查找)
再把找到的有效数字字符转换为数字,如果一个都没找到就是NaN
parseFloat比parseInt多识别一个小数点
parseInt("a1"); //NaN
parseInt("1a"); // 1
parseInt('') // NaN
parseInt(undefined); //NaN
Number('') // 0
isNaN("") //false ''隐式转换为0
parseInt(null) // NaN
Number(null) // 0
isNaN(null) // false
parseInt("12px") // 12
Number("12px") //NaN
parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null) //2.6number
//paeseInt(null) 值为NaN ,typeof NaN 值为 "number"
//加号两边出现字符串,则拼接(有特殊性),如果出现对象也可能变成字符串拼接
isNaN(Number(!!Number(parseInt("0.8")))) // false
typeof !parseInt(null) + !isNaN(null) //booleantrue
let result = 10 + false + undefined + [] + 'Tencent' + null + true + {};
console.log(result); //NaNTencentnulltrue[object Object]
//NaN任何数字都是NaN
//特殊性 加号一边出现字符串或者对象,也不一定是字符串拼接:例如++/+
//++"10"; 值为11
// 10 + []; 值为10
// 10 + ["1"];值为"101"
{} + 0; 值为 0 ,左边认为是代码块,不参与运算
//例如 function fn(){} +0
({}+0) //值为 "[object Object]0"
(function fun(){} + 0); //值为"function fun(){}0"
0 + {};值为 “0[object Object]”
({"a":"a"}) + 1; 值为“[object Object]1”
+{} //值为NaN, {}先转为[object Object],然后在转换为数字
把其他类型转换为字符串
1.能使用的办法
+ toString()
+ String
2.隐式转换
+ 加号运算的时候,如果一边出现字符串,则是字符串拼接
+ 把对象转化成数字,需要先进行toString()转换为字符串,再去转换为数字
+ 基于alert/confirm/prompt/dcument.write...这些方式输出内容,都把内容先转换为字符串,然后再输出
String(null) 值为 “null”
其他类型转换为字符串直接使用“”包起来,
只有{}普通对象调取的toString是调取的Object.prototype.toString(),不是转换为字符串而是检测数据类型,
返回的结果是[object Object]
({}).toString() 结果[object Object]
([]).toString() 结果""
([{}]).toString()结果[object Object]
({"n":1}).toString()结果[object Object]
把其他类型转换为boolean
1.基于以下方式可以把其他类型转换为布尔
+ ! 转换为布尔后取反
+ !! 转换为布尔类型
+ Boolean([val])
2.隐式转换
+ 在循环或者条件判断中,条件处理的结果就是布尔类型
规则:只有‘0、NaN、null、undefined、空字符串’五个值会变成布尔的FALSE,其余都是true
在==比较的过程中,数据转换的规则:
【类型一样的几个特殊点】
{}=={}: false 对象比较的数堆内存的地址
[] == []:false
NaN==NaN:false
【类型不一样的转换规则】
1.null ==undefined: true,但是换成===是false(因为类型不一致),剩下null/undefined和其他任何数据类型都不相等
2.字符串==对象,要把对象转换为字符串
3.剩下如果==两边的数据类型不一致,都不要转换为数字在比较
------------------------------
空串转换为数字是0
false转换为数字是0
null == 0 值为 false
[] == false 值为 true
如果两边对象不一样
对象和字符串比较则对象转换为字符串,否则转化为数字
对象==布尔 ,则都转换为数字,对象转换为数字(隐式转换),
对象转换为数字先toString转换为字符串(应该是先基于valueof获取原始值,没有原始值再去toString),再转换为数字
[]转换为字符串是'',再变成0
![] == false 值为 true
首先数组取反, 只有‘0、NaN、null、undefined、空字符串’五个值会变成布尔的FALSE,其余都是true,则[]为true,![]为false
思考:
let arr = [10.18,0,10,25,23];
arr = arr.map(parseInt);
console.log(arr); //[10, NaN, 2, 2, 11]
相当于
arr = arr.map((item,index) =>{
return parseInt(item,index);
});
parseInt(value,radix);//第二个参数为进制,不写或者为0都是认为是默认为10,
//如果是以0X开头,则认为是16,进制取值范围2-36之间,如果不在这个区间,结果是NaN
//从value左侧开始查找符合进制的字符,遇到非法字符则结束查找
== 比较
两边类型不一致会转化为一样的
对象 == 字符串,会把对象转换为字符串
剩下的都是转换为数字j
对象转数字,对象先转换判断Symbol.toPrimitive获取原始值,如果不存在,原始值一般指的是基本类型值
继续调用对象的valueof方法(基本类型、日期),如果获取的结果并不是原始值,则继续调用对象的toString方法
先转为字符串,再转换为数字
Object.prototype.valueof获取的是引用类型的值,数组、正则、函数所属类的原型上没有valueof,调用的是 Object.prototype.valueof
Date.prototype.valueof获取日期对象的原始值距离1970年的毫秒数
js 数据类型转换 常见转化
最新推荐文章于 2024-09-06 08:35:06 发布