JS强制类型转换

137 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

强制类型转换是和非强制类型转换,强制类型转换也就是显示类型转换,在静态编译阶段就进行了转换。而强制类型转换是隐式的,在运行时进行转换。当然显式和隐式其实是个伪命题,因为你如果了解a+''会转换为字符串类型,那这个语句对你来说就是显式的。

我们平时用到的遇到的最多的就是数字和字符串之间的强制类型转换,经常发生在后端接口传送过来的接口数据、加法运算等。加法运算例如

var a = "42";
var b = "0";
var c = 42;
var d = 0;
a + b; // "420"
c + d; // 42

对于大多数同学来说这就是小菜一碟,实际情况中却要比这种情况复杂得多,看如下代码

var a = [1,2];
var b = [3,4];
a + b; // "1,23,4"

a 和 b都不是字符串,但是经过加法运算后结果竟然变成了字符串。简单来说,就是当加法运算时,会将变量转换为Number对象再调用其valueOf()属性,但是因为数组操作无法得到简单的基本类型值,所以转而进行toString操作。因此上述两个变量a,b分别变成了 "1,2" 和 "3,4" 这两个字符串拼接操作就得到了答案 "1,23,4"。

简单来说就是当加法中有一个操作数为字符串就进行字符串拼接操作,否则进行数字相加操作。由于这个机制,我们项目中的代码经常会看到 variable+"" 和 variable*1 类似的这两种操作,作用就是将变量强制转换为字符串或数字使用。

有一种特殊情况,在进行转换为字符串操作时会出现问题,当被操作数不是基本变量而是一个对象时呢。上述 var+''的操作和直接调用String(var)的操作会有什么不同,看下述代码

var a = {
 valueOf: function() { return 42; },
 toString: function() { return 4; }
};
a + ""; // "42"
String( a ); // "4"

隐式类型转换会调用valueOf()方法,而String()则是直接调用toString()方法,这个问题是在你需要定制toString时需要注意的。说到定制方法,有一个问题是什么情况下 (a==1&&a==2&&a==3) 这个判断条件是成立的呢。这里就是考察隐式转换时的判定了。我们只需要将a的valueOf方法return一个value++就可以解决了。执行a==1时调用valueOf方法使value加一,到了第二个判断a == 2就可以成立了,再次隐式转换 a==3 也就可以成立了