关于类型转换那些事儿

384 阅读4分钟

显式类型转换

数字类型转换

将其他类型转换为数字类型

Number()

注意两点:

  1. 引用类型转换为数字类型,会先默认调用toString方法将其转换为字符串,然后再将字符串转化为数字
  2. 对于非有效的字符串会转换为NaN
  3. undefined会转换为NaN
转换类型转换值转换结果
number1010
nullnull0
string''0
booleantrue1
booleanfalse0
array[]0
array[1,2]NaN
非有效string'123abc'NaN
undefinedundefinedNaN

你可会疑惑对于不同类型的toString方法到底会返回什么?

请见我的另一篇文章toString方法的调用

parseInt()/parseFloat

  • 对于String类型而言,它会从左到右依次查找有效的数字字符,直到遇到非有效的字符就停止,并返回有效的数字
  • 对于非String类型而言,先要将其转化为String类型再进行检索
  • 若最终都为无效,则返回NaN
let str = '12.3abc';
let str1 = 'abc123';
parseInt(str);//12
parseFloat(str);//12.3
parseInt(true);//NaN
parseInt(str);//NaN

注意NaN是number类型

字符串类型换

将其他类型转换为字符串类型

String()

默认调用toString方法 具体类型toString方法调用的不同返回值查看之前那篇文章

String(123);//"123"
String(true)//"true"
String(null)//报错
String(undefined)//报错
String([1,2,3])//"1,2,3"
String({})//"[object Object]"

布尔类型转换

Boolean()

将其他类型转换为布尔类型

  • 除了'',undefined,NaN,null,false,0转化为布尔类型为false之外,其余类型值转换都为true
Boolean('') ;//false
Boolean(undefined) ;//false
Boolean(null) ;//false
Boolean(NaN) ;//false
Boolean(false) ;//false
Boolean(0) ;//false
Boolean({});//true

隐式类型转换

隐式类型转换是经常搞错的问题

+运算符

一旦+运算符出现,就一定要清醒一点,因为很可能就掉坑里了

它有两个作用

字符串连接符+

运算对象超过一个,只要其中含有一个非(number,undefined、null、boolean)的值,都会先转换成字符类型,然后进行的字符串拼接

var a = 123;
var b = '567'
console.log(a+b);//123567

算术运算符+

运算对象只有一个时,是算术运算符 运算对象超过一个,运算对象中只有(number、undefined、null、boolean)时,它就是算术运算符

var a = '123';
var b = 124;
var c = 'abc';
a++;//123
a>b;//false
+c;//NaN
console.log(1+true);//2
console.log(1+false);//1
console.log(1+null);//1
console.log(1+undefined);//NaN

关系运算符>

当出现大于小于比较符号时,两种情况 1.只有一边是字符串 这时会将字符串类型使用Number()转换为数字类型然后比较

console.log("2">1);//true
  1. 两边都是字符串时 这时的比较是,按照字符串的unicode编码来转成数字进行比较的
console.log("2">"10");//true
//"2"unicode编码为50  "10"的为49
//默认返回的是第一个字符的unicode编码

关系运算符==

undefined/null

console.log(undefined == null);//true
console.log(undefined == undefined);//true
console.log(null == null);//true
console.log(undefined == false);//false
console.log(null == false);//false

注意:NaN和任何数据比较都不相等,包括它自己

复杂数据类型

主要按照以下规则将复杂数据类型转化为原始值

  1. 引用类型对象调用Symbol.toPrimitive,当一个对象转换为原始值时,会调用此方法

Date类型调用toString()方法

除Date类型的引用对象调用valueOf()方法

  1. 经过上面一步,若值还未转换为原始值,则调用 以第一步的调用方法返回的结果来进行第二步的转化

Date类型->toString->Number

除Date类型 -> Number -> toString

  1. 经过上面俩步,还未转化为原始值的话,就会抛出错误
console.log([1,2] == "1,2");//true

看一道经典的题目

var a =?
if(a==1 && a==2 && a==3){
	console.log(1)
}
//a等于什么时,能够打印1

首先a肯定不是一个基本类型的值,否则它就不会等于1又等于2又等于3.

可以利用valueOf方法实现a的改变

var a = {
	i: 0,
    valueOf: function(){
    	return ++a.i;
    }
}
if(a==1 && a==2 && a==3){
	console.log(1)
}

逻辑非!

  1. 它会将其他数据使用Boolean()转成布尔类型,然后再进行逻辑运算
console.log(!{})//false

Boolean({})=>true 然后!true=> fasle

  1. 逻辑非的优先级是高于运算符的
console.log(!{} == {})//false
console.log(![] == [])//true