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