JavaScript隐式数据类型转换
隐式类型转换
非字符串到字符串的类型转换
加号运算符
加号运算符( + )即能用于数字加法,也能用于字符串拼接。
例子:
console.log("52" + "0"); //输出:"520"
console.log("52" + 0); //输出:"520"
console.log(52 + 0); //输出:52
那么,JavaScript 是怎样来判断我们要执行哪种操作的呢?
根据 ES5 规范,如果某个操作数是字符串或者能够转换为字符串的话,+ 将进行拼接操作。其中,"能够转换为字符串"的操作主要是针对对象而言,当某个操作数是对象的时候,会首先检查该对象能否通过 valueOf() 方法返回基本类型值,如果不能,就转而调用 toString() 方法。通过以上两个步骤,如果可以得到字符串,那么+ 也将进行拼接操作,否则执行数字加法。
例子:
//某个操作数是字符串的情况
console.log("" + 1); //输出:"1"
console.log("" + true); //输出:"true"
console.log("" + "love"); //输出:"love"
console.log("" + null); //输出:"null"
console.log("" + undefined); //输出:"undefined"
console.log("" + [3, 4]); //输出:"3,4"
//操作数能够转换为字符串的情况
console.log([1, 2] + 1); //输出:"1,21"
console.log([1, 2] + true); //输出:"1,2true"
console.log([1, 2] + "love"); //输出:"1,2love"
console.log([1, 2] + null); //输出:"1,2null"
console.log([1, 2] + undefined); //输出:"1,2undefined"
console.log([1, 2] + [3, 4]); //输出:"1,23,4"
*在进行拼接操作的时候,也会将另一个操作数隐式转换为字符串,这个隐式转换和使用 String() 方法之间有一个细微差别需要注意:隐式转换会对操作数首先调用 valueOf() 方法,然后通过 toString() 方法将返回值转换为字符串,而使用 String() 方法则是直接调用 ToString()。
例子:
var o = {
valueOf: function() {
return 11;
},
toString: function() {
return 22;
}
};
console.log(o + ""); //输出:"11"
console.log(String(o)); //输出:"22"
非数字到数字的类型转换
加号运算符
加号运算符( + )可以把任何数据类型转换为数字,转换规则与 Number() 方法相同。
例子:
console.log(+true); //输出:1
console.log(+10); //输出:10
console.log(+null); //输出:0
console.log(+undefined); //输出:NaN
console.log(+"123"); //输出:123
console.log(+"01"); //输出:1
console.log(+"1.1"); //输出:1.1
console.log(+""); //输出:0
console.log(+"love"); //输出:NaN
console.log(+{
name: "Tom"
}); //输出:NaN
console.log(+[1, 2]); //输出:NaN
console.log(+[999]); //输出:999
console.log(+new Date); //以微秒为单位的数字时间
减号运算符
减号运算符( - )和加号运算符作用一样,并且它还会反转数字的正负号。
例子:
console.log(-true); //输出:-1
console.log(-10); //输出:-10
console.log(-null); //输出:-0
console.log(-undefined); //输出:NaN
console.log(-"123"); //输出:-123
console.log(-"01"); //输出:-1
console.log(-"1.1"); //输出:-1.1
console.log(-""); //输出:-0
console.log(-"love"); //输出:NaN
console.log(-{
name: "Tom"
}); //输出:NaN
console.log(-[1, 2]); //输出:NaN
console.log(-[999]); //输出:-999
console.log(-new Date); //以微秒为单位的数字时间
由于 – 会被当作递减运算符来处理,所以我们应该像 - -“520” 这样,在中间加一个空格来撤销反转,得到正确的数字。
例子:
console.log(- -true); //输出:1
console.log(- -null); //输出:0
console.log(- -"123"); //输出:123
也可以使用 a - 0 的形式,将数据类型转换为数字。
例子:
console.log(true - 0); //输出:1
console.log(null - 0); //输出:0
console.log("520" - 0); //输出:520
console.log("" - 0); //输出:0
console.log([999] - 0); //输出:999
console.log([2] - [1]); //输出:1
console.log(new Date - 0); //以微秒为单位的数字时间
*a * 1 和 a /1 的形式也能将数据类型转换为数字,只是不太常见。
非布尔值到布尔值的类型转换
逻辑非运算符
逻辑非运算符( ! )可以把任何数据类型转换为布尔值,转换规则与 Boolean() 方法相同,一般会连续用两个叹号( !! ),因为第二个叹号会将结果反转回原值。
例子:
console.log(!!undefined); //输出:false
console.log(!!null); //输出:false
console.log(!!false); //输出:false
console.log(!!0); //输出:false
console.log(!!-0); //输出:false
console.log(!!NaN); //输出:false
console.log(!!""); //输出:false
console.log(!![]); //输出:true
console.log(!!{}); //输出:true
逻辑或和逻辑与运算符
逻辑或( || )和逻辑与( && )运算符的返回值并不是布尔类型,而是两个操作数其中一个的值(且仅一个)。转换规则如下:
1、逻辑或和逻辑与首先会对第一个操作数执行条件判断,如果其不是布尔值,就先使用 Boolean() 方法进行类型转换,然后再执行条件判断。
2、对于 || 来说,如果条件判断结果为 true 就返回第一个操作数的值,如果为false 就返回第二个操作数的值。
3、&& 则相反,如果条件判断结果为 true 就返回第二个操作数的值,如果为 false 就返回第一个操作数的值。
例子:
console.log("hello" || "love"); //输出:hello
console.log("" || "love"); //输出:love
console.log(1 && "love"); //输出:love
console.log(0 && "love"); //输出:0
逻辑或常见的用法就是设置参数的默认值:
例子:
function fn(str) {
str = str || "world";
console.log(str);
}
fn(); //输出:world
fn("love"); //输出:love
*这种用法很常见,但是如果传入的参数本身就可以被转换为 false ,那就没办法输出想要的值。
例子:
function fn(str) {
str = str || "world";
console.log(str);
}
fn(0); //输出:world
*改进方法就是加上更明确的条件判断,或者转而使用 ? : 三元表达式。
例子:
function fn(str) {
if (str) {
str = str || "world";
}
console.log(str);
}
fn(0); //输出:0
逻辑与可以简化类似于 if (true) { fn() } 这样的条件判断语句:
例子:
常规写法:
var str = "love";
if (str) {
console.log(str); //输出:"love"
}
简化写法:
var str = "love";
str && console.log(str);
//输出:"love"
*只有在条件判断 str 通过时才会执行后面的语句。如果条件判断未通过,后面的语句就会悄然终止。
下面列举的情况都会发生布尔值隐式类型转换:
(1) if () 语句中的条件判断表达式;
(2) for ( … ; … ; … ) 语句中的条件判断表达式(第二个);
(3) while () 和 do…while() 循环中的条件判断表达式;
(4) ? : 中的条件判断表达式;
例子:
var n = 1,
s = "hello",
o = null;
if (n) {
console.log("love"); //输出:"love"
n = 0;
};
while (s) {
console.log("love"); //输出:"love"
s = "";
};
console.log(o ? "hello" : "love"); //输出:"love"
o = {
name: "Tom"
};
如有错误,欢迎指正,本人不胜感激。
共同学习,写下你的评论
评论加载中...
作者其他优质文章