关于JavaScript中的各种数据类型的简单转换。

转换为字符串

toString

可以用toString这个API将其他数据类型转换为字符串,其中也有一些特例。

1
2
3
4
5
6
7
8
var a = 1;
a.toString;
//"1"

var b = true;
b.toString;
//"true"

将数字和布尔值转化为字符串。

1
2
3
4
5
6
7
var c = null;
c.toString;
//Uncaught TypeError: Cannot read property 'toString' of null

var d = undefined;
d.toString;
//Uncaught TypeError: Cannot read property 'toString' of undefined

nullundefined并没有toString这个API,所以会报错。不可以这样使用。

1
2
3
var obj = {age : 18};
obj.toString();
//"[object Object]"

objecttoString方法并不能得到你想要的结果。除非你自己设法去编写一个自定义函数。

全局方法

使用全局方法window.String,等同于xxx.toString

1
2
3
4
5
window.String(1);
//"1"

window.String({});
//"[object Object]"

nullundefined也可以使用这个全局方法。

1
2
3
4
5
window.String(null);
//"null"

window.String(undefined);
//"undefined"

console.log

console.logAPI可以将数据输出为字符串。

1
2
console.log(1);
//1

这里console.log中的1其实是"1”,等同于

1
2
console.log((1)toString);
//1

输出结果的1其实也是"1”,这是在Chrome测试台的输出结果,没有按规则显示而已。

在很多地方,如果需要字符串的数据,会自动调取这个API。

常规转换

最简单的转换方式,与空字符串''相加+

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
1 + ''
//"1"

true + ''
//"true"

var obj = {}
obj + ''
//"[object Object]"

null + ''
//"null"

undefined + ''
//"undefined"

+如果左右两边有字符串,那总是会尽可能把结果变为字符串。

1
2
3
4
5
'1' + 1
//"11"

(1)toString() + '1'
//"11"

这样使用会出现意想不到的结果。两者是等价的。

转换为布尔值

全局方法

window.Boolean方法

1
2
3
4
5
6
7
8
window.Boolean(0);
//false

window.Boolean(1);
//true

window.Boolean({});
//true

注意要区分空字符串和有空格的字符串。

1
2
3
4
5
window.Boolean('');
//false

window.Boolean(' ');
//true

如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。

转换规则是除了下面七个值被转为false,其他值都视为true

  • 0
  • null
  • undefined
  • NaN
  • false
  • ''
  • "" 又叫做falsy值。是在Boolean上下文中认定可以转化为false的值。

常规转换

!!取反两次,对应的布尔值不变。

1
2
3
4
5
6
7
8
!!0
//false

!!null
//false

!!{}
//true

转换为数字

大概有几种方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
window.Number('105');
//105

window.parseInt('105',10);
//105
//10表示进制

window.parseFloat('1.05');
//1.05

'105' - 0;
//105

+ '105'
//105

+ '-105'
//-105

- '105'
//-105

- (- '105');
//105

关于parseInt

若不写明进制,则默认为十进制。

1
2
3
4
5
parseInt('011');
//11

parseInt('011',8);
//9

而且从第一位开始返回,若遇到无法返回的值,则自动结束。

若一位也无法返回,则为NaN

1
2
3
4
5
parseInt('1s');
//1

parseInt('ss');
//NaN