有趣的 JS 隐式转换
JavaScript 作为一门弱类型语言,它的数据类型是非常的弱的!
在使用算术运算符时,运算符两边的数据类型可以是任意的值,比如一个字符串可以和数字相加。之所以不同的数据类型之间可以做运算,是因为 JavaScript 引擎在运算之前会悄悄的把它们进行隐式类型的转换。
数值类型和布尔类型的相加
2 + true;
输出:3
结果就变成数值类型,如果在一些强类型语言中,那就会出现报错。在 JS 中,如果字符串和数字相加都不会报错,而是自动的进行相应的类型转换。
像 “+”、“-”、“*”、“/” 。但是 “+” 有所不同,有时候是算数运算符,有时候是字符串连接符号,要看具体的情况。
如果字符串和数字相加,JavaScript 会自动把数字转换成字符,不管数字在前还是字符串在前面。
"1" + 2;
输出:"12"
2 + "1";
输出:"21"
字符串和数字相加结果是字符串
字符串和数字相加结果是字符串
字符串和数字相加结果是字符串
重要的事情说三遍!!!
上面我们说的是两项相加,那如果是三项呢?
1 + 2 + "3";
输出:"33"
这边我们就要遵循从左往右的运算规律了,上面的式子等价于:
(1 + 2) + "3";
输出:"33"
但要注意它与
1 + "2" + 3;
输出:"123"
是不一样的!!!
隐式类型转换,有时候会隐藏一些错误,比如 null 会转换成 0,undefined 会转换成 NaN。需要注意的是 NaN 和 NaN 是不相等的,如下:
var x = NaN;
x === NaN;
输出:false
虽然 JavaScript 提供了 isNaN 来检测某个值是否为 NaN,但是这也不太精确,因为在调用 isNaN 函数之前,本身就存在了一个隐式转换的过程,它会把那些原本不是 NaN 的值转换成 NaN,如下:
isNaN("foo");
输出:true
isNaN(undefined);
输出:true
isNaN({});
输出:true
isNaN({ valueOf: "foo" });
输出:true
上面代码,我们使用 isNaN 来测试后,发现字符串、undefined,甚至对象,结果都返回真,但是我们总不能说它们也是 NaN 吧,总而言之得出的结论是:isNaN 检测 NaN 并不可靠!
关注文教Crazy,持续更新,敬请期待!
领取专属 10元无门槛券
私享最新 技术干货