JavaScript/隐式类型转换

维基教科书,自由的教学读本

隐式转换概述[编辑]

Javascript执行运算符运算时,如果运算符两边的数据类型不一样,则编译器自动进行类型转换。这种自动进行的类型转换就叫隐式类型转换。

例如:1 == "", ""会被隐式转换,Number("") => 0 ==> 1==0 false

各种数据类型转换为Boolean类型规则,需要注意:[]、{}都是Object对象类型,所以转换为true。

所有的对象都继承了toString()和valueOf()方法。

  • toString()返回该对象的字符串。
  • valueOf()如果存在原始值,返回原始值,如果对象无法表示一个原始值,则返回该对象本身。

算术计算的隐式类型转换[编辑]

isNaN函数:

console.log(isNaN(undefined));
console.log(isNaN(NaN));
console.log(isNaN("a"));
//以上为true

console.log(isNaN(null));
console.log(isNaN(false));
onsole.log(isNaN(true));
console.log(isNaN(123));
console.log(isNaN("123"));

酉运算符 ++、--、+、-都是把操作数转化为number再计算。

双目运算符:+、-、*、/,隐式调用Number()。加号有一点比较特殊,当加号两边有一侧是字符串的话,那么表达式得到的就是字符串,也就是隐式调用了String()。

var a = "a" * 1;
console.log(typeof(a) + " : " + a); 
var b = 1 - "";
console.log(typeof(b) + " : " + b);
var c = "2" / null;
console.log(typeof(c) + " : " + c);
var d = "1" - 1;
console.log(typeof(d) + " : " + d);
var a = "a" + 1;
console.log(typeof(a) + " : " + a);
var b = 1 + "";
console.log(typeof(b) + " : " + b);
var c = null + "abc";
console.log(typeof(c) + " : " + c);

逻辑运算符的隐式转换[编辑]

与、 或、 非、if()条件判断,均调用了Boolean()。

大小比较的隐式转换[编辑]

比较大小的判断>、<、>=、<=,若比较符两边有一个是数字,就会进行Number转化,同时返回boolean类型的值

var a = "a" > 1;
console.log(typeof(a) + " : " + a);
var b = 1 > "";
console.log(typeof(b) + " : " + b);
var c = "2" > null;
console.log(typeof(c) + " : " + c);
var d = "1" > 1;
console.log(typeof(d) + " : " + d);

相等和不等比较的隐式类型转换[编辑]

运算符 == 两边如果一边为数值,一边为非数值。则非数值转换为数值进行比较。

  • 一个值是null,另一个是undefined,则它们相等。
  • 一个值是数字,另一个是字符串,先将字符串调用Number()转换成数字,然后使用转换后的值进行比较。
  • 一个值为布尔值,则在比较之前先将其转换为数值。
  • 一个值是对象,另一个值是数字或字符串,则调用对象的valueOf()转换为原始值,然后再进行比较。
  • 两个值都是对象,则比较它们是不是指向同一个对象
  • 其他类型之间的比较均不相等。
var a = "1" == 1;
console.log(typeof(a) + " : " + a);
var b = 0 == "";
console.log(typeof(b) + " : " + b);
var c = 0 != null;
console.log(typeof(c) + " : " + c); //why it is true?
var d = 0 == false;
console.log(typeof(d) + " : " + d);

隐式类型转换的步骤[编辑]

  • 如果隐式转换的数据类型是原始值,则直接返回原始值
  • 如果隐式转换的数据类型是引用值,则调用toPrimitive(input,preferedType)函数
  • 如果input是对象,则调用valueOf()方法。
  • 如果valueOf()返回原始值则直接返回原始值。不是则调用toString()方法。
  • toString()如果是原始值则直接返回原始值,不是则报错误。

示例[编辑]

下述各行输出均为true:

console.log([] == false);  // [] → '' → 0
console.log([] ? true : false); // [] → Boolean as true
console.log([0] == false);
console.log([0] ? true : false); // [0] → Boolean as true
console.log("0" == false);
console.log("0" ? true : false); // "0"  → Boolean as true
console.log([1] == true);
console.log([1] ? true : false); // [1] → Boolean as true
console.log("1" == true);
console.log("1" ? true : false); // "1"  → Boolean as true
console.log([2] != true);
console.log([2] ? true : false); // [2] → Boolean as true
console.log("2" != true);
console.log("2" ? true : false); // "2" → Boolean as true