继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

JavaScript隐式数据类型转换

为爱心太软
关注TA
已关注
手记 151
粉丝 1.4万
获赞 860

隐式类型转换

非字符串到字符串的类型转换

加号运算符

加号运算符( + )即能用于数字加法,也能用于字符串拼接。

例子:

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"
};

如有错误,欢迎指正,本人不胜感激。

打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP