一文看懂Js隐式转换

2019-12-04  本文已影响0人  周末不敲键盘

隐式转换介绍:

什么玩意
在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算!

隐式转换规则:

1.转成string类型:+(字符串连接符)
2.转成number类型:++/--(自增自减运算符)+ - * %(算术运算符)> >= < <= != == === !==(关系运算符)
3.转成boolean类型:!(逻辑非运算符)
(一)字符串运算符跟算术运算符隐式转换规则混淆
  console.log(1+"true")     //'1true'
  //+是字符串连接符:String(1)+true = '1true'
  console.log(1+true)       //2
  //+是算术运算符:1+Number(true) = 1+1 =2
  console.log(1+undefined)  //NaN
  //+是算术运算符:1+Number(undefined) = 1+NaN
  console.log(1+null)       //1
  //+是算术运算符:1+Number(null) = 1+0 =1
(二)关系运算符
  console.log(1+"true")     //'1true'
  //+是字符串连接符:String(1)+true = '1true'
  console.log(1+true)       //2
  //+是算术运算符:1+Number(true) = 1+1 =2
  console.log(1+undefined)  //NaN
  //+是算术运算符:1+Number(undefined) = 1+NaN
  console.log(1+null)       //1
  //+是算术运算符:1+Number(null) = 1+0 =1
(三)逻辑非隐式转换与关系运算符隐式转换搞混淆
  //空数组的toString()方法会得到空字符串,而空对象的toString()方法会得到[object Object],前后两个o大小有区别
  //1.关系运算符:将其他数据类型转换成数字
  //2.逻辑非:将其他数据类型使用Boolean()转成布尔类型
  //以下八种情况转换为布尔类型都会得到false---(0,-0,NaN,unfefined,null,'',false,document.all())

  console.log([] == 0)    //true
  //原理:[].valueOf().toString()结果为空字符串 Number('') == 0

  console.log(![] == 0)   //true
  //原理:本质是'![]'逻辑非表达式结果与 0 比较关系
  //逻辑非优先级高于关系运算符![] = false(空数组转换boolean值为true,然后取反得到false)
  //Number(false) = 0

  console.log([] == ![])  //true
  //原理:本质是[] 与 '![]'逻辑非表达式结果比较
  //(1)[].valueOf().toString() = ''
  //(2)![] =false
  //(3)NUmber('') == NUmber(false)

  console.log([] == [])   //false
  //引用类型数据存贮在堆中,比较的是存储地址,所以两者不相等

  console.log({} == {})   //false 同上

  console.log({} == !{})  //false
  //本质:{}与!{}这个逻辑非表达式作比较
  //(1){}.valueOf().toString() = '[object Object]'
  //(2)Number('[object Object]') = NaN
  //(3)Number(false) = 0
应用:
  //复杂数据类型在隐式转换时先转成String,然后在转成Number运算
  //先使用valueOf()方法获取原始值,如果原始值不是number类型,则使用toString()方法转换成string
  //再将string转成number运算

  console.log([1,2] == '1,2')           //true
  console.log({} == '[object Object]')  //true

//当a满足什么条件的时候,控制台可以输出为1

  var a = '?';
  if(a ==1 && a==2 &&a ==3){
    console.log(1)
  }

  var a = {
    i:0,
    valueOf:function(){
      return ++a.i
    }
  }

  var a = {
    i:0,
    toString:function(){
      return ++a.i
    }
  }
上一篇 下一篇

猜你喜欢

热点阅读