关于js的隐式转换

151 阅读2分钟

四则运算

+特殊,一般考虑是字符串拼接,但+XX除外,是Number(XX)的作用

1+1 => 2 
1+'1' => '11'
1+ +'1' => 3
1+[] => '1'
1+{} => '1[object Object]'
{} + 1 => 1 ({}被当成代码块解析了,({}) + 1 => '[object Object]1')
1+function(){} => '1function(){}'

其余的运算* / -都是将双方变成number进行运算

1-1 = 0
1 - '1' = 0
1 - false = 1
1 - [] = 0
1 - {} =  NaN
1 - function(){} = NaN

对象([],{},fun都是对象)会调用toPrimitive方法转基础类型。会首先调用valueof方法后未变成基础累成,在调用tostring

([]).valueof() => []
([]).toString() => ''

({}).valueof() => {}
({}).toString() => '[object Object]'

(function(){}).valueof() => function(){}
(function(){}).toString() => 'function(){}'

==比较

判断步骤如下:

  1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转换为0,而true转换为1。
  2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值。
  3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,如果得到的值不是基本类型值,则基于返回值再调用toString方法(这个过程即ToPrimitive),用得到的基本类型值按照前面的规则进行比较。
  4. 如果两个操作数都是对象,则比较他们是不是同一个对象。如果两个操作数指向同一个对象,则相等操作符返回true, 否则返回false。
  5. null 和 undefined 是相等的。
  6. 要比较相等性之前,不能将null和undefined转换成其他任何值
  7. 如果有一个操作数是NaN,则相等操作符返回false, 而不相等操作符则返回true, NaN != NaN

==比较的是number,双方都往number转就行,然后进行最后的比较(4-6除外)

1 == 1 => true
1 == '1' => true
1 == [] => false
1 == {} => false
1 == function(){} false
[] == [] => false
[1] == [1] => false
[] == ![] => true ([] == false, '' == false, '' == 0, 0 == 0)

> < 比较运算

同上,也都是双方都往number转就行 但是字符串和字符串的比较是按照 unicode 字符索引来比较

'' > false => false
'a' > false => false ('a' > 0, NaN > 0)
'b' > 'a' => true