关于隐式类型转换

少数情况下,js会发生隐式类型转换,我们不注意就会引起错误,总结一下。

1.运算符的转换:

  • -,*,/,%会将操作数转换为数字去计算,但+不一样,两边纯数字会按数字相加,纯字符串会拼接,但数字和字符串也会将字符串和数字拼接起来。
      console.log("1 - '2'");
      console.log(1 - '2'); //-1
      console.log("1 * '2'");
      console.log(1 * '2'); //2
      console.log("6 / '4'");
      console.log(6 / '4'); //1.5
      console.log("6 % '4'");
      console.log(6 % '4'); //2

    
      console.log("6 + 4");
      console.log(6 + 4); //10
      console.log("6 + '4'");
      console.log(6 + '4'); //64
      console.log("'6' + '4'");
      console.log('6' + '4'); //64
      console.log("typeof'6' + '4'");
      console.log(typeof('6' + '4')); //string

2.双等号的隐式转换:

  • 1) 双等号两边只要有以便是NaN,便返回false,且他自身不相等
    
    console.log("NaN == 1");
    console.log(NaN == 1); //false
    console.log("NaN == NaN");
    console.log(NaN == NaN);//false
    console.log("undefined == NaN");
    console.log(undefined == NaN);//false

  • 2) 布尔值会转换为数字,false转换为0,true转换为1
        
    console.log('0 == false');
    console.log(0 == false);
    console.log('1 == true');
    console.log(1 == true);

  • 3) 对象的转换
    
      var a = [];
      var b = [];
      var c = {};
      var d = {};
      console.log("[] == []");
      console.log(a == b);
      console.log("[] == {}");
      console.log(a == c);
      console.log("{} == {}");
      console.log(d == c);
      console.log("[] == ![]");
      console.log(a == !b);

解析:

对于前三个的原理是一样的,当两个值都是对象 (引用值) 时, 比较的是两个引用值在内存中是否是同一个对象. 因为此 [] 非彼 [], 虽然同为空数组, 确是两个互不相关的空数组, 所以为false。

而最后一个是因为右边空数组会转化为true,取反变为false,false变为0;左边空数组变为空字符串再变为0,0==0就为true。


猜你喜欢

转载自blog.csdn.net/baibaider/article/details/79938342