JS隐式类型转换三之题目巩固

303 阅读1分钟
    true + false
    => 1 + 0
    => 1
    
    +号右边是个字符串,所以最后要转化为字符串
    true + "1"
    => 'true1'
    
    true + 1 
    => 1 + 1
    => 2
    
    +号右边是个引用类型对象,所以先把对象转化为基础类型(hint为default)
    true + {}
    => true + {}.valueOf()
    => true + {}.toString()
    => true + '[object Object]'
    => 'true[object Object]'
   
   +号右边是个引用类型数组,所以先把数组转化为基础类型(hint为default)
    true + [] 
    => true + [].valueOf()
    => true + [].toString()
    => true + ""
    => "true"
    
    2/"1"
    => 2/1
    => 2
    
    "string" + 1 + 2
    => "string1" + 2
    => "string12"
    
    1 + 2 + "string"
    => 3 + "string"
    => "3string"
    
    [1]是个引用类型数组,所以先把[1]转化为基础类型,由于>是个比较运算符,所以我们期望转化成一个number类型(hint为number)
    [1] > null
    => [1].valueOf() > null
    => [1].toString() > null
    => "1" > null
    => 1 > 0
    
    由于++是一元运算符,优先级比较高,所以这里先进行number的隐式转换
    "foo" + + "bar"
    => "foo" + "NaN"
    => "fooNaN"
    
    由于==是相等操作符,所以这里进行number的隐式转换
    "true" == true
    => NaN == 1
    => false
    
    同上
    false == "false"
    => 0 == NaN
    => false
    
    ["x"]是个引用类型数组,所以先把["x"]转化为基础类型,==的右边是string类型,所以我们期望转化成一个string类型(hint为string)
    ["x"] == "x"
    => ["x"].toString() == "x"
    => "x" == "x"
    => true
   
   当运算符两边类型相同时,不会执行类型转换,两个数组的内存地址不一样,所以返回 false
   [1,2,3] == [1,2,3]
   => fasle
   
   {}如果前置,那么表示的是对象字面量声明
   {} + [] + {} + [1]
   => +[] + {} + [1]
   => 0 + {} + [1]
   => 0 + "[object Object]" + [1]
   => "0[object Object]" + [1]
   => "0[object Object]1"
   
   同上
   {} + []
   => + []
   => + ""
   => 0
   
   {} + {}
   => "[object Object]" + "[object Object]"
   => "[object Object][object Object]"
  
   [] + {}
   => "" + "[object Object]"
   => "[object Object]"
   
   [] + []
   => "" + ""
   => ""