js 数据类型转换 常见转化

把其他类型转化为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年的毫秒数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值