浅谈JS的隐式转换

隐式转换就是在您对2个不相同的数据类型进行某些操作时,JS帮您把这2个不相同的数据类型进行一些转换,变成相同数据类型再进行操作。下面我们先介绍JS的数据类型有哪些。

JS的2大数据类型

基础数据类型(简单数据类型):
string(字符串)、number(数值)、boolean(布尔)、null(空)、undefined(定义尚未赋值)、symbol(ES6新引入的,功能是唯一的值)。

引用数据类型(复杂数据类型):
Object(对象)、array(数组)、function(函数)

既然隐式转换是2个不相同的数据类型进行某些操作时才会发生,那么这些操作有哪些,主要是进行运算和比较的时候。
在这里插入图片描述
当不是很清楚的时候可以回忆一下这张图,把2个数据类型转成什么类型,不是一定要转到数值类型,主要看你的2个数据类型到底是什么。

运算符中的隐式类型转换

运算符中的隐式类型转换。

1、 算术运算符(+、-、*、/、++、–、%…)

运算符中"+"比较特殊:它可以表示加法运算,也可以表示连接符的意思
当两个数据类型中有字符串类型的时候,"+"就是连接符,会进行字符串的拼接,把不是字符类型转换为字符串类型并进行拼接,生成一个新的字符串

其中有一个是字符串的情况

let a="abc";
let b=123;
let c=true;
let d=null;
console.log(a+b);//abc123
console.log(a+c);//abctrue
console.log(a+d);//abcnull

**运算符其他(-、*、/等)**会把双方的数据类型转换为数值类型在进行计算
这里主要记住其他类型里面有哪些可以转数值有值,

let a="ab2c";
let b="123";
let c="";
let d=null;
let e=undefined;
let f=true;
let g=false;
console.log(Number(a));//NaN
console.log(Number(b));//123
console.log(Number(c));//0
console.log(Number(d));//0
console.log(Number(e));//NaN
console.log(Number(f));//1
console.log(Number(g));//0

NaN是数值类型里面的,意思是非数的意思,如果一方转换为非数,在进行运算符-、*、/、大概率得到结果也是非数,字符串里面是纯数字的,转换后就是数值类型纯数字,不是纯数字也不为空的时候转换后就是NaN,布尔类型里面true转换为1,false转换为0。

2、关系运算符(>、<、==、!=…)

当2个数据类型中2个都是字符串类型时候,不会将其转换成数值进行比较,而是会按位比较字符串的ASCII值编码,首先比较第一位,第一比较相同比较,第二位,没有当做空字符处理,空字符串永远小于非空字符。

console.log("1">"");//true
console.log("a">"");//true
console.log("2">"22");//false
console.log("ABC">"ABD");//false

其他的时候就是转换为数值类型在进行比较,值得注意的有几个无视规则的特殊情况

console.log(null==undefined);//true
console.log(NaN==NaN);//false
console.log(NaN>0);//false
console.log(NaN<0);//false

null等于undefined,是因为undefined是null细分出来的,NaN比较狠,狠起来连自己都不认,NaN不等于自身包括它自身,同时跟其他比较都是false。

条件判断中的隐式类型转换

条件判断如if条件判断,!非(逻辑运算符),还有三目运算符:条件?表达式1:表达式2等都是把布尔值的隐式转换。这个主意是记住9个转成布尔值是false的就好,其他转布尔值都是true。
字符串3个:"",",``。数值3个0,-0,NaN。除此还有null,undefined还有false本身。

对象的类型转换

对象类型在运算时进行类型转换都先调用 valueOf() 方法,再尝试 toString() 方法

var a = {
	valueOf: function() {return 42},
	toString: function() {return "4"}
}
console.log(a + "");  //42
var a = {
	/* valueOf: function() {return 42}, */
	toString: function() {return "4"}
}
console.log(a + ""); //4

这里2段代码是重写valueOf() 方法跟toString() 方法,第一段是valueOf() 方法跟toString()方法 都在,并且都有返回值的时候,打印的是valueOf() 方法返回值。第二段是注释了valueOf() 方法,只留了toString() 方法时,返回的toString() 方法的返回值。说明一般先调用valueOf() 方法,如果没有再调用toString()方法 。然后就接着上面的内容接着判断就ok。

let a = [1, 2];
let b = [2];
let c = [4];
console.log(a + "");//1,2
console.log(b + c);//24
console.log(Number([]));//0

这次先浅谈到这里,如果上面有不对的地方或者需要补充欢迎各位大神指点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值