跳转至

JS隐式类型转换

由于JS是解释型语/即时编译型语言,并且具有灵活、宽容的写法,所以在一些操作符下其数据类型会做一下类型转换再计算而不是报错。

if(xxx)判断、==、+ 都是比较常见的存在隐式类型转换的操作

🌰 :

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;

1. if 判断

对于括号里的表达式,会被强制转换为布尔类型

类型 结果
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)
}

2. + 操作符

  • 在两个操作数都是数字的时候,会做加法运算
  • 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
  • 在参数有对象的情况下会调用其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 

3. == 操作符

对于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方法获取结果。 都没有则报错