认识JS隐式类型转换
2018-10-11 本文已影响7人
cccccchenyuhao
先来看看几个例子
var a = true + false;
console.log(a); //1 (true转化为1,false转化为0)
if (" ") {
console.log("true");
} else {
console.log("false");
} //true 非空字符串转化为true
if ("") {
console.log("true");
} else {
console.log("false");
} //false 空字符串转化为false
var a = {
valueOf: function () {
return 1;
},
toString: function () {
return '123'
}
}
true == a // true;
因为js比较灵活和宽容,所以在一些操作符下其数据类型会做一下类型转换再计算而不是报错。
if(xxx)
判断和 ==
+
都是比较常见的存在隐式类型转换的操作,以下总结了一些规律:
+操作符
- 在两个操作数都是数字的时候,会做加法运算
- 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
- 在参数有对象的情况下会调用其valueOf或toString方法
- 在只有一个字符串参数的时候会尝试将其转换为数字
- 在只有一个数字参数的时候返回其正数值
console.log(2+4);//6
console.log("2"+"4");//"24"
console.log(2+"4");//"24"
console.log(2+new Date());//"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)"
console.log(+"4");//4
if (xxx)判断
对于括号里的表达式,会被强制转换为布尔类型
类型 | 结果 |
---|---|
Undefined | false |
Null | false |
Boolean | 直接判断 |
Number | +0, −0, 或者 NaN 为 false, 其他为 true |
String | 空字符串为 false,其他都为 true |
Object | true |
if ("hello") { //true
console.log("hello")
}
if ("") { //false
console.log('empty')
}
if (" ") { //true
console.log('blank')
}
var obj = {};
if (obj) { //true
console.log(obj)
}
==操作符
对于x == y ,js是如何判断的呢?
x | y | 结果 |
---|---|---|
null | undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any) | toNumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
otherwise | otherwise | false |
toNumber规则
type | Result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | ture -> 1, false -> 0 |
String | “abc” -> NaN, “123” -> 123 |
toPrimitive
对于 Object 类型,先尝试调用 .valueOf 方法获取结果。 如果没定义,再尝试调用 .toString方法获取结果