在JavaScript中,我们经常需要将不同的数据类型进行转换。今天我们将来介绍如何进行各种数据类型之间的转换。
原始类型之间的转换
1. 转数字
JavaScript提供了多种将其他数据类型转换为数字的方法:
使用Number函数
-
布尔:false为0,true为1。
javascriptconsole.log(Number(false));// 0 console.log(Number(true)); // 1
-
字符串:字符串类型的数字转为原本的数字,空字符串为0,其他的字符串则为NaN。
javascriptconsole.log(Number('123')); //123 console.log(Number('')); // 0 console.log(Number('hello')); // NaN
-
若不传参,则默认为0,undefined转换为NaN,null转换为0.
javascriptconsole.log(Number());//默认0 console.log(Number(undefined)); //NaN console.log(Number(null)); // 0
使用parseInt和parseFloat函数
parseInt()函数用于将字符串转换为整数,parseFloat()函数用于将字符串转换为浮点数。
使用一元加号运算符(+)
一元加号运算符(+)可以将其他数据类型转换为数字。例如,+"10"将字符串"10"转换为数字10。
2. 转布尔
-
数字:除了0和NaN,其他所有数字都会被转换为true。
javascriptconsole.log(Boolean(1));//true console.log(Boolean(-1));//true console.log(Boolean(0));//false console.log(Boolean(NaN));//false
我们经常会看到类似这样的代码:
scssif(1){ console.log('hello'); }
实际上就是将数字1转换成了布尔类型true。
-
字符串:除了空字符串(""),其他所有字符串都会被转换为true。
javascriptconsole.log(Boolean('123'));// true console.log(Boolean(''));//false
-
若不传参,则默认为false,undefined和null转换后都为false。
javascriptconsole.log(Boolean());// 默认false console.log(Boolean(undefined));//false console.log(Boolean(null));//false
3. 转字符串
-
使用String函数:可以使用String()函数将其他数据类型转换为字符串。
javascriptconsole.log(String());// 默认'' console.log(String(undefined));// 'undefined' console.log(String(null)); // 'null' console.log(String(true)); // 'true' console.log(String(false)); // 'false' console.log(String(123)); // '123' console.log(String(NaN)); // 'NaN'
-
使用toString方法:对于数字、布尔值和对象,都可以使用toString()方法将其转换为字符串。例如,(10).toString()将数字10转换为字符串"10"。
-
使用模板字符串:使用反引号(``)包裹的模板字符串可以将其他数据类型转换为字符串。
javascriptconsole.log(`${10}`); // "10"
4. 转对象
使用Object()构造函数:
javascript
console.log(Object()); //{}
console.log(Object(null));//{}
console.log(Object(undefined));//{}
console.log(Object('hello'));// String{'hello'}
console.log(Object(123));// Number{123}
console.log(Object(true));// Boolean{true}
对象转原始类型
我们要将对象转字原始类型有obj.toString()和obj.valueOf()两种方法,对象调用toSting()方法会返回一个字符串"[object class]",其中class为得到的原始类型。
toString()在js中有多个版本:
- 数组的toString()会将数组中的所有元素转换成字符串并以逗号拼接,而不是像上面所说的"[object class]"。
- 函数的toString()会将整个函数体以字符串形式返回。
- Date的toString()会将整个Date以字符串形式返回。
而valueOf()是只对包装类生效的,我们用它去转普通的对象是转不动的:
我们定义一个字符串对象str:
再去使用valueOf(),就能得到一个字符串了:
1. 对象转布尔
: 所有的引用类型转布尔都为true。
2. 对象转字符串
:
我们首先要认识一下v8内部的一个方法ToPrimitive(),它是只供v8本身使用而我们不能使用的。当我们想要将对象转字符串时,v8内部的转换原理是ToPrimitive(obj,String):
- 判断obj是基本类型则返回
- 否则调用toString()方法,如果得到原始类型,则返回
- 否则调用valueOf()方法,如果得到原始类型,则返回
- 否则报类型错误TypeError
3. 对象转数字
转数字也一样,ToPrimitive(obj,Number),但转数字是先调用valueOf()方法:
- 判断obj是基本类型则返回
- 否则调用valueOf()方法,如果得到原始类型,则返回
- 否则调用toString()方法,如果得到原始类型,则返回
- 否则报类型错误TypeError
原理知道了,现在我们来练习一下:
javascript
console.log(Number({}));
这个的打印结果是什么呢?它实际上就是对象转数字,{}
不是基本类型也不是包装类,那么就到了第三步调用toString()方法,我们上面讲过了对象调用toString()方法会返回"[object class]", 所以此时会返回"[object Object]" ,v8的ToPrimitive()方法执行到这里就下班了,此时留下的就是Number('[object Object]'),就变成了原始类型字符串转数字了,而我们之前讲过这种情况得到的将会是NaN
。其实就是转了两次,将对象转换成原始类型,再将原始类型转换成我们想要的原始类型。
那我们再来练习一下:
javascript
console.log(String([]))
对象转字符串,[]
不是基本类型,那么到第二步调用数组的toString()方法,变成了一个空字符串''
,那么就是String(''),得到的还是空字符串''
。
一元运算符
我们想要将一个其他类型转化成数字,除了用Number(),还有其他方法,那就是用一元运算符'+'
,一元 + 运算符将其操作数转换为Number类型。比如说:
那如果是 +[]
呢?我想你现在应该知道是要将[]
转换成Number类型,那么之后的步骤你应该也清楚了,和之前的一样,空数组调用toString()方法得到空字符串,空字符串转换成Number类型为数字0。
二元运算符
二元运算符'+'
,我们可以看成是:
v1 + v2 === ToPrimitive(v1) + ToPrimitive(v2)
- 如果ToPrimitive(v1)是字符串或者ToPrimitive(v2)是字符串,则返回将不是字符串的一方转为字符串再进行拼接后的结果。
- 否则都转成Number进行加法运算。
我们来看例子: [] + {} 这个的结果是什么呢?它进行toString()转换后就是 '' + '[object Object]'
,两边都是字符串进行拼接,所以结果还是'[object Object]'。
但是,将它们的位置换一下变成 {} + [] ,如果用node执行,结果不变,用v8执行的话,结果会是0,这是怎么一回事呢?
v8会把它看成两行:
css
{}
+[]
那么执行过程就是{} => {}, +[] => 0, 所以结果会为零,这里需要注意一下,万一面试官故意挑点恶心人的题目问你,虽然两种情况都对,那你也能回答得更全面一点。
== 相等
==
也会发生隐式类型转换,而===
不会,它必须值和类型都相等才能判定为相等。
需要注意的是,官方文档上规定:
如果等号两边为Number和String或Boolean或引用类型,那么都是将其转换为Number再去判断值。
我们再来看:
两个空数组它们是两个对象,存储的地址都不一样,是不会相等的。
最后我们真正要讲的是这个东西: [] == ![]
, 如果你能正确解出这个,那么你的类型转换就毕业了。
感叹号的优先级更高,那么![]
会先转换成布尔类型false,还是判断不了,然后再变成Number类型0,现在就是判断 [] == 0
,[]
转换成''
再变成0
,所以结果是true,你答对了吗?
本文的知识点到这就讲完啦,欢迎下次再来一起学习哦ヾ(◍°∇°◍)ノ゙!!