JS强制类型转换

显式强制类型转换

字符串和数字之间的显式转换

1
2
3
4
5
6
7
8
let a = 42;
let b = String(a);

let c = "3.14";
let d = Number(c);

console.log(b); // "42"
console.log(d); // 3.14

除了 String() 和 Number() 以外,还有其他方法:

1
2
3
4
5
6
7
8
let a = 42;
let b = a.toString();

let c = "3.14";
let d = +c;

console.log(b); // "42"
console.log(d); // 3.14

日期显式转换为数字

1
2
let d = new Date();
console.log(+d); // 1565074622713

我们下面的方法获取当前的时间戳:

1
2
3
let timestamp1 = +new Date();
let timestamp2 = new Date().getTime();
let timestamp3 = Date.now();

奇特的 ~ 运算符

~ 可以和 indexOf() 一起将结果强制类型转换:如果 indexOf() 返回 -1,~ 将其转换为假值0,其他情况一律转换为真值。

1
2
3
4
5
6
7
let a = "Hello World";
console.log(~a.indexOf("H")); // -1
console.log(~a.indexOf("lo")); // -4
console.log(~a.indexOf("ol")); // 0
if (~a.indexOf("lo")) {
// 找到匹配
}

显式解析数字字符串

1
2
3
4
let a = "42";
let b = "42px";
console.log(Number(a)); // 42
console.log(parseInt(a)); // 42

显式转换为布尔值

虽然Boolean是显式的,但并不常用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let a = "0";
let b = [];
let c = {};

let d = "";
let e = 0;
let f = null;
let g;

Boolean(a) // true
Boolean(b) // true
Boolean(c) // true

Boolean(d) // false
Boolean(e) // false
Boolean(f) // false
Boolean(g) // false

常用的是 !

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let a = "0";
let b = [];
let c = {};

let d = "";
let e = 0;
let f = null;
let g;

console.log(!!a) // true
console.log(!!b) // true
console.log(!!c) // true

console.log(!!d) // false
console.log(!!e) // false
console.log(!!f) // false
console.log(!!g) // false

隐式强制类型转换

字符串和数字之间的隐式转换

1
2
3
4
5
6
7
8
let a = "42";
let b = "0";

let c = 42;
let d = 0;

console.log(a + b); // "420"
console.log(c + d); // 42
1
2
3
let a = [1,2];
let b = [3,4];
console.log(a + b); // "1,23,4"

简单来说,如果 + 的其中一个操作数是字符串(或者经过一系列操作得到字符串),则执行字符串的拼接,否则执行数字加法。

1
2
3
let a = "3.14";
let b = a - 0;
console.log(b); // 3.14

a - 0 会将 a 强制类型转换为数字。执行减法运算,a 和 b 都需要转换为数字。

隐式转换为布尔值

  1. if() 语句中的条件判断表达式
  2. for() 语句中的条件判断表达式(第二个)
  3. while() 和 do.while() 中的条件判断表达式
  4. ? : 中的条件判断表达式
  5. 逻辑运算符 || 和 && 左边的操作数

在以上情况中,非布尔值会被隐式强制类型转换为布尔值。