【知识点】数据类型的转换(隐式和显式)

2019-03-20  本文已影响0人  李李李李李晓华

一、前言

今天一个学生问了我一个问题,噢不对,是一堆问题,看了几遍聊天记录突然不知道该从哪里回答。
干脆按照我的感觉一点一点讲吧~
请看不懂的童鞋们多看几遍

迷茫

二、显式转换(强制转换)

关于强制转换,我在之前的文章已经讲过一部分了。
一般常用的强制转有以下几种

1) 数值转换函数

parseIntparseFloat,可以强制转换其他类型为整数或浮点数,如果遇到转换不了的,就直接转换成NaN
parseInt:

   // parseInt()方法,官方解释,将字符串转换成一个数字整型类型
   parseInt("0.23")//Number  0
   parseInt("42.454")//Number  42
   parseInt("42.45abc4")//Number  42
   parseInt("4ab2")//Number  4
   parseInt("au3.14")//Number  NaN
   
   //看到这个有人懵逼了,不是说好的转换字符串变成数字的么,怎么会有数组
   //其实先将["1","21"]转换成字符串 “1,21”,然后parseInt  就得到 1
   //其他的类型就不举例子,可以看之前的文章,数据类型的转换
   parseInt(["1","21"])//Number  1 

parseFloat:

// parseFloat()方法,官方解释,将字符串转换成一个数字浮点类型
   parseFloat("0.23")//Number  0.23
   parseFloat("42.454")//Number  42.545
   parseFloat("42.45abc4")//Number  42.45
   parseFloat("42.00")//Number  42
   parseFloat("4ab2")//Number  4
   parseFloat("au3.14")//Number  NaN
   parseFloat(["1","21"])//Number  1

parseFloat和parseInt当然还有其他用法,比如进制转换,和本文无关,不讲~

2) 强制类型转换

就是使用Number()String()Boolean()函数将其他类型强制转换为数字、字符串、布尔值。
在之前的课程已经都讲解过了。这里给大家放链接,可以自行去看。
https://www.jianshu.com/p/3c9bc54948c8

3) toString()
  • 返回相应值的字符串表现,MDN的说法是:返回一个表示该对象的字符串
  • 重点来了:每个对象都有一个 toString() 方法,当对象被表示为文本值时或者当以期望字符串的方式引用对象时,该方法被自动调用
  • 对于对象{}、Math等,toString() 返回 “[object type]”,其中type是对象类型(比如[object object]、[object Math]、[object Null]等等)。如果x不是对象,toString() 返回x应有的文本值(不是单纯的加引号,比如仔细看一下数组)。
   console.log((34).toString());//'34'
   console.log("abc".toString());//'abc'
   console.log({}.toString());//[object Object]
   console.log({"name":"lily"}.toString());//[object Object]
   console.log([].toString());//''
   console.log(["a","b",1].toString());//'a,b,1'
   console.log(["a","b",{name:"lily"}].toString());//'a,b,[object object]'
   console.log(["a","b",Math].toString());//'a,b,[object Math]'
   console.log(["a","b",undefined].toString());//'a,b,'
   console.log(["a","b",null].toString());//'a,b,'   看,其实并不是单纯的加引号,而是将其文本值取了出来
   console.log(true.toString());//'a,b,'
三、toString()和String()的区别
四、valueOf()
  • valueOf() 方法返回指定对象的原始值 (数值、字符串和布尔值)
  • valueOf() 方法通常由 JavaScript 在后台自动调用,并不显式地出现在代码中
   console.log("--------")
   console.log((34).valueOf());// number 34
   console.log("abc".valueOf());// string 'abc'
   // console.log(null.valueOf());//null没有该方法
   // console.log(undefined.valueOf());undefined没有该方法
   console.log([].valueOf());//[]  数组类型
   console.log(true.valueOf());//true  布尔类型
   console.log([1,2,"3",{name:"lily"}].valueOf());//原数组
   console.log({}.valueOf());//{} 对象类型
   console.log({name:"lily"}.valueOf());//原对象

可是说了半天,到底是再说什么????
刚才是基础,以下是重点


五、toString()和valueOf()

toString()和valueOf()这两个方法基本是不会主动的书写再代码中,而是JS 在运算的过程中自己调用

那既然刚才说了,它会自动偷偷调用toString或valueOf方法,我们何不自己对对象书写一个toString或valueOf方法,覆盖它原来的方法来测试呢?

//定义一个对象a
var a={}
给a写一个toString方法,覆盖它自带的toString方法
   a.toString=function () {
       console.log("toString方法被调用");
       return 10;
   }
给a写一个valueOf方法,覆盖它自带的valueOf方法
   a.valueOf=function () {
       console.log("valueOf方法被调用");
       return 20;
}

然后只要它偷偷调用这两个方法,就会有打印。
我们来试试吧~

   alert(a);//弹出10  打印toString方法被调用
   a+1;//打印valueOf方法被调用
   a+"";//打印valueOf方法被调用
   String(a);//打印toString方法被调用
   Number(a);//打印valueOf方法被调用
   Boolean(a)//打印valueOf方法被调用
   a>"5";//打印valueOf方法被调用

所以你发现了吗?
如果要求的是原始值那么就会调用valueOf,如果要求的是字符串那么就会调用toString。

  • alert()弹出的是字符串,所以调用toString,所以你发现alert一个对象,都是[object object]等
  • 加减乘除运算都要先使用原始值,所以要调用了valueOf的方法。
六、总结

这两个方法有意思的地方在于什么时候使用,总结如下:
1、valueOf()偏向于运算(加减乘除),toString()偏向于显示(alert)
2、强转字符串的情况下,优先调用toString()方法;强转数字的情况下优先调用valueOf()
4、正常情况下,优先调用toString()
5、在有运算操作符的情况下valueOf()的优先级高于toString(),这里需要注意的是当调用valueOf()方法无法运算后还是会再调用toString()方法


以下边的案例结束今天的内容吧

   //两个{}都参加运算,调用valueOf方法得到原始值
   //但是原始值还是不能参加运算,所以又调用toString方法得到'[object object]'
   console.log({}+{})//'[obeject object][obeject object]'

   // Math参加运算,调用valueof方法得到原始值
   //但是原始值不能运算,要转换成String,所以又调用toString得到[object math]
   //然后进行字符串拼接
   console.log(Math+3)//‘[object math]3’


   console.log({}+[])//'[obeject object]' []的valueOf后调用toString为空字符串
   console.log({}+"")//'[obeject object]'
   console.log([]+"")//''   空字符串
   console.log([]+3)//"3"

写的很仓促,有时间捋顺了会再次修改~
如有错误请指出~


拜拜,晚安
上一篇下一篇

猜你喜欢

热点阅读