Javascript类型转换

189 阅读3分钟

1. 相等运算符(==)

  • 当两侧是原始类型的值

当两侧类型不同时,默认转为Number类型

true == 1    // => true
true == "1"  // => true
1 == "1"     // => true
  • 当至少一侧是对象是

将对象转为原始类型(只要是原始类型就行,不需要到具体的类型)。转换规则如下

1. 当是非Date类型的对象时,默认先调用ValueOf方法,如果返回原始值,转换结束;否则继续调用toString()方法,直到返回原始类型的值。

 var obj1 = {
   valueOf: function() {
     return "4"
   },
   toString: function() {
     return 5
   }
 }
var obj2 = {
   valueOf: function() {
     return {}
   },
   toString: function() {
     return 5
   }
}
5 == obj1  // => false
4 == obj1  // => true; 相当于4 == "4"
5 == obj2  // => true

2. 当对象是Date类型时,默认先调用toString()方法。与其他对象类型相反。

var date = new Date(2000,1,1);
// date.toString() => "Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)"
// date.ValueOf()  => 949334400000
date == 949334400000  // false
date == "Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)" // true

2. 加法运算符(+)

说明:当+作为一元运算符时,相当于调用Number()类型转换方法

  • 当两侧是原始类型时

1. 如果其中一侧是字符串,则另一侧默认转为字符串

"1" + true  // => 1true
"1" + 1     // => 11

2. 如果两侧都没有字符串类型,则全部转为数字类型

1 + true     // => 2
true + true  // => 2

注意: null 转为数字 => 0 undefined转为数字 => NaN

2 + null // => 2
2 + undefined // => NaN
  • 当至少一侧是对象类型时

转换规则和(==)完全相同

  // 1\. 普通对象
 var obj1 = {
   valueOf: function() {
     return "4"
   },
   toString: function() {
     return 5
   }
 }
var obj2 = {
   valueOf: function() {
     return {}
   },
   toString: function() {
     return 5
   }
}
1 + obj1  // => "14"
1 + obj2  // => 6

// 2\. 当对象为Date类型时
var date = new Date(2000,1,1);
// date.toString() => "Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)"
// date.ValueOf()  => 949334400000

1 + date // => "1Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)"

3. 比较运算符 (>  <   <=  >=  !=)

  • 当两侧都是原始类型的值

1. 两侧都是数值或者字符串,按照自然规律比较

"2" > "11"   // => true
2 > 11       // => false

2. 当两侧不同于上面的情况,转为数值类型进行比较

2 > "11"  // => false
true > false // => true
true > "false" // => false; "false"转为NaN
  • 当至少一侧是对象时

将对象类型转为原始类型

不同于+/==, 比较运算符中Date对象和普通对象的表现一致。即所有的对象全部默认先调用ValueOf方法,如果不能转为原始类型,再调用toString() 类型

 // 1\. 普通对象
 var obj1 = {
   valueOf: function() {
     return "4"
   },
   toString: function() {
     return 5
   }
 }
var obj2 = {
   valueOf: function() {
     return {}
   },
   toString: function() {
     return 5
   }
}
13 > obj1  // => true; 相当于13 > "4", 即13 > 4
4 > obj2  // => false

// 2\. 当对象为Date类型时
var date = new Date(2000,1,1);
// date.toString() => "Tue Feb 01 2000 00:00:00 GMT+0800 (中国标准时间)"
// date.ValueOf()  => 949334400000

date > date - 1 // true; 转number类型

4. 其他算法运算符(-  * /等)

不同于上面的三类运算符只是将对象转为原始类型就行,这里的算法运算符会指定将对象转为原始类型后,再强制转为数字类型。

 var obj1 = {
   valueOf: function() {
     return "4"
   },
   toString: function() {
     return 5
   }
 }
5 - obj1 // 1; 相当于 5 - "4", 然后 5 - 4